Обновление 2013:
Более поздние версии git авторизуются с использованием слияния со стратегией recursive
и стратегией option (-X
):
Но использование -Xignore-space-change
также возможно
jakub.g также комментирует, что стратегии работают также с выбором вишни:
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
Это работает намного лучше, чем ignore-all-space
.
До Git 2.29 (4 квартал 2020 г.) все операции слияния, которые внутренне используют рекурсивный механизм слияния, должны учитывать конфигурацию merge.renormalize
, но многие из них этого не делали.
См. commit 00906d6, совершить 8d55225, Элайджа Ньюрен (newren
).
(Объединено пользователем Junio C Hamano - gitster
- в фиксации 4339259 , 10 авг.2020 г.)
merge
: заставьте merge.renormalize
работать для всех видов использования механизмов слияния
Подписал: Элайджа Ньюрен
Команда «merge
» - не единственная, которая выполняет слияние; другие команды, такие как checkout -m
или rebase, тоже.
К сожалению, единственная область кода, которая проверяла параметр конфигурации merge.renormalize
, находилась в builtin/merge.c
, что означает, что это может повлиять только на слияние, выполняемое командой merge
.
Переместите обработку этого параметра конфигурации на merge_recursive_config()
, чтобы другие команды также могли получить от него пользу.
Оригинальный ответ (май 2009 г.)
Патч для игнорирования стиля eol был предложен в июне 2007, но это касается только git diff --ignore-space-at-eol
, а не git merge
.
Тогда был задан вопрос:
Должен ли --ignore-space-at-eol
быть опцией для git-merge
?
Эта функция имеет значение при слиянии.
Какова семантика автоматически разрешенного слияния с этими параметрами в действительности - используются ли они только для обнаружения переименования или же мы, например, не отмечаем конфликты только с заменой пробелов? А если нет, то какую версию мы примем автоматически?
Хулио Хамано не был в восторге:
Это, конечно, заманчиво, но я подозреваю, что это следует оставить на потом.
Я подозреваю, что это представит концепцию двух разных типов различий, один из которых будет обрабатываться механически (то есть использовать в слиянии с git-merge- рекурсивный и применяется с помощью git-am), а еще один должен быть проверен людьми для понимания.
Часто может быть полезно изменить входные данные для последнего случая, даже если результат сравнения измененных входных файлов может не быть легко использовать для механического применения.
Общая идея, когда дело доходит до git merge
, - полагаться на сторонний инструмент слияния.
Например, я настроил DiffMerge в качестве инструмента для слияния Git, установив набор правил strong > которые позволяют этому инструменту слияния игнорировать eol для определенных типов файлов.
Установка в Windows с MSysGit1.6.3, либо для сеанса Bash DOS или Git, с DiffMerge или KDiff3:
- установите каталог в свой PATH (здесь:
c:\HOMEWARE\cmd
).
- добавьте в этот каталог скрипт merge.sh (оболочку для вашего любимого инструмента слияния)
merge.sh:
#!/bin/sh
# Passing the following parameters to mergetool:
# local base remote merge_result
alocal=$1
base=$2
remote=$3
result=$4
if [ -f $base ]
then
#"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" "$alocal" "$base" "$remote" -m --result="$result" --title1="Mine" --title2="Merging to: $result" --title3="Theirs"
# for merge respecting eol, KDiff3 is better than DiffMerge (which will always convert LF into CRLF)
# KDiff3 will display eol choices (if Windows: CRLF, if Unix LF)
"C:/Program Files/KDiff3/kdiff3.exe" -m "$base" "$alocal" "$remote" -o "$result"
else
#there is not always a common ancestor: DiffMerge needing 3 files, BASE will be the result
#"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" "$alocal" "$result" "$remote" -m --result="$result" --title1="Mine" --title2="Merging to: $result" --title3="Theirs"
# KDiff3 however does know how to merge based on 2 files (not just 3)
"C:/Program Files/KDiff3/kdiff3.exe" -m "$base" "$remote" -o "$result"
fi
- Объявите свою оболочку слияния для Git
Команды конфигурации Git:
git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd "merge.sh \"$PWD/$LOCAL\" \"$PWD/$BASE\" \"$PWD/$REMOTE\" \"$PWD/$MERGED\"
git config --global mergetool.diffmerge.trustExitCode false
git config --global mergetool.diffmerge.keepBackup false
- Убедитесь, что autoCRLF ложь
git config на системном уровне:
git config ---system core.autoCRLF=false
- Проверьте, что, когда две строки идентичны (но имеют их eol-символы), и DiffMerge, и KDiff3 игнорируют эту строку во время слияния.
Сценарий DOS (примечание: команда dos2unix берется отсюда и используется для имитации стиля EOL Unix. команда была скопирована в каталог, упомянутый в начале этого ответа.):
C:\HOMEWARE\git\test>mkdir test_merge
C:\HOMEWARE\git\test>cd test_merge
C:\HOMEWARE\git\test\test_merge>git init
C:\HOMEWARE\git\test\test_merge>echo a1 > a.txt & echo a2 >> a.txt
C:\HOMEWARE\git\test\test_merge>git add a.txt
C:\HOMEWARE\git\test\test_merge>git commit -m "a.txt, windows eol style"
C:\HOMEWARE\git\test\test_merge>git checkout -b windows
Switched to a new branch 'windows'
C:\HOMEWARE\git\test\test_merge>echo a3 >> a.txt & echo a4 >> a.txt
C:\HOMEWARE\git\test\test_merge>git add a.txt
C:\HOMEWARE\git\test\test_merge>git commit -m "add two lines, windows eol style"
C:\HOMEWARE\git\test\test_merge>git checkout master
C:\HOMEWARE\git\test\test_merge>git checkout -b unix
Switched to a new branch 'unix'
C:\HOMEWARE\git\test\test_merge>echo au3 >> a.txt & echo au4 >> a.txt && echo au5 >> a.txt
C:\HOMEWARE\git\test\test_merge>dos2unix a.txt
Dos2Unix: Processing file a.txt ...
C:\HOMEWARE\git\test\test_merge>git add a.txt
C:\HOMEWARE\git\test\test_merge>git commit -m "add 3 lines, all file unix eol style"
[unix c433a63] add 3 lines, all file unix eol style
C:\HOMEWARE\git\test\test_merge>git merge windows
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
C:\HOMEWARE\git\test\test_merge>git ls-files -u
100644 39b4c894078a02afb9b1dfeda6f1127c138e38df 1 a.txt
100644 28b3d018872c08b0696764118b76dd3d0b448fca 2 a.txt
100644 3994da66530b4df80189bb198dcfac9b8f2a7b33 3 a.txt
C:\HOMEWARE\git\test\test_merge>git mergetool
Merging the files: a.txt
Normal merge conflict for 'a.txt':
{local}: modified
{remote}: modified
Hit return to start merge resolution tool (diffmerge):
В этот момент (нажатие возврата) откроется DiffMerge или KDiff3, и вы сами увидите, какие строки фактически объединены, а какие игнорируются.
Предупреждение: файл результатов всегда будет в режиме Windows eol (CRLF) с DiffMerge ...
KDiff3 предлагает сохранить тем или иным способом.
person
VonC
schedule
14.05.2009
git config merge.renormalize true
- person qneill   schedule 10.02.2020