En un proyecto donde algunos de los archivos contienen ^ M como separadores de nueva línea. Aparentemente, diferenciar estos archivos es imposible, ya que git-diff lo ve como todo el archivo es solo una línea.
¿Cómo difiere uno con la versión anterior?
¿Hay una opción como "tratar ^ M como nueva línea al diferenciar"?
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 script Ruby que revisa las últimas 10 revisiones y convierte CR a 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

git diff -b- Mostré esto en stackoverflow.com/a/46265081/58794git diff --ignore-cr-at-eol. Vea mi respuesta a continuación .git diff -bes idéntico agit diff --ignore-space-change.Respuestas:
GitHub sugiere que debe asegurarse de usar solo \ n como un carácter de nueva línea en repositorios manejados por git. Hay una opción para convertir automáticamente:
Por supuesto, se dice que esto convierte crlf a lf, mientras que desea convertir cr a lf. Espero que esto todavía funcione ...
Y luego convierta sus archivos:
core.autocrlf se describe en la página del manual .
fuente
git config core.whitespace cr-at-eol.warning: LF will be replaced by CRLFlugar dewarning: CRLF will be replaced by LF, y estoy en Linux. ¿Alguna idea de por qué? ¡Quiero que todo termine con LF, no con CRLF!git config --global core.autocrlf input, siga los pasos de esta respuesta (rm, add, commit), y obtendráwarning: CRLF will be replaced by LF. The file will have its original line endings in your working directory.. Elimine los archivos (porque tienen el CRLF original e incorrecto) y vuelva a pagarlos desde el último compromiso "Fix CRLF".Desarrollando en Windows, me encontré con este problema cuando lo uso
git tfs. Lo resolví de esta manera:Básicamente, esto le dice a Git que un CR de fin de línea no es un error. Como resultado, esos molestos
^Mpersonajes ya no aparecen al final de las líneas degit diff,git show, etc.Parece dejar otras configuraciones tal cual; 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 configuración. Para establecer la configuración de un solo proyecto, omita el
--global.)EDITAR :
Después de muchas dificultades en el final de línea, he tenido la mejor suerte, cuando trabajo en un equipo .NET, con esta configuración:
Si necesita usar la configuración de espacios en blanco, probablemente debería habilitarla solo por proyecto si necesita interactuar con TFS. Solo omita el
--global:Si necesita eliminar algunas configuraciones del núcleo. *, La forma más fácil es ejecutar este comando:
Esto abre su archivo global .gitconfig en un editor de texto, y puede eliminar fácilmente las líneas que desea eliminar. (O puede poner '#' delante de ellos para comentarlos).
fuente
core.autocrlfatruegit config --global core.whitespace cr-at-eoldesactivaría otras configuraciones predeterminadas. Hay tres valores predeterminados: blank-at-eol, blank-at-eof y space-before-tab. Entonces, para habilitar cr-at-eol mientras se mantienen los otros que necesitaría usargit config --global core.whitespace blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol.cr-at-eolme deshice^Mal final de las líneasgit diff, pero GIT todavía mostró esas líneas como diferentes, aunque el final de la línea fue la única diferencia.Intenta
git diff --ignore-space-at-eol, ogit diff --ignore-space-change, ogit diff --ignore-all-space.fuente
autocrlfconfiguración. ¡Gracias!Ver también:
o equivalente,
donde
whitespaceestá precedido por un carácter de tabulación .fuente
git show) dejara de molestarme sobre los^Ms en las líneas cambiadas! :)git difftodavía muestra ^ M caracteres.git config --global core.whitespace cr-at-eol(donde --global es opcional si solo lo quieres en el repositorio en el que estás)[core]para poder reemplazar elcore.prefijo con un carácter TAB.^Mengit diff, no se trata de cómo no poner en ^ M en el primer lugar. Eso significa que la respuesta aceptada de cambiocore.autocrlfno es la mejor porque altera silenciosamente los archivos sin la confirmación del usuario.¿Por qué tienes estos
^Men tugit diff?En mi caso, estaba trabajando en un proyecto que se desarrolló en Windows y usé OS X. Cuando cambié algún código, vi
^Mal final de las líneas que agreguégit diff. Creo que^Mestaban apareciendo porque eran terminaciones de línea diferentes que el resto del archivo. Debido a que el resto del archivo se desarrolló en Windows, usóCRterminaciones de línea, y en OS X usaLFterminaciones de línea.Aparentemente, el desarrollador de Windows no usó la opción " Checkout estilo Windows, confirmar terminaciones de línea estilo Unix " durante la instalación de Git.
Entonces, ¿qué debemos hacer al respecto?
Puede hacer que los usuarios de Windows reinstalen git y usen la opción " Finalizar línea al estilo de Windows, confirmar estilo Unix ". Esto es lo que preferiría, porque veo a Windows como una excepción en sus caracteres de final de línea y Windows soluciona su propio problema de esta manera.
Sin embargo, si opta por esta opción, debe corregir los archivos actuales (porque todavía usan los
CRfinales de línea). Hice esto siguiendo estos pasos:Elimine todos los archivos del repositorio, pero no de su sistema de archivos.
Agregue un
.gitattributesarchivo que haga cumplir ciertos archivos para usarLFcomo terminaciones de línea. Pon esto en el archivo:Reemplace
.extcon las extensiones de archivo que desea hacer coincidir.Agregue todos los archivos nuevamente.
Esto mostrará mensajes como este:
Puede eliminar el
.gitattributesarchivo a menos que tenga usuarios obstinados de Windows que no quieran usar la opción " Finalizar línea estilo Confirmar Windows, confirmar estilo Unix ".Comprometerse y empujarlo todo.
Elimine y revise los archivos aplicables en todos los sistemas donde se usan. En los sistemas Windows, asegúrese de que ahora usen la opción " Finalizar línea al estilo de Windows, confirmar estilo Unix ". También debe hacer esto en el sistema donde ejecutó estas tareas porque cuando agregó los archivos, git dijo:
Puede hacer algo como esto para eliminar los archivos:
Y luego esto para recuperarlos con las terminaciones de línea correctas:
Por supuesto, reemplazando
.extcon la extensión que desee.Ahora su proyecto solo usa
LFcaracteres para los finales de línea, y losCRcaracteres desagradables nunca volverán :).La otra opción es hacer cumplir las terminaciones de línea de estilo de Windows. También puede usar el
.gitattributesarchivo para esto.Más información: https://help.github.com/articles/dealing-with-line-endings/#platform-all
fuente
View->Line Endingsy hacer clic enUnix.^M? ¿Es una nueva línea de Windows o Linux? ¿O es simplemente una nueva línea "diferente" en comparación con las otras nuevas líneas en el archivo?git config --global core.autocrlf truees excesivo, y la anti-Windows / anti-CRcampaña parece tangencial a la pregunta.Habrá uno con Git 2.16 (Q1 2018), ya que la "
diff" familia de comandos aprendió a ignorar las diferencias en el retorno de carro al final de la línea.Ver commit e9282f0 (26 de octubre de 2017) por Junio C Hamano (
gitster) .Ayudado por: Johannes Schindelin (
dscho) .(Fusionada por Junio C Hamano -
gitster- en commit 10f65c2 , 27 nov 2017)fuente
git config --global core.autocrlf truecomo en la respuesta aceptada, esto responde a la pregunta del OP más directamente: '¿Hay una opción como "tratar ^ M como nueva línea cuando difiere"?git version 2.20.1 (Apple Git-117)pero al agregar la respuesta core.pager de Jason Pyeron lo solucionó. YMMV obviamente.TL; DR
Cambie el código fuente
core.pagera"tr -d '\r' | less -REX", noEsta es la razón por
Los molestos ^ M que se muestran son un artefacto de la coloración y el localizador.
Es causado por
less -Runa opción predeterminada de buscapersonas git. (el localizador predeterminado de git esless -REX)Lo primero a tener en cuenta es que
git diff -bno mostrará cambios en el espacio en blanco (por ejemplo, \ r \ n vs \ n)preparar:
Una prueba rápida para crear un archivo Unix y cambiar las terminaciones de línea no mostrará cambios con
git diff -b:Notamos que forzar una tubería a menos no muestra el ^ M, pero habilita el color y
less -Rsí:La solución se muestra usando una tubería para quitar el \ r (^ M) de la salida:
Es una alternativa imprudente usar
less -r, porque pasará por todos los códigos de control, no solo los códigos de color.Si solo desea editar su archivo de configuración git directamente, esta es la entrada para actualizar / agregar:
fuente
\r\nterminaciones de línea y algunos tenían\nterminaciones de línea (no sé si eso es relevante); Las diferencias entre las primeras mostraban las^Mlíneas modificadas (es decir, las+líneas).core.autocrlfse estableció entrue. Corrergit config core.pager "tr -d '\r' | less -REX"se libró de los molestos^Ms. ¡Gracias!git diff -bes lo que estaba buscando, pero aprecio la explicación detallada.[core]sección del archivo git "config" agregandopager = tr -d '\\r' | less -REXfue la única respuesta que funcionó para mí. ¡Gracias!Luché con este problema durante mucho tiempo. Con mucho, la solución más fácil es no preocuparse por los caracteres ^ M y simplemente usar una herramienta de diferencia visual que pueda manejarlos.
En lugar de escribir:
tratar:
fuente
En mi caso, lo que hizo fue este comando:
Fuente: https://public-inbox.org/git/[email protected]/T/
fuente
Como señaló VonC, esto ya se ha incluido en git 2.16+. Desafortunadamente, el nombre de la opción (
--ignore-cr-at-eol) difiere del utilizado por GNU diff al que estoy acostumbrado (--strip-trailing-cr).Cuando me enfrenté a este problema, mi solución fue invocar la diferencia de GNU en lugar de la diferencia incorporada de git, porque mi git es anterior a 2.16. Lo hice usando esta línea de comando:
Eso permite usar
--strip-trailing-cry cualquier otra opción de GNU diff.También hay esta otra manera:
pero no usa la configuración de buscapersonas configurada, por eso prefiero la primera.
fuente