tag repositorio remote origin eliminar delete crear borrar git git-tag

repositorio - git push tag



¿Cómo borrar una etiqueta remota de git? (19)

¿Cómo eliminar una etiqueta git que ya ha sido empujada?


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

Después de leer estas respuestas mientras necesito eliminar más de 11,000 etiquetas, aprendí a confiar en estos métodos o los xargs tardan demasiado, a menos que tengas horas para grabar.

Luchando, encontré dos maneras mucho más rápidas. Para ambos, comience con git tag o git ls-remote --tags para hacer una lista de las etiquetas que desea eliminar en el control remoto. En los ejemplos a continuación, puede omitir o reemplazar sorting_proccessing_etc con cualquier grep , sort , sorting_proccessing_etc o head 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, tal vez de 20 a 100 veces más rápido que usar 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 ellas precedida por : so. . .

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

El uso de git push con esta etiqueta de formato no empuja nada en cada referencia remota, borrándolo (el formato normal para empujar 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 estos dos métodos, es probable que también desee eliminar sus etiquetas locales. Esto es mucho más rápido, así que podemos volver a usar xargs y git tag -d , lo cual 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 " ")


Eliminar 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


Aquí hay un testcase local para probarlo localmente sin desordenar 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


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

Aquí hay un método que es varias veces más rápido que xargs y 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/"`

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

Después de esto, probablemente querrás eliminar tus etiquetas locales también. Esto es mucho más rápido, así que podemos volver a usar xargs y git tag -d , lo cual es suficiente.

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


Desde tu terminal, haz 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.


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 del manual de git tag, en la sección de Reetiquetado , tiene una buena explicación de cómo informar cortésmente a los demás usuarios del repo remoto sobre el cambio. Incluso brindan una útil plantilla de anuncios para comunicar cómo otras personas deberían obtener sus cambios.


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


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

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

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

xargs puede ejecutar procesos en paralelo también. 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. Puedes experimentar con los argumentos para encontrar lo que funciona mejor para tus necesidades.


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

Eliminar todas las etiquetas remotas y excluir expresiones 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 expresiones de eliminar

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


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

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.
  • Chmod su archivo de script para hacerlo ejecutable.
  • Hacer que el script esté disponible globalmente
  • cd a tu proyecto git
  • Script de llamada (por ejemplo,

    $>git-tag-purge.sh tag_name )


Si está utilizando PowerShell y desea eliminar un montón 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 puedes filtrarlos antes de eliminar:

git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }



Si ha creado una etiqueta que comienza 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, sino que la envolverá en un String Literal como tal.

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

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


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

git push origin :refs/tags/v0.1.0

Si también necesita eliminar la etiqueta localmente:

git tag -d v0.1.0

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


Si usa SourceTree, una excelente GUI de Git, entonces puede hacer esto fácilmente sin la línea de comando 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. Selecciona "Eliminar YOUR_TAG_NAME"
  5. En la ventana de verificación, seleccione "Eliminar etiqueta de 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 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 en la misma confirmación que los orígenes. Luego, repita los pasos anteriores para eliminar en todas partes.


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

git push origin :tagname

O, más expresivamente, use la opción --delete (o -d si su versión de git es más antigua que 1.8.0):

git push --delete origin tagname

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

git tag --delete tagname

Fondo

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

git push where-to-push source-ref:destination-ref

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

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

Que debido a las rutas por defecto, 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), usted presiona "nada" al destino, eliminando la referencia en el extremo remoto.


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

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

Entonces debes usar este comando para borrar 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>''


Una forma más directa es

git push --delete origin YOUR_TAG_NAME

La sintaxis de colon IMO prefixing es un poco extraño en esta situación


Eliminar todas las etiquetas locales y obtener 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