Нахождение первого фиксации файла в 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.