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 " ")
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 llamada release01
en un repositorio Git, la eliminaría de su repositorio haciendo lo siguiente:
git tag -d release01
git push origin :refs/tags/release01
Para eliminar uno de un repositorio de Mercurial:
hg tag --remove featurefoo
Consulte https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551
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:
- Abra su repositorio en SourceTree
- Seleccione y expanda la pestaña "Etiquetas" a la izquierda
- Haga clic derecho en la etiqueta que desea eliminar
- Selecciona "Eliminar YOUR_TAG_NAME"
- 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