¿Cómo eliminar una etiqueta remota?

3421

¿Cómo se elimina una etiqueta Git que ya se ha enviado?

Markdorison
fuente

Respuestas:

5755

Solo necesita insertar una referencia 'vacía' al nombre de la etiqueta remota:

git push origin :tagname

O, más expresivamente, use la --deleteopción (o -dsi su versión de git es anterior a 1.8.0):

git push --delete origin tagname

Tenga en cuenta que git tiene espacio de nombre de etiqueta y espacio de nombre de rama, por lo que puede usar el mismo nombre para una rama y para una etiqueta. Si desea asegurarse de que no puede eliminar accidentalmente la rama en lugar de la etiqueta, puede especificar la referencia completa que nunca eliminará una rama:

git push origin :refs/tags/tagname

Si también necesita eliminar la etiqueta local, use:

git tag --delete tagname

Antecedentes

Empujar una rama, etiqueta u otra referencia a un repositorio remoto implica especificar "¿qué repositorio, qué fuente, qué destino?"

git push remote-repo source-ref:destination-ref

Un ejemplo del mundo real en el que empuja su rama maestra a la rama maestra del origen es:

git push origin refs/heads/master:refs/heads/master

Que debido a las rutas predeterminadas, se puede acortar a:

git push origin master:master

Las etiquetas funcionan de la misma manera:

git push origin refs/tags/release-1.0:refs/tags/release-1.0

Que también se puede acortar a:

git push origin release-1.0:release-1.0

Al omitir la referencia de origen (la parte anterior a los dos puntos), empuja 'nada' al destino, eliminando la referencia en el extremo remoto.

Adam Franco
fuente
187
+1 por responder a la pregunta y explicar el caso general, y detallar el significado de la sintaxis íntegra
Peter Host,
77
Y en caso de que alguien se pregunte cómo eliminar varias etiquetas a la vez, simplemente haga una lista con espacios en blanco, por ejemplo git push --delete origin tag1 tag2. Lo mismo es válido para la eliminación de etiquetas localesgit tag -d tag1 tag2
dVaffection,
8
Si el nombre de la etiqueta colisiona con el nombre de una sucursal, puede terminar eliminando su sucursal. Jaja. Vea la segunda respuesta: es más ecológico
zuba
1
@EmmaHe A tagse adjunta a una sola confirmación solamente. Por eso el nombre de la sucursal es irrelevante.
cb2
1
También es interesante saber que git tag -d `git tag`eliminará todas las etiquetas locales. Lo mismo aplica para git push --delete origin `git tag`suponer que sacó las etiquetas remotas localmente. Eso fue útil en un entorno de prueba.
DarkFranX
383

Una forma más directa es

git push --delete origin YOUR_TAG_NAME

La sintaxis de colon con prefijo de la OMI es un poco extraña en esta situación

quexer
fuente
44
Creo que esta es la forma correcta ... otra sintaxis se parece más a un truco para mí.
Luigi R. Viggiano
11
Sí, esto es simple y funciona. Aunque aclararía la respuesta especificando cuál es la parte variable:, git push --delete origin "TAGNAME"donde TAGNAME es el nombre de la etiqueta original.
Teemu Leisti
12
Esto funciona. Una adición: si tiene una rama y una etiqueta con el mismo nombre, puede poner la palabra tagantes del nombre de su etiqueta para asegurarse de obtener la etiqueta, no la rama.
andypaxo
99
@andypaxo Lo que el comando toma es refspecs, la forma correcta sería prefijando las etiquetas con refs/tags/, como esto: refs/tags/v2.3.1.
p3lim
Tenía un nombre de etiqueta 'malo' creado en el servidor remoto de alguna manera, que tenía caracteres especiales, por lo que no puedo sincronizar con eso, así que simplemente eliminé eso con su sugerencia: git push --delete origin "service-- <default> - 151 ", no se puede eliminar ni con intellij, ni con stash, ni con sourceTree. Gracias !
Dmitri Algazin
215

Si tiene v0.1.0que eliminar una etiqueta remota y su control remoto es origin, simplemente:

git push origin :refs/tags/v0.1.0

Si también necesita eliminar la etiqueta localmente:

git tag -d v0.1.0

Vea la respuesta de Adam Franco para una explicación de la :sintaxis inusual de Git para su eliminación.

Alex Dean
fuente
2
Esto también funciona con jgit. the: taquigrafía tag no funciona con jgit
rynop
Tengo fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1...?
Chaim Eliyah
3
@ChaimEliyah tienes una barra diagonal, tal vez ese sea tu problema
Joffrey
55
Mejor respuesta, ya que esto también funciona si tiene una rama y una etiqueta que se llama igual.
Erik A. Brandstadmoen
Solo :tagnamedebería funcionar para la eliminación remota.
Acumenus
106

Elimine todas las etiquetas locales y obtenga la lista de etiquetas remotas :

git tag -l | xargs git tag -d
git fetch

Eliminar todas las etiquetas remotas

git tag -l | xargs -n 1 git push --delete origin

Limpiar etiquetas locales

git tag -l | xargs git tag -d
Siddhartha Mukherjee
fuente
2
Cómo eliminar todas las etiquetas de los repositorios locales y remotos. Esto es lo que estaba buscando, gracias!
Jorge Orpinel
git fetch, borra el control remoto y luego limpia los locales, ¡funcionó maravillosamente!
DiegoRBaquero
lento, pero el más directo
Lucent Fox
34

Para eliminar la etiqueta del repositorio remoto:

git push --delete origin TAGNAME

También es posible que desee eliminar la etiqueta localmente:

git tag -d TAGNAME
Andrea
fuente
por lo que una línea a hacer ambas cosas:git push --delete origin TAGNAME && git tag -d TAGNAME
sakurashinken
25

Desde su terminal, haga esto:

git fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}

Ahora ve a Github.com y actualiza, desaparecen.

Mahmoud Zalt
fuente
3
git tag not tags
DSF
23
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
  1. Primera línea, elimina your_tag_namedel repositorio local .
  2. Segunda línea, elimina your_tag_namedel repositorio remoto .
  3. Presione el botón Descartar borrador en la sección de versiones de GitHub .

ingrese la descripción de la imagen aquí

kokabi
fuente
2
Si bien este comando puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo. Cómo responder
Popo
20

Eliminar la etiqueta local '12345'

git tag -d 12345

Eliminar la etiqueta remota '12345' (por ejemplo, la versión de GitHub también)

git push origin :refs/tags/12345

Enfoque alternativo

git push --delete origin tagName
git tag -d tagName

ingrese la descripción de la imagen aquí

LYES - CHIOUKH
fuente
15

Solo tenga en cuenta que, si tiene una rama remota nombrada como etiqueta remota, estos comandos son ambiguos:

git push origin :tagname
git push --delete origin tagname

Por lo tanto, debe usar este comando para eliminar la etiqueta:

git push origin :refs/tags/<tag>

y este para borrar la rama:

git push origin :refs/heads/<branch>

Si no, obtendrías un error como este:

error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'
Alex Vazquez Fente
fuente
Corto y conciso. Esta publicación junto con la de MeganZhou apareció como la respuesta a por qué estábamos teniendo problemas, el nombre de la sucursal y el nombre de la etiqueta eran idénticos. Eliminé la etiqueta local y presioné a: refs / tags y todo estuvo bien.
rwheadon
12

Método hasta 100 veces más rápido para miles de etiquetas remotas

Después de leer estas respuestas mientras necesitaba eliminar más de 11,000 etiquetas, aprendí que estos métodos dependen o xargstoman demasiado tiempo, a menos que tenga horas para grabar.

Luchando, encontré dos formas mucho más rápidas. Para ambos, comience con git tago git ls-remote --tagspara hacer una lista de etiquetas que desea eliminar en el control remoto. En los ejemplos a continuación, puede omitir o reemplazar sorting_proccessing_etccon cualquier greping, sorting, tailing o heading que desee ( por ejemplo, grep -P "my_regex" | sort | head -n -200 etc. ):


Este primer método es, con mucho, el más rápido, quizás de 20 a 100 veces más rápido que el uso xargs, y funciona con al menos varios miles de etiquetas a la vez.

git push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh

¿Como funciona esto? La lista normal de etiquetas separadas por líneas se convierte en una sola línea de etiquetas separadas por espacios, cada una de las cuales se antepone :. . .

tag1   becomes
tag2   ======>  :tag1 :tag2 :tag3
tag3

El uso git pushcon esta etiqueta de formato no empuja nada en cada referencia remota, borrándola (el formato normal para presionar de esta manera es local_ref_path:remote_ref_path).

El método dos se desglosa como una respuesta separada en otra parte de esta misma página


Después de ambos métodos, es probable que también desee eliminar sus etiquetas locales. Esto es mucho más rápido, por lo que podemos volver a usar xargsy git tag -d, que es suficiente.

git tag | sorting_processing_etc | xargs -L 1 git tag -d

O similar a la eliminación remota:

git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")
TonyH
fuente
Debe dividir esto en algunas respuestas diferentes. La respuesta con múltiples etiquetas en una línea es, sin duda, la respuesta correcta para la eliminación masiva de etiquetas. En realidad, es un poco difícil encontrar esta información en casi cualquier otro lugar. Incluso sabiendo lo que estoy buscando, me resulta difícil encontrarlo en la página de ayuda de git :) Así que felicitaciones y resalte eso como la respuesta correcta, y mueva la API de GitHub a un lugar diferente. Y, por último, la eliminación local de etiquetas, a granel, funciona con etiquetas delimitadas por espacios (deshacerse de los dos puntos)
CubanX
Gracias por los elogios y sugerencias. Voy a dividir esto. No entiendo tu comentario sobre la eliminación de etiquetas locales. No creo que mi fragmento de comando final use dos puntos, pero estoy en el móvil, así que tal vez me falte algo.
TonyH
Lo siento, solo quise decir que lo que está haciendo para eliminar etiquetas remotas funciona con la eliminación de etiquetas locales, proporcionando la lista completa de una vez. :) Justo en lugar de git push origin: tag1: tag2, etc., harías git tag --delete tag1 tag2 tag3 de esa manera puedes tener una limpieza total. De nuevo, muchas gracias!
CubanX
11

Si usa SourceTree, una gran interfaz gráfica de usuario de Git, puede hacerlo fácilmente sin la línea de comandos haciendo lo siguiente:

  1. Abra su repositorio en SourceTree
  2. Seleccione y expanda la pestaña "Etiquetas" a la izquierda
  3. Haga clic derecho en la etiqueta que desea eliminar
  4. Seleccione "Eliminar YOUR_TAG_NAME"
  5. En la ventana de verificación, seleccione "Eliminar etiqueta de controles remotos"

YOUR_TAG_NAME ahora se eliminará de su repositorio local y de todos los controles remotos, ya sea GitHub, BitBucket o en cualquier otro lugar que haya incluido como control remoto para ese repositorio.

Además, si eliminó una etiqueta localmente pero no en los orígenes remotos, y desea eliminarla en todas partes, simplemente cree una nueva etiqueta que tenga el mismo nombre y se adjunte al mismo compromiso que los orígenes. Luego, repita los pasos anteriores para eliminar en todas partes.

Chris Sprague
fuente
Funciona de maravilla. ¡Gracias!
Native_Mobile_Arch_Dev
7

Si está utilizando PowerShell y desea eliminar algunos de ellos:

# Local tags:
git tag -l | foreach { git tag -d $_ }

# Remote tags:
git tag -l | foreach { git push --delete origin $_ }

Por supuesto, también puede filtrarlos antes de eliminar:

git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }
rsenna
fuente
Ese fue un buen ejemplo de expresión regular. Gracias buen señor
Yunus
7

Como @CubanX sugirió, he dividido esta respuesta de mi original:

Aquí hay un método que es varias veces más rápido xargsy puede escalar mucho más con ajustes. Utiliza la API de Github , un token de acceso personal, y aprovecha la utilidad parallel.

git tag | sorting_processing_etc | parallel --jobs 2 curl -i -X DELETE \ 
https://api.github.com/repos/My_Account/my_repo/git/refs/tags/{} -H 
\"authorization: token GIT_OAUTH_OR_PERSONAL_KEY_HERE\"  \
-H \"cache-control: no-cache\"`

paralleltiene muchos modos de funcionamiento, pero generalmente paraleliza cualquier comando que le dé mientras le permite establecer límites en la cantidad de procesos. Puede alterar el --jobs 2parámetro para permitir una operación más rápida, pero tuve problemas con los límites de velocidad de Github , que actualmente son 5000 / h, pero también parece tener un límite a corto plazo no documentado.


Después de esto, probablemente también quieras eliminar tus etiquetas locales. Esto es mucho más rápido, por lo que podemos volver a usar xargsy git tag -d, que es suficiente.

git tag | sorting_processing_etc | xargs -L 1 git tag -d
TonyH
fuente
Esto parece mucho más complicado que la respuesta aceptada. ¿Cuál es el beneficio?
theUtherSide
2
Si necesita eliminar varios miles de etiquetas, entonces la velocidad es 10-100 veces más rápida
TonyH
Gracias por la aclaración. El OP preguntó sobre la eliminación de una sola etiqueta. No podía imaginar por qué alguien usaría este enfoque para una sola etiqueta. Tal vez esta respuesta sea mejor para otra pregunta que implique la eliminación de muchas etiquetas
theUtherSide
No creo que exista. Podría crearlo para responderme a mí mismo. ¿Quieres pensar que es apropiado?
TonyH
1
¡Hago! Creo que es una práctica bastante común aquí, en realidad.
theUtherSide
6

Las otras respuestas señalan cómo lograr esto, pero debe tener en cuenta las consecuencias ya que este es un repositorio remoto.

La página de manual de git tag, en la sección On Retagging , tiene una buena explicación de cómo informar cortésmente a los otros usuarios del repositorio remoto del cambio. Incluso dan una plantilla de anuncio útil para comunicar cómo otros deberían obtener sus cambios.

Richard Venable
fuente
6

Quería eliminar todas las etiquetas, excepto las que coinciden con un patrón para poder eliminar todas las etiquetas de producción, excepto los últimos dos meses, esto es lo que usé con gran éxito:

Eliminar todas las etiquetas remotas y excluir la expresión de Eliminar

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin

Eliminar todas las etiquetas locales y excluir la expresión de Eliminar

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d
Lucent Fox
fuente
5

Script simple para eliminar la etiqueta dada de las ubicaciones locales y de origen. Con un cheque si la etiqueta realmente existe.

if [ $(git tag -l "$1") ]; then
    git tag --delete  $1
    git push --delete origin $1

    echo done.
else
    echo tag named "$1" was not found
fi

Cómo utilizar:

  • Cree un archivo de script de shell (por ejemplo, git-tag-purge.sh) y pegue el contenido.
  • Cambie su archivo de script para hacerlo ejecutable.
  • Hacer que el script esté disponible globalmente
  • cd a tu proyecto git
  • Script de llamada (p. Ej.
    $> git-tag-purge.sh tag_name
    )
Dimitar Vlasev
fuente
4

Parece mucho trabajo para algo que xargsya hace. Mirando hacia atrás a través de este hilo, supongo que la lentitud con la xargsque experimentaste se debe a que la respuesta original se usaba xargs -n 1cuando realmente no era necesario.

Esto es equivalente a su método uno, excepto que xargstrata automáticamente con la longitud máxima de la línea de comando:

git tag | sorting_processing_etc | xargs git push --delete origin

xargsTambién puede ejecutar procesos en paralelo. Método 2 con xargs:

git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin

Lo anterior utiliza un máximo de 5 procesos para manejar un máximo de 100 argumentos en cada proceso. Puede experimentar con los argumentos para encontrar lo que funciona mejor para sus necesidades.

HomerM
fuente
Interesante. Aprendes algo nuevo sobre un comando Unix todos los días. Necesitaré probar mi caso de uso con esta alternativa.
TonyH
4

Si tiene una etiqueta creada comenzando con el carácter # , por ejemplo #ST002, es posible que no pueda eliminar usando patrones normales. es decir

git tag -d #STOO2

No eliminará la etiqueta, pero la envolverá en un String Literal así

git tag -d "#ST002" or git tag -d '#ST002'

Eso lo eliminará. Esperando que ayude a alguien que cometió el error de usar # para escribir nombres de etiquetas.

MernXL
fuente
2

Aquí hay un caso de prueba local para probarlo localmente sin jugar con un control remoto:

~/p $ mkdir gittest    
~/p/git $ cd gittest/
~/p/gittest $ git init
Initialized empty Git repository in /Users/local_user/p/gittest/.git/
 ~/p/gittest $ touch testfile.txt
 ~/p/gittest $ git add testfile.txt
 ~/p/gittest $ git commit -m "initial commit"
[master (root-commit) 912ce0e] initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 testfile.txt
 ~/p/gittest $ git tag
 ~/p/gittest $ git tag -a testtag
 ~/p/gittest $ git tag
testtag
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
 ~/p/gittest $ cd ..
 ~/p $ mkdir gitbare
 ~/p $ cd gitbare
 ~/p/gitbare $ git init --bare
Initialized empty Git repository in /Users/local_user/p/gitbare/
 ~/p/gitbare $ cd ..
 ~/p $ cd gittest/
 ~/p/gittest $ git remote add origin /Users/local_user/p/gitbare
 ~/p/gittest $ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 215 bytes | 215.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
 ~/p/gittest $ git push origin testtag
Counting objects: 1, done.
Writing objects: 100% (1/1), 163 bytes | 163.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
 * [new tag]         testtag -> testtag
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
 ~/p/gittest $ git push -d origin testtag
To /Users/local_user/p/gitbare
 - [deleted]         testtag
 ~/p/gittest    git tag -d testtag
Deleted tag 'testtag' (was b0a6c15)
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
 ~/p/gittest
Adnan Y
fuente
1

Hola, solo quería compartir un alias que creé que hace lo mismo:

Agregue lo siguiente a su ~ / .gitconfig

[alias]
    delete-tag = "!f() { \
            echo 'deleting tag' $1 'from remote/origin ausing command: git push --delete origin tagName;'; \
            git push --delete origin $1; \
            echo 'deleting tag' $1 'from local using command: git tag -d tagName;'; \
            git tag -d $1; \
        }; f"

El uso se ve así:

-->git delete-tag v1.0-DeleteMe
deleting tag v1.0-DeleteMe from remote/origin ausing command: git push --delete origin tagName;
To https://github.com/jsticha/pafs
 - [deleted]             v1.0-DeleteMe
deleting tag v1.0-DeleteMe from local using command: git tag -d tagName;
Deleted tag 'v1.0-DeleteMe' (was 300d3ef22)
ranma2913
fuente