Eliminando twigs remotas

Al usar git branch -a , vi que mi repository contiene muchas twigs con 'remotes / origen /' justo enfrente, por ej. controles remotos / origen / característica / Issue01

Luego vi que el repository también tiene varios nombres similares, como "controles remotos / origen / controles remotos / origen / function / Issue01", dobles "controles remotos / origen" en el nombre.

Si bien sé que puedo usar este command git push origin :<name of the branch> para eliminar la twig, pero en tales casos, ¿cómo puedo saber si estoy eliminando la twig correcta? (Quería deshacerme de aquellos con doble control remoto / nombre de origen …

Aquí hay varios elementos que pueden ser un poco complicados.

Primero, "twig remota" (como en el título de su pregunta aquí) es, en el mejor de los casos, ambigua. ¿Quiere decir el nombre de la sucursal de seguimiento remoto en su repository, o el nombre de la sucursal (regular, local) en el repository de Git almacenado en el control remoto?

En segundo lugar, todos los nombres de las sucursales (local y de seguimiento remoto) son forms específicas de las references más generales de Git. Un nombre de sucursal local como master o feature/Issue01 es realmente solo una reference cuyo nombre comienza con refs/heads/ : estos dos nombres son abreviados para refs/heads/master y refs/heads/feature/Issue01 , respectivamente. Un nombre de twig de seguimiento remoto como origin/master es solo la forma abreviada del nombre completo refs/remotes/origin/master .

Es el prefijo, los refs/heads/ o refs/remotes/ part-que le dice a Git a qué grupo pertenece el nombre. Una vez que Git ha descubierto el grupo (nombre de la sucursal local, nombre de la sucursal de seguimiento remoto, etc.), Git tiende a soltar el prefijo, de modo que solo ve master y origin/master . A veces, Git solo suelta la parte refs/ , como en esta salida de la git branch -a en una copy del repository de Git:

 $ git branch -a * master precious stash-exp remotes/origin/HEAD -> origin/master remotes/origin/maint remotes/origin/master remotes/origin/next remotes/origin/pu remotes/origin/todo 

Si logra crear nombres confusos, como una twig local cuyo nombre completo es refs/heads/origin/master , todo se vuelve muy confuso: es origin/master esta twig local, o es la twig de seguimiento remoto cuyo nombre completo es refs/remotes/origin/master ?

Si estás en esta situación confusa, deletrea todo completamente.

Si escribe refs/heads/origin/master , podemos decir que quiere decir la twig local.

Hacer que Git use el nombre completo es un poco más difícil. La manera más fácil es usar un command de "fontanería" que no intente abreviar. Por lo tanto, puede usar el command git for-each-ref . Ejecutarse solo, sin arguments adicionales, simplemente imprime cada reference con su valor hash, tipo de object de destino y nombre completo:

 $ git for-each-ref bbc61680168542cf6fd3ae637bde395c73b76f0f commit refs/heads/master f247a4de65f24e5f924d097843894bf839d34ac6 commit refs/heads/precious 93df9a13560851eaa088f76d71a95a96c6902188 commit refs/heads/stash-exp a28705da929ad746abcb34270947f738549d3246 commit refs/remotes/origin/HEAD 0b65a8dbdb38962e700ee16776a3042beb489060 commit refs/remotes/origin/maint a28705da929ad746abcb34270947f738549d3246 commit refs/remotes/origin/master 6bd575154409f30ff65ca6ef24fc65deb942bab4 commit refs/remotes/origin/next a83f22757e2811817565ce1064edcffb40eeb213 commit refs/remotes/origin/pu 2d30c169da9a8b402b36a0b24689330559ca8943 commit refs/remotes/origin/todo d5aef6e4d58cfe1549adef5b436f3ace984e8c86 tag refs/tags/gitgui-0.10.0 33682a5e98adfd8ba4ce0e21363c443bd273eb77 tag refs/tags/gitgui-0.10.1 [lots more tags, snipped] 

Puede eliminar una twig local como refs/heads/origin/master con git branch -d origin/master (add -f o --force , o use -D , para borrar forzosamente el nombre de la twig, incluso si no está fusionado), o puedes cambiarle el nombre con git branch -m y darle un nombre que no sea tan confuso. En todos estos casos, omita los refs/heads/ , ya que la git branch ya sabe que esto significa una twig (regular, local).

Incluso puede eliminar una twig de seguimiento remoto como refs/remotes/origin/remotes/origin/feature/Issue01 con git branch -r -d , pero no es necesario, y probablemente no debería molestar, porque:

Tratando con el control remoto Git

Todo lo anterior está bien para tratar con su propio repository, pero también tiene otro repository en otra máquina. Si esa otra máquina es una que usted controla directamente, puede simplemente iniciar session allí: use ssh para iniciar session, cd al lugar con el repository, y trate como lo hizo con su propio repository. Pero, ¿y si no puedes hacer eso?

Cuando la otra máquina está "en la nube", a menudo es una computadora que no controlas, a la que accedes a través de GitHub, por ejemplo. En este caso, puede tener algún tipo de interfaz web que pueda usar, pero también tiene los mecanismos estándar de Git para acceder a los controles remotos.

El git for-each-ref que ejecutamos arriba, para ver qué twigs, twigs de rastreo remoto y tags tenemos, tiene una contrapartida: git ls-remote origin contactos con su origin remoto y básicamente ejecuta git for-each-ref ahí. Eso te permite ver lo que tienen.

Una vez que conozca el nombre completo de cada reference, puede eliminar (pero no cambiar el nombre) la reference con git push , utilizando la syntax que citó anteriormente. Por ejemplo, esto:

 git push origin :refs/heads/remotes/origin/feature/Issue01 

le pide al origin designado remoto que elimine su twig local ( refs/heads/ ) llamada remotes/origin/feature/Issue01 .

También puedes deletrear este git push origin --delete (o solo -d ). Si tiene una gran cantidad de references para eliminar, es un poco más fácil escribir:

 git push origin -d refs/heads/bad/name/one refs/heads/bad/name/two 

De nuevo, puedes deletrearlos en su totalidad para eliminar la ambigüedad.

Usando git remote prune o git fetch -p

Una vez que haya eliminado la twig (local) refs/heads/remotes/origin/feature/Issue01 del repository de origin , aún debe deshacerse de la twig de seguimiento remoto refs/remotes/origin/remotes/origin/feature/Issue01 de su propio repository. Nuevamente, puede usar git branch -r -d , pero hay una manera más fácil.

Así como el git fetch origin crea twigs de seguimiento remoto en su repository, según los nombres que se dertwigron de git ls-remote origin , git fetch origin --prune elimina twigs de rastreo remoto de su repository, basándose en estos mismos nombres.

Es decir, después de hacer el equivalente de git ls-remote origin , su Git sabe que ahora no hay refs/heads/remotes/origin/feature/Issue01 en el origin . Con – --prune , puedes decirle a tu Git que elimine la twig correspondiente de seguimiento remoto.

En algunas versiones de Git, git fetch --prune origin fue ligeramente defectuoso, y git remote prune origin funcionó. Esto debería hacer más o less lo mismo, pero si git fetch --prune no funciona, testing git remote prune .