Github помнит идентификаторы коммитов?
В течение нескольких дней я переписывал файл install.sh для проекта Scrollback, и, поскольку я был единственным, кто работал над этим и делал его локально, я продолжал коммитить, внося изменения в один и тот же коммит, время от времени толкая его к мастеру моего форка. (пожалуйста, игнорируйте лучшие практики здесь, я работал один).
Между тем я помню, как по электронной почте кто-то показывал мою половину работы, URL https://github.com/sindhus/scrollback/blob/8d8f7f414383499c2ab6fec586b4c9665a41c7aa/install.sh
Теперь, по какой-то путанице, я потерял свою работу локально (думаю, что rm -rf), я помню, что нажимал до этого. Так что в какой-то момент github увидел мой переблокированный идентификатор коммита install.sh.
Как видно из приведенного выше URL-адреса, я могу получить к нему доступ по идентификатору коммита. Однако я не могу получить к нему доступ локально, потому что тот же репо был форсирован.
Мой вопрос, как мне заставить github показывать мне все идентификаторы коммитов для файла КОГДА-ЛИБО? Все идентификаторы, которые он, возможно, знает для этого файла, независимо от пути. Если мне придется использовать их API, я не возражаю, но я хотел бы, чтобы некоторые идеи углубились в это.
Спасибо!
4 ответа
Мой вопрос, как мне заставить github показывать мне все идентификаторы коммитов для файла КОГДА-ЛИБО
Если вы вынуждены нажать (git push --force
) ваш пересмотренный коммит время от времени, этот коммит 8d8f7 был заменен более новым коммитом с другим SHA.
Это означает, что 8d8f7 теперь является только ссылкой в реплоге репозитория GitHub, который только поддержка GitHub может дать вам доступ к,
Клонирование репо не включало бы 8d8f7 в локальную историю этого клонированного репо.
GitHub "reflog": push-события из GitHub Events API
На самом деле, Sindhu S указывает в комментариях Джона Энгельмана" Восстановление коммита из Рефлога Гитхуба":
GitHub Events API позволяет просматривать последние события:
curl https://api.github.com/repos/<user>/<repo>/events
"PushEvent" - это то, что нужно искать.
Затем можно напрямую создать ветку на GitHub, чтобы сделать этот коммит снова видимым (потому что он больше не болтается, а ссылается на реальный объект, такой как ветка):
curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X POST -d '{"ref":"refs/heads/D-commit", "sha":"384f275933d5b762cdb27175aeff1263a8a7b7f7"}' https://api.github.com/repos/<user>/<repo>/git/refs
# JSON request
{
"ref": "refs/heads/D-commit",
"sha": "384f275933d5b762cdb27175aeff1263a8a7b7f7"
}
Возможно, вам придется использовать токен для аутентификации.
Я действительно не понял вопрос, поэтому есть какое-то решение:
Чтобы увидеть все коммиты определенного файла: git log --follow filename
,
Чтобы оформить заказ на старую версию, найдите ответ здесь
Клонируйте репо локально, затем попробуйте это в своем файле
git log --follow install.sh
Он должен показать вам идентификаторы, которые вы можете использовать на github.
Я не уверен, есть ли единственный способ получить все версии файла через исправленные коммиты. Тем не менее, reflog будет содержать информацию о более ранних, и вы можете извлечь их вручную. Пример следует.
Это мой первый коммит
echo "a" > a.txt && git add a.txt && git commit -m "Version 0"
После этого еще несколько возмещений.
% echo "aa" > a.txt && git add a.txt && git commit --amend -m "Version 1"
% echo "aaa" > a.txt && git add a.txt && git commit --amend -m "Version 2"
% echo "aaaa" > a.txt && git add a.txt && git commit --amend -m "Version 3"
% echo "aaaaa" > a.txt && git add a.txt && git commit --amend -m "Version 4"
Пока в моем логе всего одна запись
% git log --oneline a8d6c39 Версия 4
Мой рефлог имеет все
% git reflog master
a8d6c39 master@{0}: commit (amend): Version 4
cf87b8f master@{1}: commit (amend): Version 3
c45a91e master@{2}: commit (amend): Version 2
63c7f5a master@{3}: commit (amend): Version 1
f2b3336 master@{4}: commit (initial): Version 0
Итак, если вы хотите посмотреть, как выглядел ваш файл в версии 4, версии 3 и т. Д., Вы можете сделать это
% git show a8d6c39:a.txt
aaaaa
% git show cf87b8f:a.txt
aaaa
% git show c45a91e:a.txt
aaa
% git show 63c7f5a:a.txt
aa
% git show f2b3336:a.txt
a
Тем не менее, в целом, процесс непрерывного внесения изменений плох, даже если вы являетесь единственным разработчиком. Это единственное, что вы должны сделать, чтобы исправить ошибки последнего коммита.