git diff --no-index, но с несколькими файлами

1374
Alec

Мне очень нравится формат вывода git diff, и я часто его использую git diff --no-indexдля сравнения произвольных файлов, не связанных с git. Но, насколько я могу судить, при использовании --no-index вы можете предоставить только одну пару файлов. Я действительно хотел бы иметь возможность передавать его несколькими парами, например:

git diff --no-index a.new a.old b.new b.old 

И получите тот результат, который вы получите, запустив git diffрепо:

diff --git a/a b/a index e965047..ce01362 100644 --- a/a +++ b/a @@ -1 +1 @@ -Hello +hello diff --git a/b b/b index 2b60207..dd7e1c6 100644 --- a/b +++ b/b @@ -1 +1 @@ -Goodbye +goodbye 

Есть ли способ сделать это с помощью git diff или аналогичного инструмента?

4

2 ответа на вопрос

2
Jaap Eldering

Since git diff --no-index accepts also two directories and compare these, you could always write a wrapper script around that, copying your files into two temporary directories.

Other than that, I don't know of a diff tool that accepts multiple pairs of files to compare. Even diff only accepts a single pair of files, or a directory and a list of files.

Ох, я не знал, что он принял каталоги. Это, наверное, достаточно хорошо для меня. Я бы предпочел решение, где имена файлов не обязательно должны совпадать (то есть в двух каталогах), но я, вероятно, могу с этим смириться. Alec 8 лет назад 0
@Alec С появлением (годы спустя в v2.15) параметра diff.colorMoved в параметрах конфигурации соответствие имен файлов должно иметь меньшее значение. Все еще будут строки `+` и `-`, но они будут окрашены, чтобы показать, что они пришли откуда-то еще в том же diff. Michael 5 лет назад 0
@Michael Я пытался найти его, но я не мог найти, как делать то, что хочет OP, с помощью обычной GNU diff (1). У меня версия v3.6 (намного новее, чем упомянутая вами версия v2.15). Я могу только передать его FILE1 FILE2, а не FILE1 FILE2 FILE3 ... (попарно). Aktau 5 лет назад 0
@Aktau Версия, которую я упоминал, была для Git (и связанного с ним `git diff`). См. [Мой ответ] (https://superuser.com/a/1343927/23156) для более подробного объяснения. Michael 5 лет назад 0
Спасибо за ответ @ Майкл. Моя проблема (и проблема с OP, я думаю) состоит в том, что наши файлы не отслеживаются в Git. Нам просто нравится использовать git-diff (1) для его вывода. Aktau 5 лет назад 0
1
Michael

Это в основном две контекстно-зависимые версии ответа Jaap, каждая с бонусом.

Полные или почти полные комплекты

В каталоге A есть несколько файлов, которые вы хотите сравнить с некоторыми другими файлами. Если набор файлов, с которыми вы хотите сравнить их в B, практически идентичен по содержанию, просто установите git config --global diff.colorMoved trueи используйте предложение Jaap:

git diff --no-index A/ B/ 

«Перемещенный цвет» будет использовать другой цвет линии, когда строки, удаленные из одного места, будут отображаться в другом месте в разнице ... независимо от того, были ли они перемещены вместе с файлом или перемещены в другой файл, как в рефакторе

Конкретные файлы для сравнения

Если есть только несколько файлов в B и много файлов в A, например,

┌ A | ├ (various folders) | └ src | ├ (various files) | ├ foo.c | └ bar.c └ B ├ new-foo.c └ new-bar.c 

... вы можете попытаться сделать так, чтобы определение переименования Git сделало всю работу. Я не знаю, какая версия Git добавляет степень отслеживания переименования, которая необходима для этого (я использую v2.18). Кроме того, я провел тестирование на довольно тривиальном наборе файлов.

Вы действительно не хотите видеть, что большинство файлов «отсутствуют» в B. Кроме того, вы не хотите беспокоиться о том, чтобы дать файлам B то же имя / путь, что и в A, так что вы оставляете их везде и положить в фильтр, который включает в себя переименованные и измененные файлы.

git diff --no-index --diff-filter=RM A/ B/ 
diff --git a/A/src/foo.c b/B/new-foo.c similarity index 65% rename from A/src/foo.c rename to B/new-foo.c index dd51990..64445b1 100644 --- a/A/src/foo.c +++ b/B/new-foo.c @@ -1,4 +1,4 @@ octopus cow -dog tiger +flamingo  diff --git a/A/src/bar.c b/B/new-bar.c similarity index 87% rename from A/src/bar.c rename to B/new-bar.c ...