Mise à jour 2013:
Les versions plus récentes de git autorisent l'utilisation de la fusion avec l' option de stratégie recursive
et de stratégie ( ):-X
git merge -s récursif -Xignore-space-at-eol
Mais utiliser " -Xignore-space-change
" est aussi une possibilité
jakub.g commente également que les stratégies fonctionnent également avec le tri sélectif :
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
Cela fonctionne bien mieux que ignore-all-space
.
Réponse originale (mai 2009)
Le patch pour ignorer le style eol a été proposé en juin 2007 , mais cela ne concerne que git diff --ignore-space-at-eol
, non git merge
.
À l'époque, la question a été posée:
Devrait --ignore-space-at-eol
être une option pour git-merge
?
Les fusions sont là où cette fonctionnalité compte.
Quelle est la sémantique d'une fusion auto-résolue avec ces options en vigueur - sont-elles uniquement utilisées pour la détection de changement de nom, ou ne signalons-nous pas, par exemple, les conflits avec uniquement des changements d'espaces? Et si nous ne le faisons pas, quelle version acceptons-nous automatiquement?
Julio C Hamano n'était pas vraiment enthousiaste:
C'est certes tentant, mais je pense que cela devrait être laissé à des séries ultérieures.
Je soupçonne que cela introduirait un concept de deux types différents de diffs, l'un à traiter mécaniquement (c'est-à-dire à utiliser en fusion avec "git-merge-recursive" et à appliquer avec "git-am"), et un autre à inspecter par les humains à comprendre.
Il peut souvent être utile de casser l'entrée pour ce dernier cas, même si la sortie de la comparaison de fichiers d'entrée munged peut ne pas être facilement utilisable pour une application mécanique.
L'idée générale, quand il s'agit git merge
, est de s'appuyer sur l'outil de fusion tiers.
Par exemple, j'ai configuré DiffMerge pour être l'outil de fusion Git, en définissant un ensemble de règles qui permet à cet outil de fusion d'ignorer eol pour certains types de fichiers.
Installation sous Windows, avec MSysGit1.6.3, pour une session DOS ou Git bash, avec DiffMerge ou KDiff3:
- définissez un répertoire dans votre PATH (ici:)
c:\HOMEWARE\cmd
.
- ajoutez dans ce répertoire le script merge.sh (wrapper pour votre outil de fusion préféré)
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
- Déclarez votre wrapper de fusion pour Git
Commandes 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
- Vérifiez que autoCRLF est faux
git config au niveau du système:
git config ---system core.autoCRLF=false
- Testez que, lorsque deux lignes sont identiques (mais leurs caractères eol), DiffMerge ou KDiff3 ignoreront ces lignes lors d'une fusion.
Script DOS (note: la commande dos2unix vient d'ici , et est utilisée pour simuler un style Unix eol. Cette commande a été copiée dans le répertoire mentionné au début de cette réponse.):
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):
À ce stade (en cliquant sur «retour»), DiffMerge ou KDiff3 s'ouvrira, et vous verrez par vous-même quelles lignes sont réellement fusionnées et quelles lignes sont ignorées.
Attention : le fichier résultat sera toujours en mode Windows eol (CRLF) avec DiffMerge ...
KDiff3 propose de sauvegarder d'une manière ou d'une autre.