Observe los finales de línea de git diff
:
- IP_ADDR: 'http://1.2.3.4:143'
+ IP_ADDR: 'http://2.4.6.8:143'^M
Edité este archivo colocando el cursor, 1
luego presionando ct:
y luego ingresando la nueva dirección IP. No se agregaron ni eliminaron líneas completas del archivo. Sin embargo, noté que el archivo se muestra como tipo dos
en VIM.
¿Por qué VIM cambiaría el final de la línea si no edité explícitamente esa parte del documento? Además, al ver cómo diff
se muestra que no había ningún archivo ^M
en la línea original, ¿de qué otra manera podría VIM haber decidido que se trata de un dos
archivo?
Respuesta1
Vim detectará el formato de archivo original (entre los configurados en 'fileformats'
) y escribirá con el mismo. La única forma de que Vim cambie (por ejemplo, de Unix a Windows) es a través de un archivo :setlocal fileformat=dos
. Es poco probable que tengas eso en tu configuración; :verbose setl ff?
podría decirte.
No me preocuparía demasiado la diferencia de Git (siempre que notodolas líneas aparecen cambiadas, entonces realmente hay un cambio en los finales de línea), sino que lo que se confirma está bien.
Tenga en cuenta que con la configuración de Git autocrlf = true
, Git convertirá las nuevas líneas al estándar del sistema al extraer archivos y a las nuevas líneas LF al confirmar. Entonces, todo podría estar bien, solo que la salida de Git diff te confunde.
Respuesta2
Esta es la evidencia de que todos vivimos en Matrix. Si realmente estuviéramos en el siglo XXI, entonces no estaríamos todavía luchando con diferentes finales de línea.
Vim hace un trabajo bastante bueno al hacer The Right Thing con finales de línea. Los detalles se explican a continuación :help 'ffs'
. Por supuesto, vim no puede leer tu mente: si tu archivo tieneinconsistentefinales de línea, es posible que vim no haga lo que desea.
Sugiero abrir el archivo en vim y luego
:e! ++ff=unix
Esto recargará el archivo desde el disco, lo que obligará a vim a utilizar finales de línea de estilo Unix. Entonces deberías ver exactamente qué líneas, cualesquiera que sean, tienen terminaciones CRLF, porque terminarán con ^M
caracteres sin formato.
Si bien amo git, no lo conozco ni confío en él tan bien como en vim. Creo que algunas personas recomiendan configuraciones de "configúrelo y olvídese" para crlf
las configuraciones de git que pueden generar confusión. Prefiero evitar la configuración que @Ingo Karkat mencionó en su respuesta. Quiero que git extraiga el mismo archivo que se registró y me permita a mí (y a vim) encargarnos de los finales de línea.
Respuesta3
git diff
solo muestra retornos de carro ( ^M
) en líneas agregadas, pero no en líneas eliminadas o sin cambios. Puedes ver esto si usas la -R
bandera, que muestra la diferencia al revés.
$ git diff -R
:
- IP_ADDR: 'http://2.4.6.8:143'
+ IP_ADDR: 'http://1.2.3.4:143'^M
Entonces vim no agrega nada; Especialmente no para una sola línea. Vim usa los finales de línea que encuentra en el archivo al abrirlo.
Respuesta4
Vim se basa en el valor de la opción de formato de archivo para determinar si el archivo abierto actualmente es dos o Unix, o un archivo mac. El valor de la opción de formato de archivo está determinado por el valor de la opción de formatos de archivo.
Cuando vim abre un archivo, vim determinará un valor de opción de formato de archivo válido para el búfer actual en función del valor de la opción de formato de archivo actual. La siguiente es una descripción del manual de vim sobre cómo vim determina el valor de la opción de formato de archivo del búfer actual por el valor de la opción de formatos de archivo:
'fileformats' 'ffs' string (default:
Vim+Vi MS-DOS, MS-Windows OS/2: "dos,unix",
Vim Unix: "unix,dos",
Vim Mac: "mac,unix,dos",
Vi Cygwin: "unix,dos",
Vi others: "")
global
{not in Vi}
This gives the end-of-line (<EOL>) formats that will be tried when
starting to edit a new buffer and when reading a file into an existing
buffer:
- When empty, the format defined with 'fileformat' will be used
always. It is not set automatically.
- When set to one name, that format will be used whenever a new buffer
is opened. 'fileformat' is set accordingly for that buffer. The
'fileformats' name will be used when a file is read into an existing
buffer, no matter what 'fileformat' for that buffer is set to.
- When more than one name is present, separated by commas, automatic
<EOL> detection will be done when reading a file. When starting to
edit a file, a check is done for the <EOL>:
1. If all lines end in <CR><NL>, and 'fileformats' includes "dos",
'fileformat' is set to "dos".
2. If a <NL> is found and 'fileformats' includes "unix", 'fileformat'
is set to "unix". Note that when a <NL> is found without a
preceding <CR>, "unix" is preferred over "dos".
3. If 'fileformat' has not yet been set, and if a <CR> is found, and
if 'fileformats' includes "mac", 'fileformat' is set to "mac".
This means that "mac" is only chosen when:
"unix" is not present or no <NL> is found in the file, and
"dos" is not present or no <CR><NL> is found in the file.
Except: if "unix" was chosen, but there is a <CR> before
the first <NL>, and there appear to be more <CR>s than <NL>s in
the first few lines, "mac" is used.
4. If 'fileformat' is still not set, the first name from
'fileformats' is used.
When reading a file into an existing buffer, the same is done, but
this happens like 'fileformat' has been set appropriately for that
file only, the option is not changed.
When 'binary' is set, the value of 'fileformats' is not used.
When Vim starts up with an empty buffer the first item is used. You
can overrule this by setting 'fileformat' in your .vimrc.
For systems with a Dos-like <EOL> (<CR><NL>), when reading files that
are ":source"ed and for vimrc files, automatic <EOL> detection may be
done:
- When 'fileformats' is empty, there is no automatic detection. Dos
format will be used.
- When 'fileformats' is set to one or more names, automatic detection
is done. This is based on the first <NL> in the file: If there is a
<CR> in front of it, Dos format is used, otherwise Unix format is
used.
Also see |file-formats|.
For backwards compatibility: When this option is set to an empty
string or one format (no comma is included), 'textauto' is reset,
otherwise 'textauto' is set.
NOTE: This option is set to the Vi default value when 'compatible' is
set and to the Vim default value when 'compatible' is reset.
Volviendo a su pregunta, su archivo se identifica como un archivo DOS en vim, por lo que cuando guarda el archivo y sale de vim, vim reemplazará automáticamente el carácter de nueva línea con la nueva línea de estilo dos: .
En su árbol de directorio de trabajo de git, este archivo es un archivo dos, pero dado que este archivo es un archivo unix en el árbol de índice de git, al usar git diff
, verá que el archivo ha cambiado. Para un archivo en formato Unix, el extra se mostrará como carácter ^M.