tener - ¿Cómo se cambia el nombre de una etiqueta Git?
¿qué herramienta podemos hacer para tener un mayor control de nuestros proyecto en github? (9)
Así es como renombro una etiqueta old
a new
:
git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tags
Los dos puntos del comando push eliminan la etiqueta del repositorio remoto. Si no hace esto, Git creará la etiqueta antigua en su máquina cuando tire.
Finalmente, asegúrese de que los otros usuarios eliminen la etiqueta eliminada. Dígales (compañeros de trabajo) que ejecuten el siguiente comando:
git pull --prune --tags
Hoy estuve buscando en los registros un proyecto y me di cuenta de que hacía mucho tiempo que había marcado el nombre de una etiqueta. ¿Hay alguna manera de cambiar el nombre de la etiqueta? Google no ha encontrado nada útil.
Me doy cuenta de que podría revisar la versión etiquetada y crear una nueva, incluso lo intenté. Pero eso parece crear un objeto de etiqueta que no está del todo bien. Para uno,
git tag -l
lo pone fuera de servicio en relación con todas las demás etiquetas. No tengo idea de si eso es significativo, pero me lleva a creer que el nuevo objeto de etiqueta no es exactamente lo que quiero. Puedo vivir con eso, porque realmente solo me importa que el nombre de la etiqueta coincida con la documentación, pero prefiero hacerlo "bien", asumiendo que hay una forma correcta de hacerlo.
Como un agregado a las otras respuestas, agregué un alias para hacerlo todo en un solo paso, con una sensación de comando de movimiento más familiar * nix. El argumento 1 es el nombre antiguo de la etiqueta, el argumento 2 es el nombre nuevo de la etiqueta.
[alias]
renameTag = "!sh -c ''set -e;git tag $2 $1; git tag -d $1;git push origin :refs/tags/$1;git push --tags'' -"
Uso:
git renametag old new
Independientemente de los problemas relacionados con las etiquetas de inserción y el cambio de nombre de las etiquetas que ya se han enviado, en caso de que la etiqueta para cambiar el nombre sea una anotada , primero puede copiarla gracias a la siguiente línea de comando de una sola línea:
git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}
Entonces, solo necesitas borrar la etiqueta antigua:
git tag -d old_tag
Encontré esta línea de comando gracias a las siguientes dos respuestas:
- https://.com/a/26132640/7009806 (segundo comentario)
- https://.com/a/49286861/7009806
Editar:
Habiendo encontrado problemas al usar la sincronización automática de etiquetas configurando fetch.pruneTags=true
(como se describe en https://.com/a/49215190/7009806 ), personalmente sugiero copiar primero la nueva etiqueta en el servidor y luego eliminar la antigua uno. De esa manera, la nueva etiqueta no se elimina aleatoriamente al eliminar la etiqueta antigua y una sincronización de las etiquetas desearía eliminar la nueva etiqueta que aún no está en el servidor . Entonces, por ejemplo, todos juntos obtenemos:
git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}
git push --tags
git tag -d old_tag
git push origin :refs/tags/old_tag
La parte fácil es cambiar el nombre de las etiquetas locales. La parte más dura es la remota. La idea detrás de este truco es duplicar la etiqueta / rama antigua en una nueva y eliminar la anterior, sin pagar.
Cambio de nombre de etiqueta remota / rama remota → conversión de etiqueta: (Aviso :refs/tags/
)
git push <remote_name> <old_branch_or_tag>:refs/tags/<new_tag> :<old_branch_or_tag>
Cambio de nombre de rama remota / Etiqueta remota → Conversión de rama: (Aviso :refs/heads/
)
git push <remote_name> <old_branch_or_tag>:refs/heads/<new_branch> :<old_branch_or_tag>
Salida renombrando una etiqueta remota:
D:/git.repo>git push gitlab App%2012.1%20v12.1.0.23:refs/tags/App_12.1_v12.1.0.23 :App%2012.1%20v12.1.0.23
Total 0 (delta 0), reused 0 (delta 0)
To https://gitlab.server/project/repository.git
- [deleted] App%2012.1%20v12.1.0.23
* [new tag] App%2012.1%20v12.1.0.23 -> App_12.1_v12.1.0.23
La pregunta original era cómo cambiar el nombre de una etiqueta, lo cual es fácil: primero crea NUEVO como un alias de OLD: git tag NEW OLD
luego elimina OLD: git tag -d OLD
.
La cita relativa a "the Git way" y (in) sanity está fuera de la base, porque se trata de preservar un nombre de etiqueta, pero hacer que se refiera a un estado de repositorio diferente.
Para los aventureros se puede hacer en una orden:
mv .git/refs/tags/OLD .git/refs/tags/NEW
Si se publica, no puede eliminarlo (sin arriesgarse a ser tarado y emplumado, es decir). La ''forma Git'' es hacer:
La cosa sana. Solo admito que la cagaste, y usa un nombre diferente. Otros ya han visto un nombre de etiqueta, y si mantienes el mismo nombre, puedes estar en la situación de que dos personas tienen la "versión X", pero en realidad tienen una "X" diferente. Así que solo llámalo "X.1" y termina con eso.
Alternativamente,
Lo insano. Realmente quieres llamar a la nueva versión "X" también, aunque otros ya hayan visto la versión anterior. Así que solo usa git-tag -f de nuevo, como si no hubieses publicado la anterior.
Es una locura porque:
Git no (y no debería) cambiar las etiquetas detrás de los usuarios. Entonces, si alguien ya tiene la etiqueta antigua, hacer un trocito en tu árbol no debería hacer que se sobrescriba la anterior.
Si alguien obtuvo una etiqueta de lanzamiento de usted, no puede simplemente cambiar la etiqueta para ellos actualizando su propia etiqueta. Este es un gran problema de seguridad, ya que las personas DEBEN poder confiar en sus nombres de etiquetas. Si realmente quieres hacer una locura, solo tienes que confesar y decirle a la gente que lo arruinaste.
Todo cortesía de las páginas del manual .
Esta página wiki tiene esta interesante frase de una línea, que nos recuerda que podemos impulsar varios refs :
git push origin <refs/tags/old-tag>:<refs/tags/new-tag> :<refs/tags/old-tag> && git tag -d <old-tag>
y pedir a otros clonadores que hagan
git pull --prune --tags
Así que la idea es empujar:
-
<new-tag>
para cada confirmación referenciada por<old-tag
>:<refs/tags/old-tag>:<refs/tags/new-tag>
, - la eliminación de
<old-tag>
:<refs/tags/old-tag>
Vea como ejemplo "¿ Cambiar la convención de nomenclatura de etiquetas dentro de un repositorio de git? ".
Además de las otras respuestas:
Primero debe crear un alias con el nombre de la etiqueta anterior, apuntando a la confirmación original:
git tag new old^{}
Entonces necesitas eliminar el antiguo localmente :
git tag -d old
Luego borre la etiqueta en su (s) ubicación (es) remota (s):
# Check your remote sources:
git remote -v
# The argument (3rd) is your remote location,
# the one you can see with `git remote`. In this example: `origin`
git push origin :refs/tags/old
Finalmente, debe agregar su nueva etiqueta a la ubicación remota. Hasta que haya hecho esto, no se agregarán las nuevas etiquetas:
git push origin --tags
Iterar esto para cada ubicación remota.
¡Sea consciente de las implicaciones que un cambio de etiqueta Git tiene para los consumidores de un paquete!