Как я могу узнать, из чего состоит diff-файл? - PullRequest
3 голосов
/ 04 апреля 2009

Если бы я получил файл патча, сгенерированный с чем-то вроде git diff rev^ rev или даже git show -p rev, как я могу узнать, какие коммиты выводятся?

Я не уверен, что этот вариант использования даже уместен в git, но, отмечая путь к файлу и / или номера ревизии в заголовке патча, включенного в cvs / svn, я получаю теплую расплывчатую информацию о том, что полученный мной патч, или создан, отличается от правильного источника или ревизии.

В частности, если мы рассмотрим заголовок git diff:

diff --git a/lib/blueprint/semantic_class_names.rb b/lib/blueprint/semantic_class_names.rb
index 41bd496..c17af1d 100644
--- a/lib/blueprint/semantic_class_names.rb
+++ b/lib/blueprint/semantic_class_names.rb

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

Если я проверю пару файлов и решу пойти по старому стилю с патчем, отправленным по электронной почте, я не смогу быстро перепроверить, что я разобрал нужные файлы / ревизии перед отправкой патча, который я сделал с быстрый взгляд на заголовок? Я понимаю, что ревизии не так значимы в git, как в cvs / svn из-за распределенной природы, но я единственный, кто не против увидеть хотя бы сокращенную подпись коммита файлов в заголовке?

Ответы [ 3 ]

3 голосов
/ 04 апреля 2009

Хэш, предоставленный в diff, на самом деле является хэшем для BLOB-объекта.

Таким образом, вы можете найти коммиты, содержащие BLOB-объект, используя метод, приведенный в этом вопросе: Git: Какой коммит имеет этот BLOB-объект?

1 голос
/ 04 апреля 2009

Если вы используете git show <rev>, (или git show -p <rev>), вы получите патч, который включает идентификатор фиксации, а также автора, дату и сообщение о фиксации.

$ git show rel
commit 82bf5b5df1e0308939a6e91cf4c7d2dae8088d99
Author: Brian Campbell 
Date:   Thu Mar 5 14:00:54 2009 -0500

    Update another file

diff --git a/another b/another
index 2102854..4083e0c 100644
--- a/another
+++ b/another
@@ -1 +1,3 @@
 Yet another
+
+More lines
\ No newline at end of file

Утилиты исправлений, как правило, игнорируют дополнительные элементы в начале исправления, поэтому весь вывод этого кода должен быть действительным для использования в качестве исправления. Вы также можете использовать git format-patch, чтобы получить что-то отформатированное для автоматической отправки, например, git send-email или git imap-send.

Как указывает htanata, в самом заголовке diff для отдельного файла вы видите идентификатор BLOB-объекта; в то время как вы можете использовать это, чтобы найти исправления, из которых он мог прийти, это будет медленно и не обязательно правильно. Если вам нужно сослаться на коммит, то лучше оставить заголовки, упоминающие коммит, с патчем.

0 голосов
/ 04 апреля 2009

Вы можете довольно легко выбрать коммиты, которые ввели определенный идентификатор BLOB-объекта по известному пути в дереве.

например. с blob_path, установленным на путь в дереве, на который влияет патч, и blob_sha1, являющимся сокращенным sha1 из патча (т. е. то, что сразу следует за «индексом» после строки diff в патче), этот короткий скрипт найдет commit ввел эту версию файла.

for h in $(git log --pretty=format:%H "$blob_path")
do
    test "$(git rev-parse "$h:$blob_path")" = "$(git rev-parse "$blob_sha1")" &&
        echo $h
done

Конечно, вам может потребоваться самый последний коммит, в котором еще есть версия файла, и в этом случае вы хотите, чтобы родительский коммит появился непосредственно перед ним в git log --pretty=format:%H "$blob_path".

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