2011-12-09 9 views
9

Estamos utilizando un repositorio remoto de Git ubicado en un servidor Linux en la oficina. Todos los clientes son PC con Windows con extensiones de Git instaladas como cliente (ejecutándose con msysgit).¿Cómo hacer que "git branch" respete la bandera "core.ignorecase" en Linux?

en un sistema cliente, si trato de hacer lo siguiente:

git branch Branch1 
git branch branch1 

el segundo comando va a fracasar, diciéndome que una rama con ese nombre ya existe. Eso es lo que espero, ya que establecí el core.ignorecase como verdadero en git config.

Pero, si inicio sesión en el sistema Linux directamente y ejecuto los mismos comandos, se crearán ambas ramas, incluso si el indicador core.ignorecase está establecido en verdadero.

Hubiera esperado que el segundo comando fallara también, ya que configuré el repositorio para ignorar el caso, pero o bien el indicador no hace nada en los sistemas Linux, o me perdí algo.

¿Alguien puede ayudarme a entender el problema ya que planeamos migrar nuestro SCM de Source Safe a Git en breve y este problema nos está asustando? ¿Qué pasaría si dos desarrolladores crean sucursales con el mismo nombre, pero diferente, y empujan el resultado en el repositorio de Linux?

+0

@meagar tiene razón; querrá ordenar una carcasa consistente para los nombres de las sucursales y, en general, evitar que las cosas que se nombran sean las mismas, salvo en el caso. Pero como nota, la configuración del registro de Windows HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ kernel \ obcaseinsensitive aparentemente permite que git funcione de la manera que quiere (I * soy * usando git a través de cygwin; no estoy seguro de si msysgit se comporta de la misma manera) –

Respuesta

15

me gustaría añadir más detalles sobre la respuesta de @ meagar:

FAT32/NTFS son case-preserving sistemas de archivos. Es decir, si nombra un archivo "Foo.txt", se almacenará como "" Foo.txt ". Si guarda un archivo como" foo.txt ", se guardará como" foo.txt ". dado que no distingue entre mayúsculas y minúsculas, "Foo.txt" y "foo.txt" son efectivamente lo mismo y no puede tener ambos archivos en el mismo directorio.

En su repositorio en Windows, si cambia el nombre de " Foo.txt "a" foo.txt ", y si no lo hace para mostrarlo como un cambio, puede configurar la configuración core.ignorecase como verdadera y git no lo verá como un cambio. Si la configura como falsa, lo hará. (Pero debido a la naturaleza del sistema de archivos y git, parecerá que se agregó un nuevo archivo foo.txt, lo que agrega confusión a Windows).

Ese es el propósito del core.ignorecase

Viniendo a la sucursal. Las ramas son solo indicadores de una confirmación. Estos indicadores son solo archivos. Estos archivos están almacenados en .git/refs/heads. Cuando crea una rama, por ejemplo, bar, se crea un archivo llamado .git/refs/head/bar. Ahora, en Linux, cuando crea una rama llamada Bar, puede continuar y crear un archivo .git/refs/head/Bar y, por lo tanto, permite la creación de la rama. Pero en Windows, no puede crear .git/refs/head/Bar y, por lo tanto, no podrá crear la rama Bar cuando exista barra. Tenga en cuenta que core.ignorecase tiene que ver con archivos en su repositorio, su base de código, y no tiene influencia sobre los archivos de metadatos de git.

Así que tendrá que vivir y ajustarse al hecho de que en Linux, puede crear ramas con los mismos nombres, que difieren en el caso, pero en Windows, no puede.

+0

Muchas gracias por la explicación. Todavía soy nuevo en Git, así que no sabía que las ramas terminaban siendo simples archivos metadatos. Ya sabía la diferencia entre mayúsculas y minúsculas entre Linux y Windows, pero me resultó difícil entender la diferencia en el tratamiento de casos entre archivos de código y ramas en Linux. Ahora entiendo. – franmon

8

Cómo hacer que "git branch" respete el indicador "core.ignorecase" en Linux?

No puede, porque la bandera no hace lo que cree que hace.

core.ignorecase

Si es verdad, esta opción permite diversas soluciones para permitir git para trabajar mejor en sistemas de ficheros que no son sensibles, como la grasa.

core.ignorecase no tiene nada que ver con el comportamiento que usted describe, que está relacionado con el de mayúsculas y minúsculas de los nombres de las sucursales. Git no puede decir la diferencia entre Branch1 y branch1 en Windows no está relacionado con si core.ignorecase está configurado, se comportaría de la misma manera independientemente.

... pero ni la bandera hace nada en los sistemas Linux, o me perdí algo.

No se perdió nada. La bandera no hace nada en los sistemas Linux. core.ignorecase no es para hacer que los sistemas operativos no distingan entre mayúsculas y minúsculas, es para permitir que Git funcione en roto sistemas operativos que no distinguen entre mayúsculas y minúsculas. Linux es fundamentalmente sensible a las mayúsculas y minúsculas, y también lo es Git. Debería tratar de trabajar con esto y exigir que sus desarrolladores usen minúsculas para sus nombres de sucursales. Debe no tratar de hacer que Git emule comportamiento roto de otros sistemas operativos.

¿Qué pasaría si dos desarrolladores crean ramas con el mismo nombre, pero en diferentes casos, e inserta el resultado en el repositorio de Linux?

entonces habría dos ramas completamente diferentes, uno en minúscula y uno que fue nombrado erróneamente , y alguien se vería obligado a fusionarse y descartar su mal rama. Esto es algo que harás rutinariamente de todos modos, como un efecto secundario del uso de Git.

+0

La expresión que Windows y Mac OS X son fundamentalmente "sistemas operativos que no distinguen entre mayúsculas y minúsculas" no es útil. Aunque es igualmente inútil, es más razonable argumentar que git está mal diseñado al almacenar los nombres de las sucursales como nombres de archivo directamente en el sistema de archivos sin tener en cuenta las capacidades del sistema de archivos. – ctpenrose

+0

Si se requería que Git se normalizara en el peculiar comportamiento de cada sistema operativo, nunca se habría terminado. La respuesta se encuentra. – meagar

+0

Según su descripción, parece que la propiedad debería haber sido llamada algo así como "core.forcecase". Al igual que el OP, también esperaba una bandera llamada "ignorecase" para hacer que el sistema ignore el caso (no distingue entre mayúsculas y minúsculas). – thelr