git diff --no-index, но с несколькими файлами
Мне очень нравится формат вывода 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 ответа
Поскольку git diff --no-index
принимает также две директории и сравнивает их, вы всегда можете написать скрипт-обертку, копируя ваши файлы в две временные директории.
Кроме этого, я не знаю инструмента сравнения, который принимает несколько пар файлов для сравнения. Четное diff
принимает только одну пару файлов или каталог и список файлов.
Это в основном две контекстно-зависимые версии ответа Jaap, каждая с бонусом:
Перед запуском git diff --no-index
Вы можете установить diff.colorMoved
в конфиге Git. Кроме того, вы можете включить --color-moved
вариант вместо того, чтобы устанавливать его глобально.
diff.colorMoved
Настройки используют другой цвет линий, когда строки, удаленные из одного места, отображаются в другом месте в разнице... независимо от того, были ли они перемещены внутри файла или перемещены в другой файл, как в рефакторинге.
Полные или почти полные комплекты
У вас есть несколько файлов в каталоге, 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
...