2010-08-09 11 views
6

Estoy un poco confundido por qué no puedo verificar una etiqueta directamente desde el comando git clone. Lo que trato de hacer es:No se puede clonar directamente en una etiqueta git usando -b <tagname>

git clone -b mytag <url>/foo.git 

El error que consigo es:

warning: Remote branch mytag not found in upstream origin, using HEAD instead 

etiqueta está presente y, por ejemplo,

cd foo && git checkout mytag 

... funciona bien.

Si alguien pudiera compartir algo de luz sobre por qué es imposible clonar directamente en una etiqueta, lo agradecería. Gracias.

+0

Por lo tanto, es la pregunta: ¿por qué esto no funciona? o ¿Cuál es la mejor solución? – mb14

+0

Supongo que ambas preguntas se han explicado aquí ahora, aunque encuentro la inconsistencia un poco confusa. Lo mantendré hasta mañana para ver si hay otros enfoques, y luego lo cerraré. Gracias por su explicación @ mb14, @simplyharsh, @VonC! – grm

Respuesta

4

Quizás todo lo que realmente necesita/desea hacer es usar git archive para sacar un tarball de cualquier cosa que git rev-parse pueda entender. Puede usar la opción --remote para extraer el archivo de alguna fuente remota de forma idéntica al valor <url>/foo.git que está transfiriendo a clonar. En teoría, esto será mucho más rápido, ya que lo único que obtendrás es el árbol de trabajo y no todo el repositorio.

He aquí un "funciona para mí" ejemplo:

% git archive --prefix foo/ --remote <url>/foo.git my-tag | tar -xf - 
+0

Definitivamente investigaré eso. La sobrecarga de la clonación probablemente no valga la pena. Gracias. – grm

0

¿Estás en un detached head después del checkout mytag de git?

Es posible que mytag no esté en el espacio de nombre "refs/heads/" (para HEAD de branche) de foo.git, pero aún así haga referencia a una confirmación válida.

Eso explicaría la advertencia en git clone, mientras que git checkout funciona correctamente.

+0

Sí, estoy en una cabeza separada. No estoy seguro de entender la diferencia entre git checkout y git clone en este caso. ¿Ayudaría una etiqueta anotada? – grm

+0

@grm: no, no hará ninguna diferencia. el clon git -b es para la rama. Cualquier otro refspec podría ser accesible a través de un 'git checkout', pero estarás en una CABEZA DESMONTABLE (lo que significa que necesitarás crear una sucursal) – VonC

0

-b está destinado a pagar una sucursal, no una etiqueta. Es por eso que dice que no se encontró BRANCH remoto ;-)

+0

Bueno, git-checkout también lo llama una rama, pero funciona en las etiquetas, así que creo la pregunta es válida – grm

+0

@grm No estoy diciendo que la pregunta no sea válida, solo responda la pregunta. Tal vez lo hayan implementado para el pago pero no para clonar. BTW git checkout -b on tag crea una nueva rama, no estoy realmente sorprendido de que no puedas crear una nueva rama antes de terminar de clonar el repositorio. – mb14

+0

AFAIK: No hay ninguna nueva ramificación en ninguno de los ejemplos. Es solo una referencia. – grm

1

Clonar directamente en una etiqueta, me gana intencionalmente.

Pero el comando que está utilizando, en realidad se utiliza para clonar la rama del repositorio. Por lo tanto, en realidad está pidiendo que se cierre el nombre de la sucursal mytag del repositorio. mytag sucursal obviamente no está en su repositorio remoto.

Y no creo que haya ninguna forma directa de clonar en una nueva etiqueta. Debe clonar y luego aplicar etiquetas o buscar las etiquetas del repositorio remoto explícitamente usando git fetch --tags $URL.

Editar en respuesta:

Bueno, el despliegue de la etiqueta es un tipo de uso común. Como el código generalmente se etiqueta una vez que está en un estado considerable. Puede consultar mytag una vez que haya clonado y obtenido las etiquetas de repositorios remotos.

git checkout mytag 

o incluso

git checkout -b mytagbranch mytag 

y continuar con el despliegue.

+0

Estoy buscando realizar la implementación directamente desde el sistema de etiquetas . – grm

Cuestiones relacionadas