Нахождение первого фиксации файла в git
Ситуация: у меня есть tar.gz для выпуска из проекта github, но мне хотелось бы разобраться, с чего это было взято. Кажется, что это не было помечено, или это очевидно из самого сообщения фиксации.
Итак, я могу вычислить sha1 файлов, но хотел бы выяснить, какие из них принадлежат?
Вызов мастеров git!
Ответы
Ответ 1
Так как хэш файл git не только включает содержимое файла (и, теоретически, хеш-коллизии происходят так или иначе), чтобы быть уверенным, что у вас есть правильная версия файла, который вам нужен сравните содержимое.
for rev in $(git log --format=%H -- /path/to/file); do
git diff --quiet $x:/path/to/file my-current-file;
if [[ $? -eq 0 ]]; then
echo $x;
fi
done
По-английски: повторить изменения, которые изменили файл, в обратном порядке. Для каждой такой ревизии разберите версию файла там с файлом external-the-tree. Если два файла идентичны, напечатайте хеш-версию.
Если вы хотите сделать это для всего tarball, вы можете сделать то же самое, но разделить все дерево вместо одного файла (и опустить путь к файлу в качестве аргумента git log
) - использовать любые толерантные параметры diff, которые вы как.
Ответ 2
Этот метод может быть сложным из-за атрибутов файлов. Предполагая, что они не изменились или вы смотрите на то, что хранилище репо, убедитесь, что они одинаковы. Зафиксируйте это в репозитории, а затем взгляните на хэш дерева.
git show -s --pretty=format:%T HEAD
Теперь пройдите все коммиты в репо и посмотрите, есть ли у какого-либо из них дерево одного и того же хэша.
git log --all --format=%H
предоставит вам все хеши. Теперь проведите это, чтобы показать хэш дерева
git log --all --format=%H \
| xargs -n 1 git show -s --pretty='format:%H %T' \
| gerp <hash of your tree>
Если tar содержит точно такую же структуру, включая разрешения, на выходе будут отображаться SHA1s коммитов, имеющих одно и то же дерево.
Поиск дерева верхнего уровня SHA1 будет FAST.