Git inserta caracteres Unicode después de la normalización de línea

Esta es una situación realmente extraña, y espero que alguien pueda ayudar. Estoy usando git en TFS 2015, y he tratado de normalizar los finales de línea en un repository.

Fondo

He estado probando varias combinaciones de lo siguiente:

git rm --cached -r . git reset --hard 

o

 git rm --cached -r . git add --all . git commit -am "commit msg" 

He ejecutado estos commands bastantes veces, mientras jugaba con la git config --global core.autocrlf . Solo he probado true y false , no he usado input .

También he estado agregando / eliminando y modificando mi file .gitattributes mientras probaba todo esto.

El problema

Me di count después de mi último compromiso, que algunos de los files en el repository ahora tienen cada segunda línea reemplazada por una tonelada de caracteres Unicode. Observado en Notepad ++ con "Mostrar todos los caracteres" activado:

Locura Unicode

Tenga en count que los CR y los LF parecen estar divididos en varias líneas también: las líneas "CR" sobrescriben las líneas existentes en el file.

Solo los CR y los LF desaparecen cuando desactivo "Mostrar todos los caracteres"; todo lo demás en el file es un carácter físico. Los files también aparecen como "Encode in UCS-2 LE BOM" en lugar de "UTF-8 BOM" como era de esperar:

Codificación de archivo

Lo que he intentado

Busqué la confirmación de que esto sucedió, pero no existe. Si reinicio de nuevo a una confirmación que SÉ que tenía el contenido del file original, nada cambia, no importa a qué commit me reinicie, los files permanecen como están.

También para tener en count, es que cuando miro el file a través de la interfaz de usuario TFS, se ve bien:

TFS

Y el historial de confirmaciones es el esperado, el último compromiso fue hace unas pocas horas (este es el que he estado intentando restablecer).

Puedo download los files afectados a través del button de descarga en la interfaz de usuario TFS, y se ven bien.

Traté de sobrescribir algunos de los files descargados en mi repository local, con la esperanza de poder solucionarlo con otra confirmación, pero git se queja de los finales de línea y de que los files no están organizados.

 ME@MYMACHINE MINGW64 /d/git/CLIENT.Core.ProjectTemplates (feature/code-policies) $ git st On branch feature/code-policies Your branch is up-to-date with 'origin/feature/code-policies'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: Powershell/TFS/templates/buildDefinitions/CLIENT/CLIENT.WCFService-CI.json no changes added to commit (use "git add" and/or "git commit -a") ME@MYMACHINE MINGW64 /d/git/CLIENT.Core.ProjectTemplates (feature/code-policies) $ git commit -am "testing overwrite" warning: LF will be replaced by CRLF in Powershell/TFS/templates/buildDefinitions/CLIENT/CLIENT.WCFService-CI.json. The file will have its original line endings in your working directory. On branch feature/code-policies Your branch is up-to-date with 'origin/feature/code-policies'. nothing to commit, working directory clean ME@MYMACHINE MINGW64 /d/git/CLIENT.Core.ProjectTemplates (feature/code-policies) $ git st On branch feature/code-policies Your branch is up-to-date with 'origin/feature/code-policies'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: Powershell/TFS/templates/buildDefinitions/CLIENT/CLIENT.WCFService-CI.json no changes added to commit (use "git add" and/or "git commit -a") 

Luego, cuando bash agregar el file "modificado", solo informa lo siguiente:

 ME@MYMACHINE MINGW64 /d/git/CLIENT.Core.ProjectTemplates (feature/code-policies) $ git add --all . warning: LF will be replaced by CRLF in Powershell/TFS/templates/buildDefinitions/CLIENT/CLIENT.WCFService-CI.json. The file will have its original line endings in your working directory. ME@MYMACHINE MINGW64 /d/git/CLIENT.Core.ProjectTemplates (feature/code-policies) $ git st On branch feature/code-policies Your branch is up-to-date with 'origin/feature/code-policies'. nothing to commit, working directory clean 

Aunque esto puede funcionar, el problema es que hay muchos files y realmente no quiero rebuild manualmente el repository si puedo evitarlo.

También traté de eliminar por completo mi repository y volver a clonar, pero los files siguen siendo los mismos después de la re-clonación. También intenté clonar en una location diferente en mi disco.

Acabo de probar la clonación del repository en otra máquina también, y también ocurre el mismo comportamiento, así que definitivamente tiene que ver con el control remoto.

Por último, vale la pena señalar que estos files existen en una twig llamada feature / code-policies. He intentado ramificar esa twig para ver si hay un problema con la twig en sí, pero no hace ninguna diferencia. ¿Supongo que hay algo corrupto en la twig en sí?

¿Alguien habia visto algo como esto antes? ¿Alguien tiene alguna idea de lo que podría estar pasando y cómo podría resolver el problema?

Suponiendo que está trabajando en una máquina con Windows. Al tratar con terminaciones de línea , puede configurar Configuraciones globales o Configuraciones por repository.

  • Configuración global para finales de línea

En Windows, simplemente pasa true a la configuration. Por ejemplo:

 git config --global core.autocrlf true # Configure Git on Windows to properly handle line endings 
  • Configuraciones por repository

Opcionalmente, puede configurar la forma en que Git administra las terminaciones de línea por repository configurando un file especial de .gitattributes . El file .gitattributes se debe crear en la raíz del repository y se debe comprometer como cualquier otro file.

Aquí hay un ejemplo de file .gitattributes . Puede usarlo como plantilla para sus repositorys:

 # Set the default behavior, in case people don't have core.autocrlf set. * text=auto # Explicitly declare text files you want to always be normalized and converted # to native line endings on checkout. *.c text *.h text # Declare files that will always have CRLF line endings on checkout. *.sln text eol=crlf # Denote all files that are truly binary and should not be modified. *.png binary *.jpg binary 
  • Actualizar un repository después de cambiar los finales de línea

Guarde sus files actuales en Git, para que no se pierda ninguno de sus trabajos.

 git add . -u git commit -m "Saving files before refreshing line endings" 

Elimine todos los files del índice de Git.

 git rm --cached -r . 

Reescribe el índice de Git para recoger todos los nuevos finales de línea.

 git reset --hard 

Vuelva a agregar todos sus files modificados y prepárelos para una confirmación. Esta es su oportunidad de inspeccionar qué files, en su caso, no se modificaron.

 git add . # It is perfectly safe to see a lot of messages here that read # "warning: CRLF will be replaced by LF in file." 

Confirme los cambios en su repository.

 git commit -m "Normalize all the line endings" 

Verifique sus pasos para ver si son correctos.