git delete remotes: las referencias remotas no existen

107

En breve;

  • ¿Cómo puedo eliminar múltiples controles remotos fusionados?

Más antecedentes;

Tengo un repositorio de git con decenas de controles remotos que se han fusionado en master. Puedo eliminar estos controles remotos uno a la vez usando:

git push --delete origin myBranch-1234

Sin embargo, este es un proceso lento y tedioso para todos los controles remotos. Entonces estoy probando este comando:

git branch -r --merged | grep origin | grep -v master | xargs git push origin --delete

git branch -r --mergedenumera todos los controles remotos fusionados.
grep originle dice al comando que incluya el origen.
grep -v masterle dice al comando que excluya al maestro.
xargs git push origin --deletele dice al comando que elimine la lista de controles remotos.

En conjunto, espero que esto reúna todos los controles remotos fusionados y los elimine.

Cuando ejecuto el comando anterior, recibo lo siguiente por cada control remoto combinado;

error: unable to delete 'origin/myBranch-1234': remote ref does not exist
error: unable to delete 'origin/myBranch-1235': remote ref does not exist
error: unable to delete 'origin/myBranch-1236': remote ref does not exist
error: unable to delete 'origin/myBranch-1237': remote ref does not exist
... etc

Sin embargo, estos controles remotos existen y puedo verificar cada uno de ellos. Muchos sitios y personas recomiendan que corra git fetch --prunepara limpiar las referencias faltantes. Esto no hace nada porque existen todos estos controles remotos.

Así que te pregunto, querido intercambio de pilas;

  • ¿Por qué puedo eliminar un control remoto, pero no muchos?
  • ¿Es correcto mi comando?

Creo que me falta algo pequeño. Cada vez que investigo esto, parece que lo estoy haciendo correctamente, pero recibo los errores anteriores.

Jqw
fuente

Respuestas:

226

Es posible que primero deba podar su "caché" local de ramas remotas. Intenta ejecutar:

git fetch -p origin

antes de eliminar.

Igor
fuente
2
Eso me solucionó, ¡gracias! Sin embargo, ¿por qué no se actualiza cuando busco sin él --prune? En mi opinión, eso es bastante engañoso
dave0688
6
Solo una nota para las personas que llegan aquí después de una búsqueda; si bien esto es claramente útil para la mayoría que aterriza aquí, en realidad no es correcto en términos del problema original, el problema del OP era que su comando se incluyó incorrectamente origin/en los nombres de las sucursales, como se describe / resuelto en otras respuestas.
CupawnTae
104

¿Se eliminan esas ramas del remoto (origen)? Si es así, simplemente puede hacer

git fetch --prune origin

De lo contrario, podrían volver incluso después de eliminarlos localmente.

Actualización: mirando su comando nuevamente, parece que lo está construyendo incorrectamente. Probablemente quieras

git push origin --delete myBranch-1234

pero en cambio estás haciendo algo como

git push origin --delete origin/myBranch-1234
Mykola Gurov
fuente
Ninguna de las ramas se elimina en origen. Puedo revisar cualquiera de ellos.
Jqw
1
sí, porque ejecutas diferentes comandos en el segundo caso.
Mykola Gurov
1
No entiendo tu punto. Sé que estoy usando dos comandos diferentes. El segundo caso es obtener todos los controles remotos fusionados con git branch -r --mergedy luego estoy tratando de eliminarlos con xargs git push origin --delete. El comando está intentando eliminar los controles remotos, excepto que cree que remote ref does not exist.
Jqw
1
en su segundo comando canalizado, coloque echo junto a xargspara ver qué se ejecuta realmente.
Mykola Gurov
2
@Jqw No puede incluir el origin/prefijo en el nombre de la rama, git ya sabe que está trabajando con las ramas de origen desde que está ejecutando git push origin. La sugerencia de Mykola fue hacer la última parte del comando xargs echo, en lugar de echo xargs [...].
Matthew Read
15

Use sedpara eliminar la parte 'origen /' y cambiar una xargsparte lttile .

git branch -r --merged | grep origin | grep -v -e master | sed s/origin\\/// |  xargs -I{} git push origin --delete {}
kost
fuente