363 votos

git diff ignorar ^ M

En un proyecto en el que algunos de los archivos contiene ^ M como separadores de nueva línea. Diferenciando estos archivos son aparentemente imposible, ya que git diff lo ve como todo el archivo es sólo una sola línea.

¿Cómo funciona un diff con la versión anterior?

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

 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>
 


ACTUALIZACIÓN:

He escrito un script que comprueba hacia fuera las últimas 10 revisiones y convierte a CR 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
 

297voto

nes1983 Puntos 7046

Github sugiere que usted debe asegurarse de que sólo use \n como un carácter de nueva línea en git-maneja los repos. Hay una opción para auto-convertir:

$ git config --global core.autocrlf true

Por supuesto, esto se dice para convertir crlf a lf, mientras que usted desea convertir cr a lf. Espero que esto todavía funciona ...

Y, a continuación, convertir sus archivos:

# 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"

núcleo.autocrlf se describe en la página man.

295voto

Kyralessa Puntos 76456

El desarrollo en Windows, me encontré con este problema cuando se utiliza git tfs. He resuelto de esta manera:

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

Básicamente, esto le dice a Git que un fin-de-línea CR no es un error. Como resultado, esos molestos ^M personajes no dejan de aparecer al final de las líneas en git diff, git show, etc.

Parece que deje las otras opciones como-es; por ejemplo, espacios adicionales al final de una línea todavía se muestra como los errores (resaltado en rojo) en el diff.

(Otras respuestas han aludido a esto, pero lo descrito arriba es exactamente cómo establecer la configuración. Para establecer la configuración para un solo proyecto, omita la --global.)

EDICIÓN:

Después de muchos el final de línea tribulaciones, he tenido la mejor suerte, cuando se trabaja en una .NETO equipo, con estos valores:

  • SIN núcleo.eol configuración
  • SIN núcleo.la configuración de los espacios en blanco
  • SIN núcleo.autocrlf configuración
  • Cuando se ejecuta el Git installer for Windows, podrás obtener estas tres opciones:
    • Checkout estilo de Windows, cometer al estilo Unix finales de línea <-- elige esta
    • La caja como-es, cometer al estilo Unix finales de línea
    • La caja como-es, cometer tal como es

Si necesita utilizar el espacio en blanco la configuración, se debe probablemente habilitarlo sólo sobre una base por proyecto si es necesario interactuar con TFS. Solo omite la --global:

git config core.whitespace cr-at-eol

Si usted necesita para eliminar algunos de núcleo.* la configuración, la forma más sencilla es ejecutar este comando:

git config --global -e

Esto abre el mundial .gitconfig archivo en un editor de texto, y usted puede fácilmente eliminar las líneas que desea eliminar. (O puedes poner '#' delante de ellos a los comentarios).

108voto

Jakub Narębski Puntos 87537

Trate git diff --ignore-space-at-eol o git diff --ignore-space-change o git diff --ignore-all-space .

90voto

CyberShadow Puntos 13244

Ver también:

 core.whitespace = cr-at-eol
 

10voto

Ian Wojtowicz Puntos 51

Luché con este problema desde hace mucho tiempo. Con mucho, la solución más fácil es no preocuparse por los personajes ^ M y sólo tiene que utilizar una herramienta visual de diferencias que pueden manejarlos.

En lugar de escribir:

 git diff <commitHash> <filename>
 

Sugerencias de búsqueda:

 git difftool <commitHash> <filename>
 

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X