git-diff para ignorar ^ M

En un proyecto donde algunos de los files contienen ^ M como separadores de nueva línea. Diffing estos files son aparentemente imposibles, ya que gitdiff lo ve como el file completo es solo una línea.

¿Cómo se diferencia uno con la versión anterior?

¿Hay una opción como "tratar ^ M como nueva línea cuando difiere"?

prompt> git-diff "HEAD^" -- MyFile.as diff --git a/myproject/MyFile.as b/myproject/MyFile.as index be78321..a393ba3 100644 --- a/myproject/MyFile.cpp +++ b/myproject/MyFile.cpp @@ -1 +1 @@ -<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate \ No newline at end of file +<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate \ No newline at end of file prompt> 

ACTUALIZAR:

ahora he escrito un guión que verifica las últimas 10 revisiones y convierte CR en LF.

 require 'fileutils' if ARGV.size != 3 puts "a git-path must be provided" puts "a filename must be provided" puts "a result-dir must be provided" puts "example:" puts "ruby gitcrdiff.rb project/dir1/dir2/dir3/ SomeFile.cpp tmp_somefile" exit(1) end gitpath = ARGV[0] filename = ARGV[1] resultdir = ARGV[2] unless FileTest.exist?(".git") puts "this command must be run in the same dir as where .git resides" exit(1) end if FileTest.exist?(resultdir) puts "the result dir must not exist" exit(1) end FileUtils.mkdir(resultdir) 10.times do |i| revision = "^" * i cmd = "git show HEAD#{revision}:#{gitpath}#{filename} | tr '\\r' '\\n' > #{resultdir}/#{filename}_rev#{i}" puts cmd system cmd end 

GitHub sugiere que debes asegurarte de usar \ n como un carácter de nueva línea en repositorys manejados por git. Hay una opción para auto-convertir:

 $ git config --global core.autocrlf true 

Por supuesto, se dice que esto convierte crlf a lf, mientras que usted quiere convertir cr a lf. Espero que esto todavía funcione …

Y luego convierte tus files:

 # Remove everything from the index $ git rm --cached -r . # Re-add all the deleted files to the index # You should get lots of messages like: "warning: CRLF will be replaced by LF in <file>." $ git diff --cached --name-only -z | xargs -0 git add # Commit $ git commit -m "Fix CRLF" 

core.autocrlf se describe en la página man .

Desarrollando en Windows, encontré este problema cuando uso git tfs . Lo solucioné de esta manera:

 git config --global core.whitespace cr-at-eol 

Esto básicamente le dice a Git que un CR al final de la línea no es un error. Como resultado, esos caracteres molestos ^M ya no aparecen al final de las líneas en git diff , git show , etc.

Parece dejar otras configuraciones como están; por ejemplo, los espacios adicionales al final de una línea todavía se muestran como errores (resaltados en rojo) en la diferencia.

(Otras respuestas han aludido a esto, pero lo anterior es exactamente cómo establecer la configuration. Para establecer la configuration para un solo proyecto, omita el --global ).

EDITAR :

Después de muchas dificultades para finalizar la línea, tuve la mejor suerte, cuando trabajaba en un equipo .NET, con estas configuraciones:

  • SIN configuration de core.eol
  • NINGUNA configuration core.whitespace
  • SIN configuration de core.autocrlf
  • Cuando ejecute el instalador de Git para Windows, obtendrá estas tres opciones:
    • Finalizar el estilo de Windows, confirmar terminaciones de línea de estilo Unix <- elegir esta
    • Realizar el process tal como está, confirmar terminaciones de línea de estilo Unix
    • Pago como está, commit as-is

Si necesita usar la configuration de espacio en blanco, probablemente debería habilitarla solo por proyecto si necesita interactuar con TFS. Solo omite el --global :

 git config core.whitespace cr-at-eol 

Si necesita eliminar algunas configuraciones core. *, La forma más fácil es ejecutar este command:

 git config --global -e 

Esto abre su file .gitconfig global en un editor de text, y puede eliminar fácilmente las líneas que desea eliminar. (O puede poner '#' delante de ellos para comentarlos).

Ver también:

 core.whitespace = cr-at-eol 

o equivalente,

 [core] whitespace = cr-at-eol 

donde el whitespace en whitespace está precedido por un carácter de tabulación .

Pruebe git diff --ignore-space-at-eol , o git diff --ignore-space-change , o git diff --ignore-all-space .

¿Por qué obtienes estos ^M en tu git diff ?

En mi caso, estaba trabajando en un proyecto que se desarrolló en Windows y usé OS X. Cuando cambié un código, vi ^M al final de las líneas que agregué en git diff . Creo que los ^M estaban apareciendo porque eran terminaciones de línea diferentes que el rest del file. Debido a que el rest del file se desarrolló en Windows, utilizó terminaciones de línea CR , y en OS X usa terminaciones de línea LF .

Aparentemente, el desarrollador de Windows no utilizó la opción " Checkout Windows-style, commit endings de línea estilo Unix " durante la installation de Git.

Entonces, ¿qué deberíamos hacer al respecto?

Puede hacer que los usuarios de Windows vuelvan a instalar git y utilicen la opción " Finalizar el estilo de Windows, confirmar los finales de línea estilo Unix ". Esto es lo que preferiría, porque veo Windows como una exception en sus caracteres de final de línea y Windows corrige su propio problema de esta manera.

Si opta por esta opción, debe sin embargo corregir los files actuales (porque todavía están usando los finales de línea CR ). Hice esto siguiendo estos pasos:

  1. Elimine todos los files del repository, pero no de su sistema de files.

     git rm --cached -r . 
  2. Agregue un file .gitattributes que .gitattributes ciertos files para usar un LF como terminaciones de línea. Pon esto en el file:

     *.ext text eol=crlf 

    Reemplace .ext con las extensiones de file que desea emparejar.

  3. Agrega todos los files nuevamente.

     git add . 

    Esto mostrará posts como este:

     warning: CRLF will be replaced by LF in <filename>. The file will have its original line endings in your working directory. 
  4. Podría eliminar el file .gitattributes less que tenga usuarios obstinados de Windows que no deseen utilizar la opción " Finalizar el estilo de Windows, confirmar los finales de línea estilo Unix ".

  5. Comprometerse y empujar todo.

  6. Elimine y compruebe los files aplicables en todos los sistemas donde se usan. En los sistemas Windows, asegúrese de que ahora usen la opción " Finalizar el estilo de Windows, confirmar los finales de línea estilo Unix ". También debe hacer esto en el sistema donde ejecutó estas tareas porque cuando agregó los files, git dijo:

     The file will have its original line endings in your working directory. 

    Puede hacer algo como esto para eliminar los files:

     git ls | grep ".ext$" | xargs rm -f 

    Y luego esto para recuperarlos con los finales de línea correctos:

     git ls | grep ".ext$" | xargs git checkout 

    Por supuesto, replace .ext con la extensión que desee.

Ahora su proyecto solo usa caracteres LF para los finales de línea, y los desagradables personajes CR nunca volverán :).

La otra opción es hacer cumplir las terminaciones de línea de estilo de Windows. También puede usar el file .gitattributes para esto.

Más información: https://help.github.com/articles/dealing-with-line-endings/#platform-all

Luché con este problema durante mucho time. Con mucho, la solución más fácil es no preocuparse por los caracteres ^ M y simplemente utilizar una herramienta visual diff que pueda manejarlos.

En lugar de tipear:

 git diff <commitHash> <filename> 

tratar:

 git difftool <commitHash> <filename> 

TL; DR

Cambie core.pager a "tr -d '\r' | less -REX" , no el código fuente

Esta es la razón por

Esos molestos ^ M que se muestran son un artefacto de la coloración y el localizador. enter image description here Es causado por less -R , una opción de buscapersonas pnetworkingeterminada de git. (El buscapersonas pnetworkingeterminado de git es less -REX )

Lo primero a tener en count es que git diff -b no mostrará cambios en el espacio en blanco (por ejemplo, el \ r \ n vs \ n)

preparar:

 git clone https://github.com/CipherShed/CipherShed cd CipherShed 

Una testing rápida para crear un file Unix y cambiar los finales de línea no mostrará cambios con git diff -b :

 echo -e 'The quick brown fox\njumped over the lazy\ndogs.' > test.txt git add test.txt unix2dos.exe test.txt git diff -b test.txt 

Notamos que forzar un tubo a less no muestra el ^ M, pero habilitando el color y less -R hace:

 git diff origin/v0.7.4.0 origin/v0.7.4.1 | less git -c color.ui=always diff origin/v0.7.4.0 origin/v0.7.4.1 | less -R 

La corrección se muestra utilizando una tubería para quitar el \ r (^ M) de la salida:

 git diff origin/v0.7.4.0 origin/v0.7.4.1 git -c core.pager="tr -d '\r' | less -REX" diff origin/v0.7.4.0 origin/v0.7.4.1 

Una alternativa imprudente es usar less -r , ya que pasará por todos los códigos de control, no solo por los códigos de color.

Si solo quiere editar su file de configuration de git directamente, esta es la input para actualizar / agregar:

 [core] pager = tr -d '\\r' | less -REX 

Si está utilizando Eclipse, puede hacer que ^M desaparezca de git diff configurando File > Convert Line Delimiter To > Unix (LF, \n, 0A, ¶)