2012-09-18 17 views
44

Si uno trata de ejecutar cualquiera de los comandos git-BiSect desde cualquier lugar que no sea el directorio raíz del repositorio, a uno le dicen:¿Por qué git-bisect debe ejecutarse desde el directorio de nivel superior del árbol de trabajo?

es necesario ejecutar este comando desde el nivel superior del árbol de trabajo.

¿Por qué es eso? No conozco ningún otro comando de git que tenga este requisito, y no veo ninguna razón obvia de que la bisección sea especial. La página man tampoco menciona esta restricción.

Realmente no es un gran problema. En su mayoría solo tengo curiosidad.

+0

Supongo que es para dejar en claro que toda su copia de trabajo se modificará durante el bisectriz – CharlesB

+2

Y para evitar el límite de qué hacer si se encuentra en un directorio que se elimina. Por otra parte, git no rastrea directorios ... – Arafangion

+1

@CharlesB, Arafangion, Ambos puntos se aplican tanto a git-checkout como a git-bisect, ¿no es así? –

Respuesta

48

En cuanto a algunos comete en el proyecto, veo uno por Marcel M. Cary ([email protected])

Dice en una confirmación (que pasa a ser sobre git-pull pero creo es relevante)

"git pull" falla porque las cáscaras POSIX tienen una noción de la corriente directorio de trabajo que es diferente de getcwd(). El shell almacena esta ruta en PWD. Como resultado, "cd ../" se puede interpretar de manera diferente en un script de shell que chdir ("../") en un programa C. El shell interpreta "../" esencialmente eliminando el último componente de ruta de texto de PWD, mientras que C chdir() sigue el enlace ".." en el directorio actual en el sistema de archivos. Cuando PWD es un enlace simbólico, estos son diferentes destinos . Como resultado, los comandos C de Git encuentran el árbol de trabajo de nivel superior correcto de , y los scripts de shell no.

https://github.com/git/git/commit/08fc0608657ee91bc85276667804c36a93138c7d

así que diría que parte de la razón se debe a que git-bisect es un shell script que no se puede confiar para encontrar el nivel superior por su propia cuenta (cuando se trata de enlaces simbólicos).

+2

Esperaba una razón mejor, pero eso no es tu culpa. Muchas gracias por hacer una investigación. –

+1

Sí, un poco decepcionante. Adelante y entérese del código; es notable (y a veces humorísticamente) bien comentado y los mensajes de compromiso son excelentes. – willoller

6

El proceso de bisectriz debe verificar las diferentes revisiones de su proyecto. Si una revisión en particular no contiene la carpeta actual, entonces se eliminará la carpeta actual.

En ese caso, su caparazón podría terminar sentado en una carpeta que ya no está en el sistema de archivos. Git no podrá encontrar la carpeta .git de toplevel, por lo que el proceso de bisección no podrá continuar sin intervención.

Una demostración:

$ git rev-parse --show-toplevel 
/path/to/project 
$ mkdir tmp 
$ cd tmp 
$ rmdir ../tmp 
$ git rev-parse --show-toplevel 
fatal: Unable to read current working directory: No such file or directory 

Por supuesto, este mismo problema puede ocurrir cuando se hace git checkout, y se puede fijar fácilmente después del hecho, por ejemplo, con cd .. (willoller explica por qué funciona en el shell pero no en git).

Pero ya que es un proceso que divide en dos que tiene sentido para evitar esta situación antes de empezar, especialmente si queremos usar la automatización como git bisect run.

Cuestiones relacionadas