2010-06-28 12 views
6

Cuando copio un archivo encima de otro archivo en un directorio controlado por git ... Estoy viendo git pensar que todo el archivo ha cambiado en lugar de un pequeño trozo ... ¿por qué?¿Por qué git ve archivos enteros como cambiados al copiar archivos sobre otros archivos?

Aquí es un ejemplo de lo que quiero decir ... http://github.com/cmodien/fileupdatetest/commit/90309ed099e257cd98218b4504cd2cd3a3a47a27

OK ... Revisé los finales de línea en el archivo ... El archivo original tiene los finales de línea CRLF. El archivo que pegué sobre el original tiene terminaciones de línea. Lo cual tiene sentido, supongo ... Obtuve el archivo original de un usuario de Windows y recibí el nuevo archivo de un usuario de Mac.

¿Cómo puedo solucionar esto?

+1

¿Qué es exactamente que se está viendo que te hace decir git piensa todo el archivo ha cambiado? –

+0

Porque ... ¿realmente cambiaste el archivo completo? ¿O el nuevo archivo es exactamente el mismo que el anterior, excepto en un área pequeña? –

+0

Cuando hago un git diff después de copiar y pegar el archivo que recibí de un colega ... el diff informa que todo el archivo ha cambiado. La única forma en que los archivos difieren es el tamaño en 97 bytes. Los contenidos son idénticos. – Clintm

Respuesta

3

He utilizado este para solucionar el problema ...

Trying to fix line-endings with git filter-branch, but having no luck

originalmente He intentado seguir este ... http://help.github.com/dealing-with-lineendings/ pero era poco clara que en mac/nix es necesario establecer núcleo .autocrlf para ingresar y no verdadero.

El otro ligera complicación era que tenía algunos ficheros ignorados en mi git ignorar que necesitaba para fijar así ... por lo que este comando:

git diff --cached --name-only -z | xargs -0 git add 

estaba fallando ... así que tuve que correr esto ...

git diff --cached --name-only -z | xargs -0 git add -f 

para forzarlo a arreglar los ficheros ignorados, así ...

4

Como se mencionó en twitter, (@adymitruk) tiene un problema con los finales de línea. La configuración de AutoCRLF probablemente no esté configurada como "falsa" como debería ser, a menos que esté haciendo un desarrollo multiplataforma.

La solución es establecerlo en falso, corregir los finales de línea establecer el autocrlf en falso y luego confirmar. Una vez hecho esto, podrá copiar esos archivos y luego solo ver los cambios reales.

+0

Gracias Adam ... en realidad no tenía esa bandera ... y estaba tratando de agregar esa bandera ya que suponía que era por eso que git estaba viendo todo el archivo como modificado ... pero estableciendo esa bandera en verdadero y ejecutar una serie de pruebas no pareció solucionar el problema. Desde entonces, he eliminado esa bandera de .gitconfig. El problema todavía existe Codificaré un ejemplo y lo lanzaré en github. – Clintm

+0

Esto también fue molesto para mí cuando comencé a usar Git. Una vez que has autocrlf establecido en falso, no tendrás ese problema. Aún necesitará hacer una confirmación de limpieza para establecer los finales de línea a lo que son de forma nativa. –

3

Hay dos situaciones comunes en las que esto puede ocurrir:

  1. espacio en blanco está dañado. Su editor podría estar convirtiendo espacios en TAB o viceversa: simplemente configúrelo para usar Linux CodingStyle para resolver el problema.
  2. Las terminaciones de las líneas están dañadas. Establezca core.autocrlf en false y vea this discusión sobre una nueva variable core.eol variable.
Cuestiones relacionadas