найти первый коммит файла в git - PullRequest
10 голосов
/ 10 февраля 2012

Ситуация: у меня есть tar.gz релиза из проекта github, но я бы хотел выяснить, из какого коммита это было взято. Похоже, он не был помечен или является очевидным из самого сообщения о коммите.

Так что я могу вычислить sha1 файлов, но хотел бы выяснить, к какому коммиту они относятся?

Вызов волшебников мерзавцев!

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Поскольку хэш, хранящийся в 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

На английском языке: переберите ревизии, которые изменили файл, в обратном порядке. Для каждой такой ревизии, отличайте версию файла от внешнего файла. Если два файла идентичны, выведите хэш версии.

Если вы хотите сделать это для целого архива , вы можете сделать то же самое, но разнести все дерево вместо одного файла (и пропустить путь к файлу в качестве аргумента git log) - используйте любые допустимые опции diff.

2 голосов
/ 10 февраля 2012

Этот метод может быть сложным из-за атрибутов файла.Предполагая, что они не изменились, или вы посмотрите, что хранит репо, убедитесь, что они одинаковы.Зафиксируйте это в хранилище, а затем посмотрите на хеш дерева.

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 содержал точно такую ​​же структуру, включая разрешения, в выводе будут показаны SHA1 коммитов, которые имеют такое же дерево.

Поиск дерева верхнего уровня SHA1 будет БЫСТРОМ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...