¿Cómo empujas una etiqueta Git a una rama usando una refspec?

216

Quiero forzar el empuje, por ejemplo, mi etiqueta 1.0.0a mi masterrama remota .

Ahora estoy haciendo lo siguiente:

git push production +1.0.0:master

Quiero forzar el empuje , porque lo único que me importa es que el código dentro de la1.0.0etiqueta se empuje a lamasterrama en el repositorio remoto.

¿Qué estoy haciendo mal?

Actualización n. ° 1

Cuando hago SSH en mi servidor donde está mi repositorio Git y ejecuto git branch -l, tampoco veo la masterrama en la lista.

Actualización n. ° 2

Después de ejecutar git tag -ldesde el repositorio remoto de Git, veo que masteraparece en la lista, lo que significa que cuando ejecuté lo siguiente:

git push production 1.0.0:master

En realidad, empujó la etiqueta y creó una etiqueta con nombre en master lugar de una nueva rama .

Básicamente, quiero insertar el contenido de la etiqueta 1.0.0en la masterrama del repositorio remoto de Git.

Michael van Rooijen
fuente
¿Puedes aclarar qué significa "no funciona"? ¿Git da un error específico o tiene un efecto nulo?
vcsjones
Lo siento. Sí, así que básicamente cuando hago SSH en mi servidor, en el repositorio de git y ejecuto git branch -l para enumerar las ramas, solo veo mi otra rama. Sin embargo, la producción de git push +1.0.0: master empujó, y cuando vuelvo a empujarlo dice Todo actualizado , pero no veo la rama maestra en el servidor remoto.
Michael van Rooijen
55
Debes cambiar la respuesta aceptada. La segunda respuesta es mucho más simple que la que está marcada como aceptada.
Pedro Rolo
Lo siento por la respuesta tardía. Estoy de acuerdo y ahora he cambiado la respuesta aceptada.
Michael van Rooijen
1
@MichaelvanRooijen No entiendo cómo la respuesta aceptada que elegiste en realidad resuelve este problema. No sobrescribe una rama con una etiqueta, solo empuja sus etiquetas al control remoto.

Respuestas:

61

Probablemente esté fallando porque 1.0.0es una etiqueta anotada. Quizás viste el siguiente mensaje de error:

error: Intentando escribir un objeto sin compromiso en las referencias de sucursal / cabezas / maestro

Las etiquetas anotadas tienen su propio tipo distinto de objeto que apunta al objeto de confirmación etiquetado. Las ramas no pueden apuntar útilmente para etiquetar objetos, solo comprometer objetos. Necesita "pelar" la etiqueta anotada de nuevo para confirmar el objeto y empujar eso en su lugar.

git push production +1.0.0^{commit}:master
git push production +1.0.0~0:master          # shorthand

Hay otra sintaxis que también funcionaría en este caso, pero significa algo ligeramente diferente si el objeto de etiqueta apunta a algo distinto de un commit (o un objeto de etiqueta que apunta a (un objeto de etiqueta que apunta a un ...) un commit) .

git push production +1.0.0^{}:master

Estas sintaxis de pelado de etiquetas se describen en git-rev-parse (1) en Especificación de revisiones .

Chris Johnsen
fuente
1
Esto resolvió el problema! Sin embargo, la rama maestra ya debe existir. Sin embargo, este no es un problema de mi parte. ¡Muchas gracias por tu ayuda!
Michael van Rooijen
2
@Michael: Ahh. Sí, si el maestro no existe (como una rama o una etiqueta), git push rep +tag:mastercreará una etiqueta llamada maestro en lugar de una rama. git push rep +tag~0:master(de nuevo, cuando el maestro no existe como una rama o una etiqueta) fallará con "error: no se puede empujar a un destino no calificado". El comando que habría hecho lo que quería (antes de que existiera una rama / etiqueta maestra ) es git push rep +tag~0:refs/heads/master( refs/heads/es el espacio de nombres en el que se almacenan las ramas).
Chris Johnsen
¡EXCELENTE! Eso me ayudará increíblemente bien. ¡Muy conveniente! Muchas gracias por publicar esa información también.
Michael van Rooijen
44
@brad: la ~{commit}sintaxis es literal (es decir, siempre esos nueve caracteres); La palabra commitno es un marcador de posición aquí.
Chris Johnsen
1
ah ok! lo siento, estaba pensando que querías poner un compromiso particular, ahora tiene más sentido.
Brad
469
git push --tags production
bstpierre
fuente
44
Si la etiqueta ya existe en el control remoto, primero deberá eliminarla con git push production :1.0.0.
respectTheCode el
1
Si en cualquier ocasión tiene una rama con el mismo nombre: '1.0.0', este impulso fallará, así que mejor use: git push production :refs/tags/1.0.0para eliminar solo la etiqueta
Vladimir
1
@Nerian: creo que solo empuja etiquetas
bstpierre
55
¿Cómo resuelve esto realmente el problema del póster original sobre sobrescribir una rama con una etiqueta presionándola a la fuerza? Esto simplemente empuja todas sus etiquetas a un control remoto, no sobrescribirá ninguna rama.
1
¿No es la pregunta preguntar cómo empujar una etiqueta? Este comando hace mucho más que eso.
Chris Martin
61

Creo la etiqueta de esta manera y luego la envío a GitHub:

git tag -a v1.1 -m "Version 1.1 is waiting for review"
git push --tags

Counting objects: 1, done.
Writing objects: 100% (1/1), 180 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To [email protected]:neoneye/triangle_draw.git
 * [new tag]         v1.1 -> v1.1
neoneye
fuente
44
empuja todas tus etiquetas
Dawid Drozd
2
Tenga en cuenta que esto en realidad no resolverá el problema del póster original sobre sobrescribir una rama con una etiqueta, solo empujará sus etiquetas a un control remoto, sin afectar las ramas.
10

Para empujar una sola etiqueta: git push <reponame> <tagname>

Por ejemplo, git push production 1.0.0. Las etiquetas no están vinculadas a las ramas, están vinculadas a las confirmaciones.

Cuando desee tener el contenido de la etiqueta en la rama maestra, hágalo localmente en su máquina. Supongo que continuó desarrollando en su rama maestra local. Entonces solo git push origin masterdebería ser suficiente.

koppor
fuente
55
Tenga en cuenta que esto en realidad no resolverá el problema del póster original sobre sobrescribir una rama con una etiqueta, solo empujará sus etiquetas a un control remoto, sin afectar las ramas.