2017-02-15 4 views
1

Есть ли способ получить SHA1 файла blob (примечание: не SHA1 коммита) в формате diffstat?Как получить файл blob SHA1s в git show (diffstat)?

Что бы я хотел сделать, это сделать что-то вроде git show --stat ${commit}, но вместо того, чтобы показывать только имя файла и количество строк, добавленных/удаленных для этого фиксации, я хотел бы видеть SHA1 из blob, который соответствует к окончательному содержимому файла.

Я на самом деле ищут это в контексте более крупного скрипта, где я хотел бы накапливать BLOB SHA1s файлов, которые были изменены набором коммитов, поэтому команда с легко различимой командой «сантехника» было бы идеальным. Мне также нужна команда, которая будет работать либо с «нормальным», либо с фиксацией слияния (поэтому для сравнения используется ссылка «HEAD ^» не идеальна).

ответ

3

git diff-tree - это то, что необходимо. Несмотря на то, что указывает страница diff-format, diff-tree может принимать одиночную древовидную ссылку (например, commit SHA1 или имя ветви) и будет выполнять сравнение со всеми родителями коммита, даже если это слияние. (Так же, как мерзавец шоу делает.)

diff-format страница объясняет формат вывода, но вот несколько примеров:

$ git diff-tree --no-commit-id -r -c HEAD 
:100644 100644 163e1f7815c5ef7e371bfebd549d6e990a3faa6b 991c88a41f56a0b39dfee85046e6954731294ddb M Home.md 
:100644 100644 d40bd92ec40e486fa4fdda3e8e2740bfb0138a99 160d2d470b9226ed58697b96523a5579ac0dbb9e M building/Tests.md 

Здесь мы подавляли печать коммита SHA1 с --no-commit-id, и конкретизированы -r посмотреть на файлы в подкаталогах (поддеревьях) вместо того, чтобы просто смотреть в каталог верхнего уровня. Выходные строки, начинающиеся с двоеточия, являются файлами, которые были изменены в этой фиксации. Два SHA1 - это BLOB SHA1 в родительском коммите и конечный SHA1 blob - соответствующий содержимому файла в связанной фиксации.

-c необходим для «комбинированного» diff в случае слияния - он сообщает diff-tree, чтобы сделать запись для любого файла, который не совпадает с родительским. (То есть, только для файлов, которые были изменены с самого процесса слияния.)

$ git diff-tree --no-commit-id -r -c 2a6c4947dd0dcee69e7aca1c3a0ef92d7e5260f9 # merge commit 
::000000 100644 100644 0000000000000000000000000000000000000000 53650eaf781e1410d8bd6fa4af29748714b7f1d4 285def5637464597883c3f363d67783176f03c2e AM README.txt 
::100644 100644 100644 e7f117c2b117dc3960250442732f0d6acfc212e6 e84b192b1e394efea15804f8de66fc0c7ee87ca7 5ca0469a65e886e56e5aedeb08359ea1627e28dd MM Home.md 

Для объединения зафиксируется, есть несколько записей, соответствующих каждому родителю. Опять же, подробности о форматировании и о том, как его контролировать, см. В справочных страницах diff-format и diff-tree.

Смежные вопросы