Mi situación es esta ... alguien que trabaja en el mismo repositorio ha eliminado una rama de su repositorio local y remoto ...
La mayoría de las personas que han preguntado sobre este tipo de problema en Stack Overflow u otros sitios tienen el problema de que las sucursales todavía se muestran en su lista de sucursales de seguimiento remoto git branch -a
en la parte inferior:
* master
develop
feature_blah
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
remotes/origin/random_branch_I_want_deleted
Sin embargo, en MI situación, la rama que no debería estar allí, es local:
* master
develop
feature_blah
random_branch_I_want_deleted
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
Cuando hago algo de lo siguiente, no se elimina localmente:
$ git prune
También probé:
$ git remote prune origin
$ git fetch --prune
Más información útil: cuando verifico git remote show origin
así es como se ve:
* remote origin
Fetch URL: utilities:homeconnections_ui.git
Push URL: utilities:homeconnections_ui.git
HEAD branch: master
Remote branches:
master tracked
develop tracked
feature_blah tracked
other123 tracked
other444 tracked
other999 tracked
Local branches configured for 'git pull':
develop merges with remote develop
feature_blah merges with remote other999
master merges with remote master
random_branch_I_want_deleted merges with remote random_branch_I_want_deleted
Local refs configured for 'git push':
develop pushes to develop (local out of date)
master pushes to master (up to date)
feature_blah pushes to feature_blah(up to date)
Tenga en cuenta que solo está en la sección titulada Local branches configured for 'git pull':
¿Por qué?
git
remote-branch
gogogadgetinternet
fuente
fuente
git branch -d the_local_branch
x/y
): se ha solucionado (vea mi respuesta a continuación )Respuestas:
No te culpo por frustrarte por esto. La mejor manera de mirar es esto. Hay potencialmente tres versiones de cada rama remota:
(por ejemplo, repositorio remoto en https://example.com/repo.git ,
refs/heads/master
)refs/remotes/...
)(por ejemplo, repositorio local,
refs/remotes/origin/master
)(por ejemplo, repositorio local,
refs/heads/master
)Vamos a empezar con
git prune
. Esto elimina objetos a los que ya no se hace referencia, no elimina referencias. En su caso, tiene una sucursal local. Eso significa que hay una referencia nombradarandom_branch_I_want_deleted
que se refiere a algunos objetos que representan el historial de esa rama. Entonces, por definición,git prune
no se eliminarárandom_branch_I_want_deleted
. Realmente,git prune
es una forma de eliminar datos que se han acumulado en Git pero a los que no se hace referencia. En general, no afecta su vista de ninguna rama.git remote prune origin
ygit fetch --prune
ambos operan con referencias enrefs/remotes/...
(me referiré a ellas como referencias remotas). No afecta a las sucursales locales. Lagit remote
versión es útil si solo desea eliminar referencias remotas en un control remoto en particular. De lo contrario, los dos hacen exactamente lo mismo. En resumen,git remote prune
ygit fetch --prune
operar en el número 2 anterior. Por ejemplo, si eliminó una rama utilizando la GUI web de git y no desea que aparezca más en su lista de sucursales locales (git branch -r
), entonces este es el comando que debe usar.Para eliminar una sucursal local, debe usarla
git branch -d
(o-D
si no está fusionada en ninguna parte). FWIW, no hay un comando git para eliminar automáticamente las ramas de seguimiento locales si desaparece una rama remota.fuente
xargs git branch -D
, pero tenga en cuenta que las nuevas ramas que ha creado, pero nunca inserta en el servidor o será borrada, por lo que la banda de rodamiento con cuidado:git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}'
packed-refs
archivo en el.git
área), por lo que no es necesariamente una simple cuestión de eliminarlas a través del explorador de archivos. Es mejor usar los comandos para asegurarse de que ambos se cuiden correctamente.git remote prune
ygit fetch --prune
haz lo mismo: eliminando las referencias a las ramas que no existen en el control remoto, como dijiste. El segundo comando se conecta al control remoto y obtiene sus ramas actuales antes de la poda.Sin embargo, no toca las sucursales locales que ha desprotegido, que simplemente puede eliminar con
Reemplace
-d
por-D
si la rama no se fusiona en otro lugargit prune
hace algo diferente, purga objetos inalcanzables, esas confirmaciones a las que no se puede acceder en ninguna rama o etiqueta, y por lo tanto ya no son necesarias.fuente
git prune
no solo busca ramas y etiquetas, sino también todas las demás referencias.git remote prune
En caso de que alguien esté interesado. Aquí hay un script de shell rápido que eliminará todas las ramas locales que no se rastrean de forma remota. Una advertencia: esto eliminará cualquier rama que no se rastree de forma remota, independientemente de si se fusionó o no.
Si ven algún problema con esto, háganmelo saber y lo solucionaré (etc., etc.)
Guárdelo en un archivo llamado
git-rm-ntb
(llámelo como quiera)PATH
y ejecute:git-rm-ntb <remote1:optional> <remote2:optional> ...
fuente
Tenga en cuenta que una diferencia entre
git remote --prune
ygit fetch --prune
se está arreglando, con commit 10a6cc8 , por Tom Miller (tmiller
) (para git 1.9 / 2.0, Q1 2014):Entonces: cuando un repositorio ascendente tiene una sucursal ("frotz") con el mismo nombre que una jerarquía de sucursal ("frotz / xxx", una posible convención de nomenclatura de sucursal ),
git remote --prune
tuvo éxito (en la limpieza de la sucursal de seguimiento remoto de su repositorio) , perogit fetch --prune
estaba fallando.Ya no:
fuente