Оновлення 2013:
Більш новітні версії git дозволяють використовувати злиття з стратегією recursive
та опцією стратегії ( -X
):
git merge -s рекурсивний -Xignore-space-at-eol
Але використання " -Xignore-space-change
" - це також можливість
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-rekursive" і застосовувати з "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 config:
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 походить звідси і використовується для імітації стилю 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):
У цей момент (натискання "повернення") відкриється DiffMerge або KDiff3, і ви самі переконаєтеся, які лінії насправді об'єднані, а які рядки ігноруються.
Попередження : файл результатів завжди буде в режимі Windows eol (CRLF) з DiffMerge ...
KDiff3 пропонує зберегти так чи інакше.