tag crear git msys

crear - Los nombres de archivo de Git-windows no se manejan correctamente



git push (6)

Tenemos el repositorio de git bare en Unix que tiene archivos con el mismo nombre que difiere solo en los casos.

Ejemplo:

GRANT.sql grant.sql

Cuando clonamos el repositorio desnudo de unix en un cuadro de Windows, el estado de git detecta el archivo como modificado. El árbol de trabajo se carga solo con grant.sql, pero el estado de git compara grant.sql y GRANT.sql y muestra el archivo modificado en el árbol de trabajo.

Intenté usar el core.ignorecase falso pero el resultado es el mismo.

¿Hay alguna manera de arreglar este problema?


Acabo de encontrar un problema similar. En mi caso, los dos archivos con nombres similares que difieren solo en el caso estaban en un subdirectorio que no era relevante en el clon de Windows. Git 1.7 tiene una característica de pago escaso que le permite excluir ciertos archivos de una copia de trabajo. Para excluir este directorio:

git config core.sparsecheckout true echo ''*'' >.git/info/sparse-checkout echo ''!unwanted_dir/'' >>.git/info/sparse-checkout git read-tree --reset -u HEAD

Después de esto, el subdirectorio unwanted_dir/ desapareció por completo de mi copia de trabajo y Git continúa trabajando con el resto de los archivos de forma normal.

Si su GRANT.sql y grant.sql no son relevantes en el clon de Windows, puede agregar sus nombres a .git/info/sparse-checkout para excluir esos archivos específicamente.


Cygwin maneja la distinción entre mayúsculas y minúsculas y los personajes divertidos en nombres de archivos mucho mejor que MSys.

Cambie esta clave de registro para habilitar la distinción entre mayúsculas y minúsculas en Windows:

HKLM / System / CurrentControlSet / Control / Session Manager / Kernel / ObCaseInsensitive = 0

Vea here algunas advertencias sobre cómo se admite la sensibilidad de mayúsculas y minúsculas en Cygwin.


La forma más sencilla de solucionar realmente el problema es cambiar el nombre de uno de los archivos para que no entren en conflicto en un sistema de archivos que no distingue entre mayúsculas y minúsculas, como Windows o OS X.

Después de un compromiso del sistema Linux / Unix donde puede abordar el problema más fácilmente, todo estará bien en Windows después de un tirón. Para evitar que se produzca este problema, deberá agregar un enlace de confirmación similar al sugerido por djjeck.

Los síntomas en Windows para esto son muy confusos e incluyen:

  • Archivos que siempre se muestran como cambiados incluso si los invierte, lo que hace que cambiar de rama o cambiar de base sea muy difícil.
  • Dos copias del archivo con los nombres que difieren solo en caso de que ambos muestren cambios en git gui

Dado que ambos archivos no pueden coexistir en una plataforma insensible a las mayúsculas y minúsculas, debe cambiar uno de los nombres de archivo para evitar el problema.


No estoy seguro de que esto sea posible. El caso omiso de Git maneja las discrepancias en el caso del único archivo. No funcionará con la incapacidad de Window de tener dos nombres de archivo en el único directorio que difieren solo por caso.

FWIW, tener dos nombres de archivo idénticos, pero para su caso es una muy mala idea, incluso en Unix.


Si desea mantener su repositorio amigable con los sistemas de archivos que no distinguen entre mayúsculas y minúsculas, puede agregar un enlace de confirmación que le impide registrar los archivos en conflicto.

#!/bin/bash # Save current state git stash -u -q --keep-index || exit 1 # Get the list of clashing files in the whole repository CLASHING=`find "$(git rev-parse --show-toplevel)" | sort | uniq -d -i` # Restore previous state git stash pop -q if [[ $CLASHING ]]; then echo "Found clashing files on case-insensitive file systems" echo "$CLASHING" exit 1 fi exit 0

Esta secuencia de comandos requiere la versión de git> = 1.7.7, ya que utiliza stash -u, para evitar errores en los archivos sin seguimiento.


Windows no distingue entre mayúsculas y minúsculas (más precisamente, preservación de mayúsculas y minúsculas). Simplemente no existe una forma posible de que existan dos archivos cuyos nombres solo difieren en el caso: dos nombres de archivo que difieren solo en caso de que tengan el mismo nombre de archivo. Período.

Entonces, Git recorre el repositorio, revisando un archivo tras otro, hasta que llega al primero de los dos archivos problemáticos. Git lo verifica, luego va más allá sobre su negocio hasta que llega al segundo archivo. Nuevamente, Git lo verifica. Dado que desde el punto de vista de Windows el nombre del archivo es el mismo que el primero, el primer archivo simplemente se sobrescribe con el segundo. Lo que ahora hace que Git piense que el primer archivo fue cambiado para tener el mismo contenido que el segundo.

Tenga en cuenta que esto no tiene nada que ver con Git: exactamente lo mismo ocurriría si tuviera un tarball, un archivo zip o un repositorio de Subversion.

Si desea hacer desarrollo en múltiples plataformas diferentes, debe respetar las restricciones de esas plataformas y debe limitarse al mínimo común denominador de todas las plataformas que admite. Windows admite ADS, Linux no. OSX admite resource bifurcaciones, Windows no. BSD admite mayúsculas y minúsculas, Windows no. Entonces, no puedes usar ninguno de esos. Esa es la forma como es.

core.ignorecase no te ayudará aquí, porque maneja exactamente el problema opuesto .