git rev-parse –verify dice "fatal: se necesitaba una única revisión"

Considere este script de testing.

#!/bin/sh -x rm -rf origin clone git init origin cd origin echo foo > file git add -A git commit -m "initial commit" git branch foo cd .. git clone origin clone cd clone git rev-parse --verify foo 

Creamos un repository de origin , creamos una twig llamada foo , clonamos el repository y, en el clon, intentamos validar que el nombre foo sea ​​un object válido con git rev-parse --verify foo .

Pero cuando ejecuto esto, dice: "fatal: necesitaba una sola revisión", lo cual no tiene ningún sentido para mí.

Supongo que está tratando de decirme que foo no es un nombre de twig, que solo existe origin/foo . Pero obviamente funciona cuando git checkout foo .

En general, lo que estoy tratando de hacer es verificar de antemano que funcionará git checkout foo , sin ejecutar realmente git checkout foo . ¿Como podría hacerlo?

Estás en lo correcto: la twig foo no existe en el clon.

El process de clonación normalmente copy todas las twigs, más precisamente, las references de los formularios refs/heads/* a las twigs de seguimiento remoto, references del formulario refs/remotes/<remote>/* . (El nombre del control remoto es lo que especifique con -o , u origin si no especifica nada).

Una vez que el clon finaliza, git clone realiza una git checkout de git checkout de la twig que especifique con -b . Si no especifica algo, usa lo que puede ver para que HEAD decida qué hacer con el git checkout ; más a menudo, simplemente termina haciendo el git checkout master .

Es el último paso git checkout master que realmente crea el master sucursal local, debido a este bit de la documentation de git checkout :

Si no se encuentra una sucursal pero sí existe una sucursal de seguimiento en exactamente un control remoto (llámese remoto ) con un nombre coincidente, trátelo como equivalente a
$ git checkout -b branch --track remote / branch

Entonces, si estás seguro de que has git clone d para que solo haya un control remoto, y sabes que el nombre del control remoto es de origin , simplemente puedes hacer un git rev-parse --verify origin/foo para averiguar si esa twig de seguimiento remoto existe. (Modifíquelo según sea necesario para un control remoto con un nombre diferente y / o use git remote para get una list de todos los controles remotos posibles, luego recorra todos los controles remotos para averiguar si hay exactamente una twig llamada foo , si es necesario).

No estoy seguro de si este process es completamente infalible si algún control remoto tiene líneas fetch = valor refs/remotes/weird/master , por ejemplo, si el origin remoto entra en las twigs de rastreo remoto llamadas refs/remotes/weird/master lugar de refs/remotes/origin/master , es posible que el git checkout esté bien con esto, pero si busca el origin/master no lo encontrará. (Por otro lado, fetch = -valued fetch = lines confundirá otros bits de git, incluyendo algún código que estaba viendo en git pull esta mañana).