¿Cómo obtengo solo una rama de un repositorio Git remoto?

246

Me gustaría tomar una sola rama (no todas) de un repositorio remoto y crear una rama de seguimiento local que pueda rastrear más actualizaciones a esa rama remota. Las otras ramas en el repositorio remoto son muy grandes, por lo que me gustaría evitar buscarlas. ¿Cómo hago esto?

Editar: lo descubrí yo mismo, pero StackOverflow se niega a permitirme proporcionar la respuesta como respuesta, por lo que lo pondré aquí en la pregunta.

Utiliza la opción -t para git add remoto, por ejemplo:

git remote add -t remote-branch remote-name remote-url

Puede usar múltiples " -t branch" opciones para agarrar múltiples ramas.

mellis
fuente
3
Un clon de git recupera todo el repositorio, incluidas todas las ramas. Puede hacer copias superficiales, pero eso solo le permite especificar el número de revisiones, no qué ramas.
Ikke
Claro que puedes responder tu propia pregunta, ¿por qué no puedes?
CharlesB
2
Creo que el OP significaba que no podía responderlo entonces. StackOverflow establece un tiempo mínimo que debe transcurrir antes de que pueda responder su propia pregunta.
Lars Nordin
1
Hola OP, podría ser bueno ahora agregar tu respuesta ahora. De esta manera podemos votarlo (y compararlo con otras respuestas)
lulalala
3
¡Su comando git remote add está agregando una rama remota, que no tiene nada que ver con buscar una rama!
Chris Halcrow

Respuestas:

220
git fetch <remote_name> <branch_name>

Trabajó para mi.

Abdulsattar Mohammed
fuente
14
Acabo de enterarme de que la rama recuperada está disponible como FETCH_HEADdespués de la recuperación . ¡Gracias!
Christoph
44
luego git checkout FETCH_HEADa pagar
d9k
Simple y fácil.
gsumk
¿Cómo obtener <remote_name>?
mrgloom
@mrgloom en la mayoría de los casos remote_namees origin. por ejemplo:git fetch origin <branch_name>
Saahithyan Vigneswaran
67

Una forma es la siguiente:

git fetch <remotename> <remote branch>:refs/remotes/<remotename>/<local branch>

Sin embargo, esto no configura el seguimiento.

Para obtener más información, consulte la documentación de git fetch .

EDITAR : como @ user1338062 señala a continuación : si aún no tiene un clon local del repositorio donde desea agregar la nueva rama, pero desea crear un nuevo repositorio local, entonces git clone --branch <branch_name> --single-branch <repo_url>proporciona una solución más corta.

hcs42
fuente
1
Gracias, esto hace lo que ha pedido el operador. Para realizar un seguimiento de git de rama de seguimiento -t <rama remota> / <nombre de rama> <nombre de rama>
ken
77
Si simplemente lo hago git checkout <branchname>, veo que git configura automáticamente la rama de seguimiento, si la única rama con ese nombre es la rama remota.
bukzor
1
Esto fue lo único que funcionó para mí. a pesar de que la configuración se configuró para buscar referencias para una sola rama, todavía extrajo referencias a todas las ramas usando fetch o pull. Este comando solo extrajo la rama que quería, por lo que el repositorio era de solo 500 kb, no de 5 mb. Gracias.
herostwist
1
Esta respuesta probablemente está desactualizada. git cloneahora soporta --branchy --single-branchopciones, publiqué una respuesta con demostración .
user1338062
3
@ user1338062 Esto todavía es válido si desea buscar una nueva rama solamente (no todas las ramas que usan git fetch) después de la clonación
rubyprince
35

Sé que ya hay muchas respuestas, pero estos son los pasos que me funcionaron:

  1. git fetch <remote_name> <branch_name>
  2. git branch <branch_name> FETCH_HEAD
  3. git checkout <branch_name>

Estos se basan en la respuesta de @Abdulsattar Mohammed, el comentario de @Christoph sobre esa respuesta y estas otras preguntas de desbordamiento de pila y sus respuestas:

MrMadsen
fuente
1
Respuesta más útil aquí OMI
Daniel Holmes
31

Para actualizar el control remoto existente para rastrear ramas específicas solo use:

git remote set-branches <remote-name> <branch-name>

De git help remote:

set-branches
    Changes the list of branches tracked by the named remote. This can be used to track a subset of the available remote branches
    after the initial setup for a remote.

    The named branches will be interpreted as if specified with the -t option on the git remote add command line.

    With --add, instead of replacing the list of currently tracked branches, adds to that list.
Ikar Pohorský
fuente
1
Increíble, estaba en un --single-branchrepositorio y no pude descargar ramas adicionales más tarde. ¡Gracias!
Yajo
22

Una forma de hacerlo:

en .git / config fetch para el repositorio remoto debe configurarse para recuperar cualquier rama:

   [remote "origin"]
            fetch = +refs/heads/*:refs/remotes/origin/*

para buscar la rama remota:

git fetch origin branch-name

para crear una rama local 'nombre-rama' configurada para rastrear la rama remota 'nombre-rama' desde el origen.

git checkout -b branch-name origin/branch-name

para enumerar todas las ramas

git branch -a
klode
fuente
16

Copiado de la publicación del autor:

Use la -topción para git remote add, por ejemplo:

git remote add -t remote-branch remote-name remote-url

Puedes usar múltiples -t branchopciones para agarrar múltiples ramas.

astronauta
fuente
10
Votado abajo, ¿por qué responde con una respuesta existente en el mismo hilo?
Bowen
13

Si desea cambiar el valor predeterminado para "git pull" y "git fetch" para obtener solo ramas específicas, puede editar .git / config para que la configuración remota se vea así:

[remote "origin"]
  fetch = +refs/heads/master:refs/remotes/origin/master

Esto solo buscará el maestro desde el origen de forma predeterminada. Consulte para obtener más información: https://git-scm.com/book/en/v2/Git-Internals-The-Refspec

EDITAR: Acabo de darme cuenta de que esto es lo mismo que la opción -t hace para git remote add. Al menos, esta es una buena manera de hacerlo después de agregar el control remoto si no desea eliminar el control remoto y agregarlo nuevamente usando -t.

ColinM
fuente
1
El enlace progit.org/book/ch9-5 se ha movido a git-scm.com/book/en/Git-Internals-The-Refspec
aquí el
8

En aras de la integridad, aquí hay un comando de ejemplo para un nuevo pago:

git clone --branch gh-pages --single-branch git://github.com/user/repo

Como se menciona en otras respuestas, se establece remote.origin.fetchasí:

[remote "origin"]
        url = git://github.com/user/repo
        fetch = +refs/heads/gh-pages:refs/remotes/origin/gh-pages
usuario1338062
fuente
5

versión de git: 2.74

Así es como lo hago:

git remote add [REMOTE-NAME] [REMOTE-URL]
git fetch [REMOTE-NAME] -- [BRANCH]
scottalan
fuente
4

git versión 2.16.1.windows.4

Simplemente haciendo un git fetch remoteRepositoryName branchName (eg: git fetch origin my_local_branch) es suficiente. Se realizará la recuperación y se creará una nueva sucursal local con el mismo nombre y el seguimiento se establecerá en la sucursal remota.

Luego realice git checkout branchName

Karthikeyan Mohan
fuente
la rama no aparece debajo git branchhasta que
ingresas
3

Mis soluciones alternativas:

git fetch --depth=1
git checkout <branch_name>

si no tienes un clon local:

git clone --depth 1 -b <branch_name> <repo_url>
liy
fuente
3
  1. Elija cualquiera <remote_name>que le gustaría usar (siéntase libre de usar origin y omita el paso 1.)
  2. git remote add <remote_name> <remote_url>
  3. git fetch <remote_name> <branch>
  4. Elige cualquiera que <your_local_branch_name>quieras usar. Podría ser lo mismo que <branch>.
  5. git checkout <remote_name>/<branch> -b <your_local_branch_name>

¡Espero que ayude!

Lukasz Czerwinski
fuente
1

La respuesta en realidad depende de la lista actual de ramas de seguimiento que tenga. Puede buscar una rama específica desde el control remoto git fetch <remote_name> <branch_name> solo si la rama ya está en la lista de ramas de seguimiento (puede verificarla con git branch -r).

Supongamos que he clonado el control remoto con la opción --single-branch anteriormente, y en este caso la única rama de rastreo que tengo es la "clonada". Estoy un poco desconcertado por los consejos para ajustar manualmente la configuración de git, así como al escribir git remote add <remote_name> <remote_url>comandos. Como "git remote add" configura un nuevo control remoto, obviamente no funciona con el repositorio remoto existente; el suministro de opciones "-t branch" no me ayudó.

En caso de que exista el control remoto y la rama que desea buscar existe en ese control remoto:

  1. Verifique git branch -rsi puede ver esta rama como una rama de seguimiento. Si no es así (como en mi caso con un clon de rama única), agregue esta rama a la lista de ramas de seguimiento mediante "git remote set-branch" con la opción --add:

    • git remote set-branches --add <remote_name> <branch_name>
  2. Ahora puede buscar una rama específica (duplicar aquí otras respuestas):

    • git fetch <remote_name> <branch_name>
  3. Y cree y finalice una nueva sucursal local con "checkout --track", que recibirá el mismo "nombre de sucursal" que una sucursal de seguimiento:

    • git checkout --track <remote_name>/<branch_name>
AlexK
fuente
0

La forma más sencilla de hacer eso.

  git fetch origin <branch> && git checkout <branch>

Ejemplo: quiero obtener la rama de uat desde el origen y cambiar a esta como la rama de trabajo actual.

   git fetch origin uat && git checkout uat
Amitesh
fuente