2012-03-16 18 views
6

Encontré un comportamiento peculiar con git, y puedo reproducirlo cada vez en mi máquina.El uso de `git --git-dir/ruta/a/git pull/ruta/a/otro/bare-git maestro` no actualiza automáticamente el árbol de trabajo. Por qué no?

Si tengo dos repositorios locales, uno desnudo dentro de la carpeta express.git, y el otro no-desnudo con un árbol de trabajo en el interior del expreso carpeta, ambos en la misma carpeta principal, que puede hacer el comando git pull ../express.git desde el interior del express carpeta. Esto actualiza automáticamente todo dentro de express.

Sin embargo, si ejecuto el comando git --git-dir /home/cisw470p/stu006/express/.git pull /home/cisw470p/stu006/express.git master desde una ubicación que no se encuentra en cualquiera de los repositorios de git, el repositorio express generará cambios, pero no actualizará automáticamente el árbol de trabajo. Luego tengo que ejecutar git add . para agregar todos los cambios y luego realizar otra confirmación desde adentro de express y ahora todo está bien.

¿Por qué la versión larga del comando que utiliza la opción --git-dir no actualiza automáticamente el árbol de trabajo para express? ¿Hay alguna razón para esto o encontré un error?

EDIT: Acabo de intentarlo de nuevo pero he editado un archivo diferente y ahora funcionó. Estoy completamente perdido.

+0

¿Cómo esperas que git encuentre el árbol de trabajo con la forma larga? ¿Has intentado agregar el '-work-tree = ...' arg? –

+0

Inside 'express' es el árbol de trabajo junto con la carpeta' .git', como un repositorio normal. – trusktr

+0

Al darle a 'git' un git-dir explícito, ¿por qué esperas que asuma que el padre del directorio de git es un árbol de trabajo? Eso podría ser una suposición bastante peligrosa en muchos casos (en particular, si el dir del git es en realidad un repositorio desnudo) –

Respuesta

10

Si ejecuta git --git-dir=some/dir/.git pull, de forma predeterminada git supondrá que el directorio actual es el árbol de trabajo. No es el padre de some/dir/.git, pero su actual pwd. Esto significa que ejecutar ese comando intentará actualizar el directorio actual como si fuera el árbol de trabajo y terminará escribiendo archivos en su pwd que no pertenecen allí.

La solución adecuada es utilizar el indicador --work-tree junto con --git-dir para indicarle dónde se encuentra el árbol de trabajo. En este caso, querrías git --git-dir=some/dir/.git --work-tree=some/dir pull. Sin embargo, después de la experimentación parece que hay un segundo problema aquí. Si prueba este comando tal como está, probablemente le digan git-pull cannot be used without a working tree. Parece que el problema aquí es git necesita que su árbol de trabajo sea una ruta absoluta en lugar de una ruta relativa.

Lo que realmente quieres ejecutar es git --git-dir=some/dir/.git --work-tree="$PWD"/some/dir pull. Alternativamente, puedes probar cd some/dir && git pull. Si no desea cambiar su cwd, puede envolver esto en una subshell, es decir, (cd some/dir && git pull).

+0

Interesante. Usar una subshell funciona en la línea de comando, pero el problema es que si '' (cd some/dir/.git && git pull) 'dentro de un script hook no funcionará y tendré un error diciéndome que no git repo existe en esa ubicación ('fatal: no es un repositorio git'); el mismo error si copio las rutas absolutas '/ some/repo' o'/some/repo/.git'. Es por eso que recurrí al uso de --git-dir, y ahora -work-tree. Sin embargo, estoy usando rutas absolutas, y todavía estoy recibiendo el error 'git-pull no se puede usar sin un árbol de trabajo'. Mi camino comienza con '/', lo que significa que es absoluto, ¿verdad? – trusktr

+0

Sí, comenzar con un '/' significa que es absoluto. Tal vez el camino está mal? Además, solo debes usar '(cd some/dir && git pull)', no '(cd some/dir/.git && git pull)'. Si puede ejecutar 'git pull' desde ese directorio en un terminal interactivo, debería poder hacerlo desde una subshell en un script. –

+0

Independientemente, con o sin el .git en la ruta, obtengo el mismo error ... Lo publicaré cuando regrese del móvil. Y sí, comprobé tres veces que estoy escribiendo la ruta correcta. – trusktr

Cuestiones relacionadas