Update 2013:
Neuere git Versionen mit merge mit Strategie autorisieren recursive
und Strategie - Option ( -X
):
git merge -s rekursiv -Xignore-space-at-eol
Die Verwendung von " -Xignore-space-change
" ist aber auch möglich
jakub.g auch kommentiert , dass die Strategien arbeiten auch mit Rosinenpickerei :
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
Das funktioniert viel besser als ignore-all-space
.
Ursprüngliche Antwort (Mai 2009)
Der Patch zum Ignorieren des EOL-Stils wurde im Juni 2007 vorgeschlagen , betrifft jedoch nur git diff --ignore-space-at-eol
, nicht git merge
.
Zu diesem Zeitpunkt wurde die Frage gestellt:
Sollte --ignore-space-at-eol
eine Option sein git-merge
?
Bei Zusammenführungen kommt es auf diese Funktionalität an.
Was ist die Semantik einer automatisch aufgelösten Zusammenführung mit diesen Optionen? Werden sie nur zur Erkennung von Umbenennungen verwendet oder kennzeichnen wir z. B. Konflikte nicht nur mit Leerzeichenänderungen? Und wenn nicht, welche Version akzeptieren wir automatisch?
Julio C Hamano war nicht gerade begeistert:
Das ist sicherlich verlockend, aber ich vermute, dass dies späteren Runden überlassen werden sollte.
Ich vermute, dass es ein Konzept von zwei verschiedenen Arten von Unterschieden einführen würde, von denen eine mechanisch verarbeitet werden soll (dh die Verwendung beim Zusammenführen mit "git-merge-recursive" und die Anwendung bei "git-am") und die andere von inspiziert werden soll Menschen zu verstehen.
Es kann oft nützlich sein, die Eingabe für den letzteren Fall zu mischen, obwohl die Ausgabe aus dem Vergleich von munged Eingabedateien für mechanische Anwendungen möglicherweise nicht ohne weiteres verwendet werden kann.
Die allgemeine Idee git merge
besteht darin, sich auf das Merge-Tool eines Drittanbieters zu verlassen.
Zum Beispiel habe ich DiffMerge als Tool für Git-Merge eingerichtet und einen Regelsatz festgelegt, mit dem dieses Merge-Tool eol für bestimmte Dateitypen ignorieren kann.
Setup unter Windows mit MSysGit1.6.3, entweder für DOS- oder Git-Bash-Sitzungen, mit DiffMerge oder KDiff3:
- Legen Sie ein Verzeichnis in Ihrem PATH fest (hier :)
c:\HOMEWARE\cmd
.
- Fügen Sie in diesem Verzeichnis das Skript merge.sh hinzu (Wrapper für Ihr bevorzugtes Merge-Tool).
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
- Deklarieren Sie Ihren Merge-Wrapper für Git
Git-Konfigurationsbefehle:
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
- Überprüfen Sie, ob autoCRLF falsch ist
Git-Konfiguration auf Systemebene:
git config ---system core.autoCRLF=false
- Testen Sie, ob DiffMerge oder KDiff3 diese Zeilen während einer Zusammenführung ignorieren, wenn zwei Zeilen identisch sind (aber ihre Äol-Zeichen).
DOS-Skript (Hinweis: Der Befehl dos2unix stammt von hier und wird zur Simulation eines Unix-EOL-Stils verwendet. Dieser Befehl wurde in das am Anfang dieser Antwort angegebene Verzeichnis kopiert.):
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):
An diesem Punkt (durch Drücken von "Return") wird DiffMerge oder KDiff3 geöffnet, und Sie werden selbst sehen, welche Zeilen tatsächlich zusammengeführt und welche Zeilen ignoriert werden.
Warnung : Die Ergebnisdatei befindet sich mit DiffMerge immer im Windows-EOL-Modus (CRLF).
KDiff3 bietet das Speichern auf die eine oder andere Weise an.