4

Мне очень нравится формат вывода 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 или аналогичного инструмента?

2 ответа2

2

Поскольку git diff --no-index принимает также две директории и сравнивает их, вы всегда можете написать скрипт-обертку, копируя ваши файлы в две временные директории.

Кроме этого, я не знаю инструмента сравнения, который принимает несколько пар файлов для сравнения. Даже diff принимает только одну пару файлов или каталог и список файлов.

1

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

Перед запуском git diff --no-index вы можете установить diff.colorMoved в конфигурации Git. В качестве альтернативы, вы можете включить параметр --color-moved вместо того, чтобы устанавливать его глобально.

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

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

У вас есть файлы в каталоге current-version , которые вы хотите сравнить с некоторыми другими файлами. Если набор файлов, с которыми вы хотите сравнить их в new-version , практически идентичен по содержанию, просто используйте предложение Jaap:

git diff --no-index current-version/ new-version/

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

Если в одной версии есть только несколько файлов, а в другой множество файлов, вот так:

┌ current-project
| ├ (various folders)
| └ src
|   ├ (various files)
|   ├ foo.c
|   └ bar.c
└ proposed-replacements
  ├ new-foo.c
  └ new-bar.c

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

Вы действительно не хотите видеть, что большинство файлов "отсутствуют" в proposed-replacements . Кроме того, вам не нужно беспокоиться о том, чтобы файлы proposed-replacements имели то же имя / путь, что и в current-project , поэтому вы оставляете их там, где они были, и помещаете их в фильтр, который включает только переименованные и измененные файлы.

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

diff --git a/current-project/src/bar.c b/proposed-replacements/new-bar.c
similarity index 87%
rename from current-project/src/bar.c
rename to proposed-replacements/new-bar.c
...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .