GitHub помнит идентификаторы фиксации?

в течение нескольких дней я переписывал install.sh файл для проекта Scrollback, и поскольку я был единственным, кто работал над этим и делал это локально, я продолжал совершать ammending ту же фиксацию, толкая время от времени к мастеру моей вилки. (Пожалуйста, игнорируйте лучшие практики здесь, я работал один).

в промежутке я помню, что по электронной почте кто-то показывает мою половину работы, URL https://github.com/sindhus/scrollback/blob/8d8f7f414383499c2ab6fec586b4c9665a41c7aa/install.sh

теперь из-за некоторой путаницы я потерял свою работу локально (думаю, rm-rf), я помню, что нажимал до этого. Так что github в какой-то момент увидел мой ребазированный идентификатор фиксации install.sh.

Как вы можете видеть, приведенный выше URL позволяет мне получить доступ к этому blob с помощью идентификатора фиксации. Однако я не могу получить доступ к нему локально, потому что это же РЕПО было принудительно.

мой вопрос как мне заставить github показать мне все идентификаторы фиксации для файла когда-либо? Все идентификаторы, которые он, возможно, знает для этого файла, независимо от пути. Если мне нужно использовать их API, я не против, но я хотел бы, чтобы некоторые идеи глубоко копались в этом.

спасибо!

4 ответов


мой вопрос Как получить github, чтобы показать мне все идентификаторы фиксации для файла когда-либо

если вы заставили нажать (git push --force) ваша пересмотренная фиксация время от времени, что фиксация 8d8f7 была заменена на более недавняя фиксация с другим SHA.

это означает, что 8d8f7 теперь является только ссылкой в reflog из репозитория GitHub, который только поддержка GitHub может дать вам доступ к.
Клонирование РЕПО не будет включите 8d8f7 в локальную историю этого клонированного РЕПО.


GitHub "reflog": push события из API событий GitHub

на самом деле ОП Синдху указывает в комментариях на "восстановление коммит на GitHub в Reflog " by Джон Энгельман:

на API событий GitHub позволяет просматривать последние события:

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

мой reflog имеет все

% 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, Version3 и т. д. вы можете сделать это

% 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

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