Actualización 2013:
Las versiones más recientes de git autorizan el uso de combinación con estrategia recursive
y opción de estrategia ( -X
):
git merge -s recursive -Xignore-space-at-eol
Pero usar " -Xignore-space-change
" también es una posibilidad
jakub.g también comenta que las estrategias funcionan también con la selección de cerezas :
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
Esto funciona mucho mejor que ignore-all-space
.
Respuesta original (mayo de 2009)
El parche para ignorar el estilo EOL se propuso en junio de 2007 , pero solo concierne git diff --ignore-space-at-eol
, no git merge
.
En ese momento, la pregunta ha sido formulada:
Debería --ignore-space-at-eol
ser una opción para git-merge
?
Las fusiones son donde esta funcionalidad importa.
¿Cuáles son las semánticas de una fusión resuelta automáticamente con esas opciones vigentes? ¿Se usan solo para la detección de cambio de nombre o, por ejemplo, no marcamos conflictos con solo cambios en espacios en blanco? Y si no lo hacemos, ¿qué versión aceptamos automáticamente?
Julio C Hamano no estaba exactamente entusiasmado:
Esto ciertamente es tentador, pero sospecho que debería dejarse en rondas posteriores.
Sospecho que introduciría un concepto de dos tipos diferentes de diferencias, una para ser procesada mecánicamente (es decir, usar en combinación con "git-merge-recursive" y aplicar con "git-am"), y otra para ser inspeccionada por humanos para entender.
A menudo puede ser útil combinar la entrada para el último caso, aunque la salida de la comparación de archivos de entrada combinados puede no ser fácilmente utilizable para la aplicación mecánica.
La idea general, cuando se trata git merge
, es confiar en la herramienta de combinación de terceros.
Por ejemplo, he configurado DiffMerge para que sea la herramienta para la fusión de Git, estableciendo un conjunto de reglas que permite que esa herramienta de fusión ignore eol para cierto tipo de archivos.
Configuración en Windows, con MSysGit1.6.3, ya sea para sesión DOS o Git bash, con DiffMerge o KDiff3:
- establecer un directorio en su RUTA (aquí:)
c:\HOMEWARE\cmd
.
- agregue en ese directorio el script merge.sh (contenedor para su herramienta de combinación favorita)
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
- Declara tu contenedor de fusión para Git
Comandos de configuración de 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
- Compruebe que autoCRLF es falso
git config a nivel de sistema:
git config ---system core.autoCRLF=false
- Pruebe que, cuando dos líneas son idénticas (pero sus caracteres de eol), DiffMerge o KDiff3 ignorarán esas líneas durante una fusión.
Script DOS (nota: el comando dos2unix viene de aquí , y se usa para simular un estilo EOL de Unix. Ese comando se ha copiado en el directorio mencionado al principio de esta respuesta):
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):
En este punto (presionando "volver"), se abrirán DiffMerge o KDiff3, y verá por sí mismo qué líneas se fusionan realmente y qué líneas se ignoran.
Advertencia : el archivo de resultados siempre estará en modo Windows EOL (CRLF) con DiffMerge ...
KDiff3 ofrece guardar de una forma u otra.