Возможно ли для git-merge игнорировать различия в конце строки?

Вы делали f.close() в конце своей программы?

141
задан hippietrail 28 April 2011 в 21:57
поделиться

5 ответов

Обновление 2013 г .:

Более поздние версии git разрешают использование слияния со стратегией рекурсивным и стратегией параметром ( -X ):

git merge -s recursive -Xignore-space-at-eol

Но использование « -Xignore-space-change » также возможность

  • Fab-V упоминает ниже :
    git merge master -s рекурсивно -X перенормировать
    
    

jakub.g также комментирует , что стратегии также работают с выбором вишен :

git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize 

Это работает намного лучше, чем ignore-all-space .


Исходный ответ (май 2009 г.)

Патч для игнорирования стиля eol был предложен в июне 2007 г. , но он касается только git diff --ignore-space-at -eol , а не git merge .

В то время был задан вопрос:

Должен ли - ignore-space-at-eol быть вариант для git-merge ?
Эта функция имеет значение при слияниях.
Какова семантика автоматически разрешенного слияния с этими действующими параметрами - используются ли они только для обнаружения переименования, или мы, например, не помечаем конфликты только изменениями пробелов? А если нет, то какую версию мы примем автоматически?

Хулио С. Хамано не был в восторге:

Это, конечно, заманчиво, но я подозреваю, что это следует оставить на потом.
Я подозреваю, что он представит концепцию двух разных типов различий, один из которых будет обрабатываться механически (т.е. использовать в слиянии с "git-merge-recursive" и применять с "git-am"), и еще один должен быть исследован людьми для понимания.
Часто бывает полезно изменить входные данные в последнем случае, даже если результат сравнения измененных входных файлов может быть нелегко использовать для механических приложений.

Общая идея, когда дело доходит до git merge ], полагаться на сторонний инструмент слияния.

Например, я установил DiffMerge как инструмент для слияния Git, установив набор правил , который разрешает это слияние инструмент для игнорирования eol для определенных типов файлов.


Установка в Windows с MSysGit1.6.3, либо для сеанса DOS, либо Git bash, с 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 имеет значение false.

git config на системном уровне:

git config ---system core.autoCRLF=false
  • Проверьте, что, когда две строки идентичны (но их символы eol), и DiffMerge, и KDiff3 игнорируют эти строки во время слияния.

Сценарий DOS (примечание: команда dos2unix происходит отсюда и используется для имитации стиля Unix eol. Эта команда была скопирована в каталог, упомянутый в начале этого ответа.):

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):

В этот момент (нажатие «return») откроется DiffMerge или KDiff3, и вы сами увидите, какие строки фактически объединены, а какие игнорируются.

Предупреждение : файл результатов всегда будет в Windows режим eol (CRLF) с DiffMerge ...
как DiffMerge, так и KDiff3 проигнорируют эту строку во время слияния.

Сценарий DOS (примечание: отсюда берется команда dos2unix, которая используется для имитации стиля Unix eol. Эта команда была скопирована в каталог, упомянутый в начале этого ответа.):

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):

В этот момент (нажатие "return") откроется DiffMerge или KDiff3, и вы сами увидите, какие строки фактически объединены, а какие игнорируются.

Предупреждение : файл результатов всегда будет в режиме Windows eol (CRLF) с DiffMerge ...
как DiffMerge, так и KDiff3 проигнорируют эту строку во время слияния.

Сценарий DOS (примечание: отсюда берется команда dos2unix, которая используется для имитации стиля Unix eol. Эта команда была скопирована в каталог, упомянутый в начале этого ответа.):

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):

В этот момент (нажатие "return") откроется DiffMerge или KDiff3, и вы сами увидите, какие строки фактически объединены, а какие игнорируются.

Предупреждение : файл результатов всегда будет в режиме Windows eol (CRLF) с DiffMerge ...
и вы сами увидите, какие строки фактически объединены, а какие игнорируются.

Предупреждение : файл результатов всегда будет в режиме Windows eol (CRLF) с DiffMerge ...
и вы сами увидите, какие строки фактически объединены, а какие игнорируются.

Предупреждение : файл результатов всегда будет в режиме Windows eol (CRLF) с DiffMerge ...
KDiff3 предлагает тем или иным способом сэкономить.

112
ответ дан 23 November 2019 в 22:43
поделиться

Мне теперь кажется, что лучший способ - это нормализовать окончания строк в обеих ветвях (и фиксации) перед их объединением.

Я поискал в Google "преобразовать crlf в lf" и нашел это в качестве первых результатов:
http://stahlforce.com/dev/index.php?tool=remcrlf

Я загрузил его и использовал, похоже, хороший инструмент.

>sfk remcr . .py

Не забудьте указать каталог и тип файла (например, .py), иначе он может попытаться испортить содержимое каталога .git !

0
ответ дан 23 November 2019 в 22:43
поделиться

Не похоже, что это можно сделать напрямую, но этот пост предлагает обходной путь.

http://osdir.com/ml/git/2009-02/msg02532. html

1
ответ дан 23 November 2019 в 22:43
поделиться

Что я сделал, так это оставил все по умолчанию (т.е. autocrlf = true), коснулся всех файлов (find. -Exec touch {} \;), позволил git увидеть их как «измененные» и зафиксировать их обратно, и покончить с этим. В противном случае вас всегда будут мучить надоедливые сообщения или неожиданные различия, или вам придется полностью отключить git '

4
ответ дан 23 November 2019 в 22:43
поделиться

AFAICT, (я не пробовал) вы можете использовать git diff для сравнения ветви, которую вы хотите объединить, с общим предком, а затем применить результаты с помощью git apply. Обе команды имеют опции --ignore-whitespace для игнорирования ошибок окончания строки и пробелов.

К сожалению, если патч не применяется чисто, вся операция прерывается. Вы не можете исправить конфликты слияния. Существует опция --reject, позволяющая оставлять не исправленные фрагменты в файлах .rej, что помогает, но это не то же самое, что отображение конфликтов слияния в одном файле.

0
ответ дан 23 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: