Aggiornamento 2013:
Le versioni git più recenti autorizzano l'uso di unisci con strategia recursive
e opzione strategia ( -X
):
git merge -s ricorsive -Xignore-space-at-eol
Ma usare " -Xignore-space-change
" è anche una possibilità
jakub.g commenta inoltre che le strategie funzionano anche con la raccolta delle ciliegie :
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
Funziona molto meglio di ignore-all-space
.
Risposta originale (maggio 2009)
La patch per ignorare lo stile EOL è stato proposto nel giugno 2007 , ma solo preoccupazioni git diff --ignore-space-at-eol
e non git merge
.
Al momento, la domanda è stata posta:
Dovrebbe --ignore-space-at-eol
essere un'opzione per git-merge
?
Le fusioni sono importanti per questa funzionalità.
Quali sono le semantiche di un'unione risolta automaticamente con quelle opzioni in effetti: vengono utilizzate solo per il rilevamento della ridenominazione o, ad esempio, non contrassegniamo i conflitti solo con le modifiche agli spazi bianchi? E se non lo facciamo, quale versione accettiamo automaticamente?
Julio C Hamano non era esattamente entusiasta:
Questo è certamente allettante, ma sospetto che dovrebbe essere lasciato ai round successivi.
Ho il sospetto che introdurrebbe un concetto di due diversi tipi di diff, uno da elaborare meccanicamente (cioè usare in unione con "git-merge-recursive", e applicare con "git-am"), e un altro da ispezionare da gli umani a capire.
Spesso può essere utile deviare l'input per quest'ultimo caso, anche se l'output dal confronto dei file di input mung potrebbe non essere prontamente utilizzabile per applicazioni meccaniche.
L'idea generale, quando si tratta git merge
, è di fare affidamento sullo strumento di unione di terze parti.
Ad esempio, ho impostato DiffMerge come strumento per l'unione di Git, impostando un set di regole che consente a quello strumento di unione di ignorare eol per un determinato tipo di file.
Installazione su Windows, con MSysGit1.6.3, per sessione DOS o Git bash, con DiffMerge o KDiff3:
- imposta una directory nel tuo PERCORSO (qui:)
c:\HOMEWARE\cmd
.
- aggiungi in quella directory lo script merge.sh (wrapper per il tuo strumento di unione preferito)
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
- Dichiara il tuo wrapper di unione per Git
Comandi 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
- Verificare che autoCRLF sia falso
config git a livello di sistema:
git config ---system core.autoCRLF=false
- Prova che, quando due linee sono identiche (ma i loro caratteri eol), sia DiffMerge che KDiff3 ignoreranno quelle linee durante l'unione.
Script DOS (nota: il comando dos2unix viene da qui e viene utilizzato per simulare uno stile eol Unix. Tale comando è stato copiato nella directory menzionata all'inizio di questa risposta.):
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):
A questo punto (premendo "return"), si apriranno DiffMerge o KDiff3 e vedrai di persona quali linee vengono effettivamente unite e quali linee vengono ignorate.
Attenzione : il file dei risultati sarà sempre in modalità eol di Windows (CRLF) con DiffMerge ...
KDiff3 offre di salvare in un modo o nell'altro.