¿Es posible git merge
ignorar las diferencias de final de línea?
Tal vez estoy haciendo la pregunta equivocada ... pero:
Traté de usar config.crlf input
pero las cosas se pusieron un poco desordenadas y fuera de control, especialmente cuando lo apliqué después del hecho .
Por un lado, la aplicación de esta configuración después del hecho no parece afectar a los archivos comprometidos en el repositorio antes de aplicar esta opción. Otra cosa es que, de repente, todas las confirmaciones ahora dan como resultado muchos mensajes de advertencia molestos sobre la conversión de CRLF a LF.
Para ser honesto, no me importa qué final de línea se use, personalmente prefiero el estilo Unix \n
, pero lo que sea. Lo único que me importa es git merge
ser un poco más inteligente e ignorar las diferencias en los finales de línea.
A veces tengo dos archivos idénticos, pero git los marcaría como en conflicto (y el conflicto es el archivo completo ) simplemente porque usan un carácter de final de línea diferente.
Actualizar:
Descubrí que git diff
acepta una --ignore-space-at-eol
opción, ¿sería posible dejar de git merge
usar esta opción también?
git config merge.renormalize true
Respuestas:
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
):Pero usar "
-Xignore-space-change
" también es una posibilidadjakub.g también comenta que las estrategias funcionan también con la selección de cerezas :
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
, nogit merge
.En ese momento, la pregunta ha sido formulada:
Julio C Hamano no estaba exactamente entusiasmado:
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:
c:\HOMEWARE\cmd
.merge.sh:
Comandos de configuración de Git:
git config a nivel de sistema:
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.
fuente
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
(esto funciona mucho mejor queignore-all-space
)Estaba buscando la misma respuesta y descubrí esto
Entonces, ejecutar este comando en cualquier repositorio hará el truco:
fuente
Después de leer https://stackoverflow.com/a/12194759/1441706 y https://stackoverflow.com/a/14195253/1441706
para mí, este comando funcionó perfectamente:
fuente
Como en esta respuesta: https://stackoverflow.com/a/5262473/943928
Tu podrías intentar:
git merge -s recursive -Xignore-space-at-eol
fuente
Lo que hice fue dejar todo como predeterminado (es decir, autocrlf = true), tocar todos los archivos (buscar. -Exec touch {} \;), dejar que git los vea como 'modificados' y confirmarlos, y listo. De lo contrario, siempre estará plagado de mensajes molestos o diferencias sorprendentes, o tendrá que desactivar todas las funciones de espacio en blanco de git.
Perderá la información de la culpa, pero es mejor hacerlo más temprano que tarde :)
fuente
"git merge -Xrenormalize" funciona a las mil maravillas.
fuente
No parece que esto se pueda hacer directamente, pero esta publicación sugiere una solución alternativa.
http://osdir.com/ml/git/2009-02/msg02532.html
fuente
http://stahlforce.com/dev/index.php?tool=remcrlf
Lo intenté, pero si después de la última línea en su código aún no tenía CRLF, agrega por sí solo un LF y el archivo parece cambiado en git. Aparte de eso funciona.
fuente
Ahora me parece que la mejor manera es normalizar las terminaciones de línea en ambas ramas (y commit) antes de fusionarlas.
Busqué en Google "convertir crlf a lf" y encontré esto como los primeros resultados:
http://stahlforce.com/dev/index.php?tool=remcrlf
Lo descargué y usé, parece una buena herramienta.
¡Sin embargo, asegúrese de especificar un directorio y un tipo de archivo (por ejemplo, .py), de lo contrario, podría intentar meterse con el contenido del
.git
directorio!fuente
AFAICT, (no lo he probado) podría usar
git diff
para comparar la rama que desea fusionar con el ancestro común y luego aplicar los resultadosgit apply
. Ambos comandos tienen--ignore-whitespace
opciones para ignorar los errores de final de línea y espacio en blanco.Desafortunadamente, si el parche no se aplica limpiamente, se anula toda la operación. No puede solucionar conflictos de fusión. Hay un
--reject
opción para dejar trozos inalcanzables en los.rej
archivos, lo que ayuda, pero no es lo mismo que tener los conflictos de fusión mostrados en un archivo.fuente
Despues de leer Resolver conflictos de fusión: Forzar sobrescribir todos los archivos
Finalmente resolví mi versión de este problema. Estaba tratando de obtener actualizaciones del repositorio ascendente, pero mi actual tenía problemas relacionados con CRLF y no pude fusionarme como resultado. Cabe señalar que NO HABÍA CAMBIOS LOCALES de los que tenía que preocuparme. Los siguientes pasos resolvieron mi problema:
Según las instrucciones de github sobre las horquillas de sincronización ( https://help.github.com/articles/syncing-a-fork/ ):
git fetch upstream
git reset --hard upstream/master
Mi comprensión limitada de git me dice que esto está haciendo lo que quiero: cambiar mi bifurcación (sin cambios reales no comprometidos) para obtener todos los cambios realizados en la fuente aguas arriba. Según la página de origen, este paso normalmente no debería ser obligatorio, pero el problema de CRLF lo hizo necesario.
git merge upstream/master
git push
fuente
git reset --hard upstream/master
tira tu sucursal local y la señalaupstream/master
, haciendogit merge upstream/master
un no-op?sin embargo, sugiero usar herramientas como sed para lograr las terminaciones de línea correctas y luego los archivos diff. Pasé un par de horas en diferentes proyectos con varias terminaciones de línea.
La mejor manera era:
.git
directorio) a otro directorio, cree el repositorio en él, luego agregue los archivos y confirme (debe estar en la rama maestra en el nuevo repositorio).dev
(git checkout -b dev
), confirme los archivos en esta rama y ejecútelos (si el primer proyecto está en el maestro):git diff master..dev --names-only
para ver solo los nombres de los archivos modificadosfuente