Кажется, что нет никаких опций для команды Git diff
, чтобы поддержать то, что вы хотите сделать. Однако вы можете использовать переменную окружения GIT_EXTERNAL_DIFF
и пользовательский сценарий (или любой исполняемый файл, созданный с использованием предпочитаемого вами языка сценариев или языка программирования) для работы с патчем.
Я предполагаю, что вы работаете в Linux; если нет, вы можете настроить эту концепцию в соответствии со своей средой. Допустим, у вас есть репозиторий Git, где HEAD
имеет файл file05
, содержащий:
line 26662: $my_array[my_key]
И файл file06
, содержащий:
line 19768: $my_array[my_key]
line 19769: $my_array[my_key]
line 19770: $my_array[my_key]
line 19771: $my_array[my_key]
line 19772: $my_array[my_key]
line 19773: $my_array[my_key]
line 19775: $my_array[my_key]
line 19776: $my_array[my_key]
Вы меняете file05
на:
line 26662: $my_array["my_key"]
И вы меняете file06
на:
line 19768: $my_array[my_key]
line 19769: $my_array["my_key"]
line 19770: $my_array[my_key]
line 19771: $my_array[my_key]
line 19772: $my_array[my_key]
line 19773: $my_array[my_key]
line 19775: $my_array[my_key2]
line 19776: $my_array[my_key]
Используя следующий скрипт оболочки, давайте назовем его mydiff.sh
и поместим его где-нибудь в нашем PATH
:
#!/bin/bash
echo "$@"
git diff-files --patch --word-diff=porcelain "${5}" | awk '
/^-./ {rec = FNR; prev = substr($0, 2);}
FNR == rec + 1 && /^+./ {
ln = substr($0, 2);
gsub("\\[\"", "[", ln);
gsub("\"\\]", "]", ln);
if (prev == ln) {
print " " ln;
} else {
print "-" prev;
print "+" ln;
}
}
FNR != rec && FNR != rec + 1 {print;}
'
Выполнение команды:
GIT_EXTERNAL_DIFF=mydiff.sh git --no-pager diff
Будет выводить:
file05 /tmp/r2aBca_file05 d86525edcf5ec0157366ea6c41bc6e4965b3be1e 100644 file05 0000000000000000000000000000000000000000 100644
index d86525e..c2180dc 100644
--- a/file05
+++ b/file05
@@ -1 +1 @@
line 26662:
$my_array[my_key]
~
file06 /tmp/2lgz7J_file06 d84a44f9a9aac6fb82e6ffb94db0eec5c575787d 100644 file06 0000000000000000000000000000000000000000 100644
index d84a44f..bc27446 100644
--- a/file06
+++ b/file06
@@ -1,8 +1,8 @@
line 19768: $my_array[my_key]
~
line 19769:
$my_array[my_key]
~
line 19770: $my_array[my_key]
~
line 19771: $my_array[my_key]
~
line 19772: $my_array[my_key]
~
line 19773: $my_array[my_key]
~
line 19775:
-$my_array[my_key]
+$my_array[my_key2]
~
line 19776: $my_array[my_key]
~
Этот вывод не показывает изменения для добавленных кавычек в file05
и file06
. Внешний скрипт diff в основном использует команду Git diff-files
для создания патча и фильтрует вывод через скрипт GNU awk
для манипулирования им. Этот пример сценария не обрабатывает все различные комбинации старых и новых файлов, упомянутых для GIT_EXTERNAL_DIFF
, и не выводит действительный патч, но этого должно быть достаточно для начала работы.
Вы можете использовать регулярные выражения Perl , Python difflib
или все, что вам удобно для реализации внешнего инструмента сравнения, который соответствует вашим потребностям.