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

Тем не менее, в целом, процесс непрерывного внесения изменений плох, даже если вы являетесь единственным разработчиком. Это единственное, что вы должны сделать, чтобы исправить ошибки последнего коммита.

Другие вопросы по тегам