¿Por qué se rompe git si '/' es la raíz del repository?

Nos gustaría usar git para mantener las configuraciones del sistema. Debido a que a veces los datos de configuration existen fuera de / etc, comenzamos a hacer algo como esto en nuestros sistemas:

# cd / # git init # git add etc # git add some/other/path # git commit -m 'initial import' 

Etcétera. Esto funciona, hasta cierto punto. Mientras su cwd == '/', git se comporta normalmente. Sin embargo, si intenta, por ejemplo, ejecutar git desde dentro de un subdirectory:

 cd /etc git status 

Usted obtiene basura. En nuestro caso, miles de líneas de listdos "eliminados:" de files que claramente todavía existen. Este comportamiento parece ser exclusivo para ejecutar git en /; haciendo lo mismo en cualquier otro lado funciona bien.

Puedo "arreglar" el comportamiento de esta manera:

 GIT_WORK_TREE=/ git status 

Y oye, todo funciona de la manera que Linus pretendía … pero esto es un dolor. No quiero establecerlo en el entorno unilateralmente (porque esto entraría en conflicto con el uso de git en otros repositorys), y me gustaría evitar un script de envoltura. ¿Tengo alguna otra opción?

Esta es una suposition completa que podría utilizar para investigar más a background, pero sospecho que el comportamiento de "encontrar el directory .git " de git está interactuando con el hecho de que / es su propio directory principal. Tal vez la lógica de "parar en la raíz" tiene un error tipo fencepost.

Establecer la opción core.worktree en el repository se encarga de esto:

 git config core.worktree / 

Esto funciona mucho mejor que establecer GIT_WORK_TREE en el entorno. ¡Hurra!

Esto se solucionará en Git 2.4.1+ (Q2 2015).
Consulte commit 84ccad8 por Jeff King ( peff ) , y se fusionó en 7502b23 .

init : no establezca core.worktree al inicializar /.git

Si crea un repository git en el directory raíz con " git init / ", escribimos erróneamente una input core.worktree .
Esto no está mal , en el sentido de que está bien establecer core.worktree cuando no es necesario. Pero es innecesariamente sorprendente si más tarde mueve el directory .git a otra ruta (que generalmente mueve el tree de trabajo relativo, pero se frustra si hay un set de tree de trabajo explícito).

El problema es que verificamos si core.worktree es necesario al ver si podemos hacer el git_dir al concatenar "/.git" en el tree de trabajo .
Eso llevaría a " //.git " en este caso, pero en realidad tenemos "/ /.git " (sin la barra doble).

(Es por eso que core.worktree está configurado incorrectamente aquí, cuando git init se hace en la carpeta raíz / )

Podemos arreglar esto mediante una function especial del directory raíz. También dividí la lógica en su propia function para hacer que el condicional sea un poco más legible (y usé skip_prefix, lo que creo que hace que sea un poco más obvio lo que está sucediendo).

Sin testings, ya que necesitaríamos poder escribir en "/" para hacerlo.
Confirmé manualmente que:

 sudo git init / cd / git rev-parse --show-toplevel git config core.worktree 

todavía encuentra el nivel superior correctamente (como " / ") y no establece ninguna variable core.worktree .