¿Cómo "deshago" un clon de una sola rama?


102

Cloné un repositorio usando el

git clone -b <branch name> --single-branch <github url> <target directory>

Esto clonó SOLO esta rama, pero ahora quiero cambiar a la rama maestra y otras ramas. ¿Hay alguna forma además de borrarlo y comenzar de nuevo a clonar el resto del repositorio de que pueda deshacer la preferencia --single-branch?

Respuestas:


147

Puedes decirle a Git que extraiga todas las ramas de esta manera:

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin

Si miras adentro .git/config, se verá así:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = false
[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/master:refs/remotes/origin/master
[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

Comparé esto con un clon completo y vi que la única diferencia era el "buscar" debajo [remote "origin"].

Nota: estoy ejecutando Git versión 1.8.2. Es posible que las opciones de configuración hayan cambiado si está ejecutando una versión anterior de Git. Si mis comandos no funcionan, le recomiendo que revise .git/configpara ver si puede ver algo similar.


2
Solo quería ofrecerle un agradecimiento especial porque leí muchísimo y busqué en Google y no pude encontrar nada como esto.
danieltalsky

2
Encantado de ayudar. La githerramienta de línea de comandos es increíblemente poderosa (de hecho, la mayoría de los comandos se implementan en términos de otros comandos), por lo que puede hacer muchas cosas con ella una vez que comprenda cómo está distribuido el repositorio (básicamente, cómo funciona la .gitcarpeta ).
sarahhodne

Esto no funcionó para mí, después de ejecutar estos comandos git show-ref tagsaún falla.
felixfbecker

1
Tenga en cuenta que esta solución también funcionará si una rama se clonó superficialmente utilizando la siguiente sintaxis también, que experimenta la misma deficiencia descrita por OP:git clone --depth=1 --branch branchname git@github.com:foobar/repo.git destinationpath
danemacmillan

1
¡Vaya, esto está lejos de ser intuitivo! Es extraño que Git no tenga un comando para lograr esto. Sí, lo hice funcionar ... ¡y ahora sé sobre el archivo de configuración en el directorio .git también!
kashiraja

61

Si desea agregar una sola rama, puede hacer lo siguiente:

git remote set-branches --add origin [remote-branch]
git fetch origin [remote-branch]:[local-branch]

Funciona con git versión 1.9.1


1
Estoy enamorado de ti
user1760150

4
Esto agrega múltiples fetch =líneas a .git / config, muy útil cuando desea cambiar entre dos ramas en el control remoto pero no buscar un montón de otras ramas. ¡Gracias!
Terry Brown

4

Para agregar otra rama remota a mi repositorio local que se clonó usando --single-branch, lo siguiente funciona para mí:

git remote set-branches --add origin [remote-branch]
git fetch
git checkout [remote-branch]

También puede utilizar comodines para [remote-branch], por ejemplo,

git remote set-branches --add origin release-1.*
git fetch
git checkout release-1.5

Esto funciona con la versión 2.21.1 de git . Otras respuestas que sugieren hacer git fetch origin [remote-branch]:[local-branch]no funcionaron, ya que crea la sucursal local en un estado sin seguimiento. Al ejecutarlo git pull, primero intenté fusionar todas las confirmaciones de la rama remota con la local una vez más.


2
segunda vez vuelvo a esta respuesta. muy útil. ¡Gracias!
Dios acerca

1
La respuesta más útil
Denis Itskovich

1
tercera vez lol.
Godbout

Parece que tenemos el mismo ciclo de lanzamiento :)
Arno Fiva

1

¿Simplemente agregue el repositorio original como un nuevo control remoto y trabaje desde allí?

git remote add path/to/myrepo myNewOrigin
git fetch myNewOrigin

Incluso puede eliminar su control remoto actual de 'origen' y cambiar el nombre de 'myNewOrigin' a 'origen' si lo desea.

Desde allí puede extraer / fusionar / rebase.


0

Simplemente cambie el .git/configarchivo de su repositorio local, línea fetchde [remote origin] section.

Antes de algo como esto

[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/master:refs/remotes/origin/master

Después de que sea así

[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*

0

Inicialmente apliqué la respuesta de Dominik Pawlak y funcionó. Pero no pude realizar más cambios, después de que comprometí más código en mi nueva rama.

Hay otra forma de restablecer por single-branchcompleto, que no se ha mencionado aquí:

git remote remove origin
git remote add origin git@gitlab.com:{yourProject}/{yourRepo}.git
git branch --set-upstream-to=origin/{yourBranch}  {yourBranch}
git pull

Esto restablece todo al original.


0

Para mi funcionó:

git remote remove origin
git remote add origin https://*<yourPath>*.git
git fetch
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.