¿Cómo eliminas una referencia de rama remota no válida de Git?

731

En mi repositorio actual tengo el siguiente resultado:

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master

Quiero eliminar remotes/public/masterde la lista de sucursales:

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.

Además, la salida de git remotees extraña, ya que no enumera public:

$ git remote show 
origin

¿Cómo puedo eliminar 'remotes / public / master' de la lista de sucursales?

Actualización, probé el git pushcomando:

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
cmcginty
fuente
31
¿Funcionó git remote prune [remote-name]o git fetch -p [remote-name]no en su escenario? Hacerlo git gces mucho más contundente de lo que normalmente se necesita.
rjmunro
66
git remote prune [remote-name]no funcionará con git svn, aunque tampoco git gc... git branch -rd origin/namefunciona. @Casey, probablemente deberías seleccionar la segunda respuesta, es un poco menos peligroso.
naught101
44
Me encanta esta pregunta Volviendo casi todos los meses
oluckyman
Relacionados, si no es un objetivo duplicado: elimine una rama de Git tanto local como remotamente .
2
Para evitar el error n00b gitter en el futuro, recomiendo usar una rama de ejemplo diferente a master... particularmente al eliminar en el control remoto.
ausencia

Respuestas:

743

Es posible que necesite una limpieza:

git gc --prune=now

o tal vez necesites una ciruela:

git remote prune public

ciruela pasa

Elimina todas las ramas de seguimiento obsoletas en <nombre>. Estas ramas obsoletas ya se han eliminado del repositorio remoto al que hace referencia <nombre>, pero aún están disponibles localmente en "remotes / <nombre>".

Con la opción --dry-run, informe qué ramas se podarán, pero en realidad no las pode.

Sin embargo, parece que estos deberían haberse limpiado antes con

git remote rm public 

rm

Elimine el control remoto llamado <nombre>. Se eliminan todas las ramas de seguimiento remoto y los ajustes de configuración para el control remoto.

Por lo tanto, es posible que haya editado a mano su archivo de configuración y esto no ocurrió, o que tenga problemas de privilegios.

Tal vez vuelva a ejecutar eso y vea qué sucede.


Contexto de asesoramiento

Si echa un vistazo a los registros de revisión , notará que sugerí más técnicas "correctas", que por cualquier razón no quisieron trabajar en su repositorio.

Sospeché que el OP había hecho algo que dejó su árbol en un estado inconsistente que causó que se comportara un poco extraño, y git gcse requirió que arreglara la parte trasera izquierda.

Por lo general git branch -rd origin/badbranch es suficiente para bombardear una rama de seguimiento local o git push origin :badbranchpara bombardear una rama remota, y por lo general tendrá que nunca necesidad de llamargit gc

Kent Fredric
fuente
44
No quiero eliminar la rama en el lado remoto. Creo que hay una sutil diferencia.
cmcginty el
2
er, la pregunta es efectivamente preguntar "¿cómo elimino una rama remota"? Eso es lo que son esos caminos.
Kent Fredric el
1
Reformularé el tema si eso deja más claro lo que estoy preguntando, pero el comando muestra exactamente cuál es mi problema.
cmcginty el
40
git gcno es necesario aquí, pero git remote pruneme hace sentir más seguro que eliminar cosas manualmente git branch -rd, ya que git está verificando qué ramas remotas están hechas.
Mike Seplowitz el
3
esto no funcionó para mí, sin embargo, el 'git branch -rd' funcionó bien.
dsummersl
683

Todo lo que necesitas hacer es

git fetch -p

Eliminará todas sus sucursales locales que se eliminan de forma remota.

Si está en git 1.8.5+, puede configurarlo automáticamente

git config fetch.prune true

o

git config --global fetch.prune true
Pawan Maheshwari
fuente
77
Esto es lo que estaba buscando también: la pregunta es describir un escenario más complicado que el común.
rjmunro
22
Estoy buscando una forma de eliminar las sucursales locales donde se ha eliminado el control remoto correspondiente, pero esto no funciona para mí. ¿Alguna idea de por qué?
jackocnr
11
Esto elimina las ramas enumeradas en remoto / origen pero no elimina las ramas de seguimiento local, lo cual es igual de importante.
BlueRaja - Danny Pflughoeft
@Cupcake Dado que no revertió mi primera edición (que estaba arreglando la información incorrecta sobre Git 1.8.5+), ahora ha hecho esto incorrecto. Mi segunda edición fue corregir lo que puse que era incorrecto, que ahora está allí nuevamente (con su reversión). Continúa y retrocede una edición más para tener el original. Gracias.
ferventcoder
@ferventcoder Revisé su última edición y volví a ella. El OP puede retroceder nuevamente si no le gusta. Gracias.
319
git push public :master

Esto eliminaría la rama remota nombrada mastercomo Kent Fredric ha señalado.

Para enumerar ramas de seguimiento remoto:

git branch -r

Para eliminar una rama de seguimiento remoto:

git branch -rd public/master
Alan Haggai Alavi
fuente
66
Esto me ayudó a eliminar una rama fantasma remota git-svn.
Nick
99
git branch -rd removed_remote/branchfuncionó para mí, mientras que el no git gc --prune=nowvalía nada.
rchampourlier
2
He podido usar git prunesin ningún problema, pero mi compañero de trabajo que bifurcó nuestro repositorio principal ** PODRÍA SOLO ** usar la git branch -rd public/mastersolución de estilo para limpiar su entorno.
Abel
3
git branch -rd public/masterera lo que me faltaba. Tuve heroku/mastery herkou/master... lol woops
Aaron
@rchampourlier No es 100% inútil: si su repositorio de git es grande, eliminar las ramas no utilizadas puede liberar mucho espacio en disco en algunas situaciones.
peterh - Restablecer Monica
159

Todo lo que necesitas hacer es

$ git branch -rd origin/whatever 

Es así de simple. No hay razón para llamar a un gc aquí.

jpswain
fuente
1
¿Cómo "empujas" esa eliminación a github?
Thufir
14
@Thufir De eso no se trataba esta pregunta. Esta pregunta fue específica para situaciones en las que tiene una referencia remota no válida en el repositorio local, pero esa rama ya no existe en el servidor remoto. La respuesta a su pregunta es el origen de $ git push: lo que sea
jpswain
Sí, si algo sucede en el repositorio remoto donde se elimina una rama, pero aún tiene referencia a esa rama remota en su máquina local, entonces necesitaría hacer lo que puse en mi respuesta original para limpiarla.
jpswain
66
Si tiene un gran trabajo de limpieza (muchos controles remotos colgantes), puede eliminar todas las ramas remotas con algo así como git branch -rd $(git branch -r)luego restablecer las válidas haciendo una búsqueda.
nobar
Mi situación era que había git config -ecambiado el nombre de mi control remoto. Cambié el nombre del control remoto minea origin. Entonces, esta fue la solución que mejor funcionó para mí:git branch -rd $(git branch -r | grep 'mine/')
Steven Lu
70

git gc --prune=now no es lo que quieres

git remote prune public

o git remote prune origin# si esa es la fuente remota

es lo que quieres

tongueroo
fuente
66
@Casey $ git gc # le gusta una desfragmentación para que los archivos git aceleren el repositorio $ git remote prune origin # limpiará la eliminación de las ramas remotas obsoletas que aparecen con "git branch -r | grep origin". Eso es lo que pregunta, creo. Entonces, los comandos son totalmente diferentes.
tongueroo
29

La respuesta aceptada no funcionó para mí cuando el árbitro estaba lleno. Esto sin embargo:

$ git remote add public http://anything.com/bogus.git
$ git remote rm public
Chris
fuente
Trabajó para mi. La rama regular git -d no funcionaba, devolvió el error de que la rama no existe, porque eliminé el origen llamado "original", que se creó por error, directamente en el archivo .git / config.
micrub
Este es el método que tuve que usar para eliminar ramas que fueron omitidas inadvertidamente de mi .git / config (que tuvo que ser reconstruido debido a una corrupción no relacionada). ¡Es una lástima que esta respuesta estuviera tan abajo en la cadena que no me di cuenta hasta que por fin encontré la solución y la agregué a la respuesta aceptada!
taranaki
Esto es lo que necesitaba después de usar svn2git. Hubo muchas ramas remotas / svn / *. Tuve que crear un falso 'svn' remoto primero.
Sam
7

En mi caso, estaba tratando de eliminar las entradas guardadas en .git/packed-refs. Puede editar este archivo de texto sin formato y eliminar las entradas que git br -Dno saben tocar (al menos en la versión 1.7.9.5).

Encontré esta solución aquí: https://stackoverflow.com/a/11050880/1695680

ThorSummoner
fuente
wow, esto me ayudó. Mi colega intentó, reinició VS, reinició su computadora, nada funcionó, eliminó su repositorio local y sacó todo para deshacerse de esto :)
Esen
1
Hoy aprendí que este archivo de referencias empaquetadas se crea como parte de git gc, cuando empaqueta sus confirmaciones en un archivo altamente comprimido, también mueve las referencias a un solo archivo de texto sin formato, posiblemente con fines de optimización; Espero que las futuras versiones de git puedan git br -D ...contener referencias.
ThorSummoner
3

No lo sabía git branch -rd, así que la forma en que he resuelto problemas como este es tratar mi repositorio como un repositorio remoto y eliminarlo de forma remota. git push . :refs/remotes/public/master. Si las otras formas no funcionan y tiene alguna referencia extraña de la que desea deshacerse, esta forma cruda es segura. Le proporciona la precisión exacta para eliminar (¡o crear!) Cualquier tipo de referencia.

clacke
fuente
2

Solo un poco relacionado, pero aún podría ser útil en la misma situación que teníamos: utilizamos un recurso compartido de archivos de red para nuestro repositorio remoto. La semana pasada las cosas funcionaban, esta semana recibimos el error "El origen remoto no anunciaba Ref para sucursales ref / heads / master. Esta referencia puede no existir en el control remoto o puede estar oculta por la configuración de permisos"

Pero creíamos que no se había hecho nada para corromper las cosas. El NFS hace instantáneas, así que revisé cada "versión anterior" y vi que hace tres días, el tamaño en MB del repositorio había pasado de 282 MB a 33 MB, y ahora existían aproximadamente 1.403 archivos nuevos y 300 carpetas. Le pregunté a mis compañeros de trabajo y uno había tratado de dar un empujón ese día, luego lo cancelé.

Utilicé la funcionalidad "Restaurar" de NFS para restaurarla justo antes de esa fecha y ahora todo vuelve a funcionar bien. Intenté la ciruela pasa previamente, no parecía ayudar. Tal vez la limpieza más dura hubiera funcionado.

¡Espero que esto pueda ayudar a alguien más algún día!

Arrendajo

JGlass
fuente
2

Tuve un problema similar. Ninguna de las respuestas ayudó. En mi caso, tenía dos repositorios remotos eliminados que se mostraban permanentemente.

Mi última idea fue eliminar todas las referencias a mano.

Digamos que el repositorio se llama "Repo". Yo hice:

find .git -name Repo 

Entonces, eliminé los archivos y directorios correspondientes de la carpeta .git ( esta carpeta se puede encontrar en su aplicación Rails o en su computadora https://stackoverflow.com/a/19538763/6638513 ).

Entonces hice:

grep Repo -r .git

Esto encontró algunos archivos de texto en los que eliminé las líneas correspondientes. Ahora, todo parece estar bien.

Por lo general, debe dejar este trabajo para git.

Keinstein
fuente