¿Cómo se elimina una etiqueta Git que ya se ha enviado?
¿Cómo se elimina una etiqueta Git que ya se ha enviado?
Respuestas:
Solo necesita insertar una referencia 'vacía' al nombre de la etiqueta remota:
git push origin :tagname
O, más expresivamente, use la --delete
opción (o -d
si 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
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.
git push --delete origin tag1 tag2
. Lo mismo es válido para la eliminación de etiquetas localesgit tag -d tag1 tag2
tag
se adjunta a una sola confirmación solamente. Por eso el nombre de la sucursal es irrelevante.
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.
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
git push --delete origin "TAGNAME"
donde TAGNAME es el nombre de la etiqueta original.
tag
antes del nombre de su etiqueta para asegurarse de obtener la etiqueta, no la rama.
refs/tags/
, como esto: refs/tags/v2.3.1
.
Si tiene v0.1.0
que 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.
fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1
...?
:tagname
debería funcionar para la eliminación remota.
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
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
git push --delete origin TAGNAME && git tag -d TAGNAME
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.
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
your_tag_name
del repositorio local .your_tag_name
del repositorio remoto .git tag -d 12345
git push origin :refs/tags/12345
git push --delete origin tagName
git tag -d tagName
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>'
Después de leer estas respuestas mientras necesitaba eliminar más de 11,000 etiquetas, aprendí que estos métodos dependen o xargs
toman demasiado tiempo, a menos que tenga horas para grabar.
Luchando, encontré dos formas mucho más rápidas. Para ambos, comience con git tag
o git ls-remote --tags
para hacer una lista de etiquetas que desea eliminar en el control remoto. En los ejemplos a continuación, puede omitir o reemplazar sorting_proccessing_etc
con cualquier grep
ing, sort
ing, tail
ing o head
ing que desee ( por ejemplo, grep -P "my_regex" | sort | head -n -200
etc. ):
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 push
con 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
).
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 xargs
y 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 " ")
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:
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.
Si ha creado una etiqueta llamada release01
en un repositorio Git, la eliminará de su repositorio haciendo lo siguiente:
git tag -d release01
git push origin :refs/tags/release01
Para eliminar uno de un repositorio Mercurial:
hg tag --remove featurefoo
Consulte https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551
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 $_ }
Como @CubanX sugirió, he dividido esta respuesta de mi original:
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 funcionamiento, pero generalmente paraleliza cualquier comando que le dé mientras le permite establecer límites en la cantidad de procesos. Puede alterar el --jobs 2
pará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 xargs
y git tag -d
, que es suficiente.
git tag | sorting_processing_etc | xargs -L 1 git tag -d
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.
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
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:
$> git-tag-purge.sh tag_name)
Parece mucho trabajo para algo que xargs
ya hace. Mirando hacia atrás a través de este hilo, supongo que la lentitud con la xargs
que experimentaste se debe a que la respuesta original se usaba 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
Tambié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.
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.
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
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)