¿Hay alguna forma de encontrar el tree de trabajo de un repository de Git, dado su directory .git?

Estoy escribiendo un script para que lo usen algunos colegas en sus repositorys de Git, y estoy confundido acerca de cómo encontrar de manera confiable la raíz del tree de trabajo del repo:

Normalmente, si el directory actual está dentro de un tree de trabajo, los commands …

git rev-parse --git-dir git rev-parse --show-toplevel 

… devolvería las raíces del directory .git y del tree de trabajo, respectivamente. Sin embargo, si el directory actual está dentro de un directory .git , entonces solo funciona el primer command. El command git rev-parse --show-toplevel no muestra el nivel superior del tree de trabajo (al less, no para mí, usando git 1.8.4.4 en Linux).

Suponiendo que git rev-parse --is-bare-repository devuelve false , normalmente supongo que el directory padre de git rev-parse --git-dir es el directory de trabajo (o en algún lugar dentro del directory de trabajo), pero si el GIT_DIR del usuario está configurado para que el directory .git no esté dentro del directory de trabajo, eso no funcionará. (Por ejemplo, cuando el usuario está trabajando con submodules, su GIT_DIR podría no estar dentro de su tree de trabajo).

Lo que encuentro confuso es que, cuando se ejecuta dentro de un GIT_DIR , git rev-parse --show-toplevel no imprime ningún post de error y devuelve 0:

 $ cd $(git rev-parse --git-dir); git rev-parse --show-toplevel ; echo $? 0 

Mientras que ejecutar el mismo command en algún lugar que claramente no es un repository git devuelve un código de error:

 $ cd /; git rev-parse --show-toplevel ; echo $? fatal: Not a git repository (or any of the parent directories): .git 128 

Si hay una forma de encontrar el tree de trabajo de GIT_DIR , ¿podría alguien decirme cómo … o si simplemente no es posible derivar la location del tree de trabajo del directory .git, ayúdame a entender por qué, filosóficamente , el directory .git no mantiene una reference a su tree de trabajo?

Gracias de antemano por ayuda / pointers!

¿por qué, filosóficamente, el directory .git no mantiene una reference a su tree de trabajo?

Porque puede establecer dicho tree de trabajo en cualquier lugar que desee (con la opción --work-tree o la variable de entorno GIT_WORK_TREE ), incluso en un lugar que (y es el objective) no incluye la carpeta .git .

La página man de git config menciona:

El valor puede ser una ruta absoluta o relativa a la ruta al directory .git , que se especifica mediante --git-dir o GIT_DIR , o se descubre automáticamente.
Si se especifica --git-dir o GIT_DIR pero no se especifica ninguno de --work-tree , GIT_WORK_TREE y core.worktree , el directory de trabajo actual se considera como el nivel superior de su tree de trabajo.

Por lo tanto, es más una convención basada en la carpeta del tree de trabajo (para encontrar el .git ) en lugar de la inversa (deduciendo el tree de trabajo de la carpeta .git ).

Dicho esto, enumero todos los commands que pueden darle una idea de la carpeta del tree de trabajo en " Cómo encontrar la ruta del repository git local cuando estoy posiblemente en un subdirectory ".