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 -b
es 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 CRLF
lugar 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
^M
personajes 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.autocrlf
atrue
git config --global core.whitespace cr-at-eol
desactivarí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-eol
me deshice^M
al 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
autocrlf
configuración. ¡Gracias!Ver también:
o equivalente,
donde
whitespace
está precedido por un carácter de tabulación .fuente
git show
) dejara de molestarme sobre los^M
s en las líneas cambiadas! :)git diff
todaví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.^M
engit diff
, no se trata de cómo no poner en ^ M en el primer lugar. Eso significa que la respuesta aceptada de cambiocore.autocrlf
no es la mejor porque altera silenciosamente los archivos sin la confirmación del usuario.¿Por qué tienes estos
^M
en 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
^M
al final de las líneas que agreguégit diff
. Creo que^M
estaban 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óCR
terminaciones de línea, y en OS X usaLF
terminaciones 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
CR
finales de línea). Hice esto siguiendo estos pasos:Elimine todos los archivos del repositorio, pero no de su sistema de archivos.
Agregue un
.gitattributes
archivo que haga cumplir ciertos archivos para usarLF
como terminaciones de línea. Pon esto en el archivo:Reemplace
.ext
con las extensiones de archivo que desea hacer coincidir.Agregue todos los archivos nuevamente.
Esto mostrará mensajes como este:
Puede eliminar el
.gitattributes
archivo 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
.ext
con la extensión que desee.Ahora su proyecto solo usa
LF
caracteres para los finales de línea, y losCR
caracteres 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
.gitattributes
archivo para esto.Más información: https://help.github.com/articles/dealing-with-line-endings/#platform-all
fuente
View
->Line Endings
y 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 true
es excesivo, y la anti-Windows / anti-CR
campañ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 true
como 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.pager
a"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 -R
una opción predeterminada de buscapersonas git. (el localizador predeterminado de git esless -REX
)Lo primero a tener en cuenta es que
git diff -b
no 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 -R
sí: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\n
terminaciones de línea y algunos tenían\n
terminaciones de línea (no sé si eso es relevante); Las diferencias entre las primeras mostraban las^M
líneas modificadas (es decir, las+
líneas).core.autocrlf
se estableció entrue
. Corrergit config core.pager "tr -d '\r' | less -REX"
se libró de los molestos^M
s. ¡Gracias!git diff -b
es lo que estaba buscando, pero aprecio la explicación detallada.[core]
sección del archivo git "config" agregandopager = tr -d '\\r' | less -REX
fue 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-cr
y 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