¿Cómo fuerzo a git a verificar la rama maestra y eliminar los retornos de carro después de haber normalizado los archivos usando el atributo "texto"?


101

Bien, agregué el archivo .gitattributescon líneas como esta

*.css text
*.js text
etc...

Luego seguí las instrucciones en http://git-scm.com/docs/gitattributes#_checking-out_and_checking-in

$ rm .git/index     # Remove the index to force Git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

¡Pero ahora mi copia de trabajo todavía tiene los retornos de carro! Tengo archivos sin seguimiento que me gustaría conservar. ¿Cómo puedo hacer que git revise la rama maestra nuevamente con los archivos normalizados?

Sé que los archivos están normalizados en el repositorio porque cuando clono el repositorio, tengo todos los archivos sin los retornos de carro.

Respuestas:


264

¡Ah ah! Verifique la confirmación anterior, luego verifique el maestro.

git checkout HEAD^
git checkout -f master

5
Gracias por esta solución, pero es un problema evidente en git que "checkout -f" realmente no obliga a volver a pagar. Otra solución sería eliminar primero todos los archivos de copia de trabajo (es decir, todo menos .git dir).
pfalcon

¡Ah, sí, gracias por eso! Al escuchar eso, supongo que podríamos eliminar los archivos de interés y ejecutar el pago. Para mí, en realidad, solo había un archivo que intentaba corregir. Pero, por supuesto, pueden ser todos los archivos, cientos o miles.
Jason

Esto falla en git 1.8.3 (mac) con: error: pathpec 'HEAD ^' no coincide con ningún archivo conocido por git.
Dval

@dval, mire las ediciones de esta publicación y verá una forma alternativa de hacer esto. También estoy ejecutando una Mac, y esto funcionó para mí. También te animo a actualizar tu git a 2+ y puedes usar Homebrew para hacer esto de una manera segura y fácil de mantener.
Jason

2
Esto realmente no funciona. GIT solo actualizará los archivos que cambiaron entre las dos confirmaciones (con algunas excepciones). Si un repositorio es nuevo, por ejemplo. solo dos confirmaciones y la primera está vacía, entonces esta solución funcionará. De lo contrario, debe eliminar a la fuerza todos los archivos como se describe en la respuesta de Mechsin.
jstine

16

Como otros han señalado, uno podría simplemente eliminar todos los archivos en el repositorio y luego revisarlos. Prefiero este método y se puede hacer con el siguiente código

git ls-files -z | xargs -0 rm
git checkout -- .

o una linea

git ls-files -z | xargs -0 rm ; git checkout -- .

¡Lo uso todo el tiempo y aún no he encontrado ningún inconveniente!

Para una explicación más detallada, -zagrega un carácter nulo al final de cada entrada de salida por ls-files, y -0le dice xargsque delimite la salida que estaba recibiendo por esos caracteres nulos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.