Como obtenho apenas uma ramificação de um repositório Git remoto?

246

Eu gostaria de pegar uma única ramificação (nem todas elas) de um repositório remoto e criar uma ramificação de rastreamento local que possa rastrear outras atualizações nessa ramificação remota. As outras ramificações no repositório remoto são muito grandes, então eu gostaria de evitar buscá-las. Como eu faço isso?

Edit: Eu mesmo descobri isso, mas o StackOverflow se recusa a me fornecer a resposta como resposta, então eu a colocarei aqui na pergunta.

Você usa a opção -t para git remote add, por exemplo:

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

Você pode usar várias " -t branch" opções para pegar várias ramificações.

mellis
fonte
3
Um clone do git busca todo o repositório, incluindo todas as ramificações. Você pode fazer cópias pouco profundas, mas isso apenas permite especificar o número de revisões, não quais ramificações.
Ikke
Claro que você pode responder sua própria pergunta, por que não pode?
precisa
2
Eu acho que o OP significava que ele não poderia responder então. O StackOverflow define um tempo mínimo necessário para que você possa responder sua própria pergunta.
Lars Nordin
1
Oi OP, pode ser bom adicionar sua resposta agora. Desta forma, podemos votar nele (e comparar com outras respostas)
lulalala
3
Seu comando git remote add está adicionando uma ramificação remota, que nada tem a ver com buscar uma ramificação!
precisa

Respostas:

220
git fetch <remote_name> <branch_name>

Trabalhou para mim.

Abdulsattar Mohammed
fonte
14
Acabei de saber que o ramo buscado está disponível como FETCH_HEADapós a busca. Obrigado!
Christoph
4
depois faça o git checkout FETCH_HEADcheck-out
d9k 14/06/19
Simples e fácil.
gsumk
Como obter <remote_name>?
mrgloom
@mrgloom na maioria dos casos remote_nameé origin. por exemplo:git fetch origin <branch_name>
Saahithyan Vigneswaran
67

Uma maneira é a seguinte:

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

No entanto, isso não configura o rastreamento.

Para obter mais informações, consulte a documentação do git fetch .

EDIT : como o @ user1338062 observa abaixo : se você ainda não possui um clone local do repositório ao qual deseja adicionar a nova ramificação, mas deseja criar um novo repositório local, então ele git clone --branch <branch_name> --single-branch <repo_url>fornece uma solução mais curta.

hcs42
fonte
1
Graças a isso, o que a operadora pediu. Para fazer uma ramificação de rastreamento, git checkout -t <ramificação remota> / <nome da ramificação> <nome da ramificação>
ken
7
Se eu simplesmente fizer isso git checkout <branchname>, vejo que o git configura automaticamente a ramificação de rastreamento, se a única ramificação com esse nome for a ramificação remota.
bukzor
1
essa foi a única coisa que funcionou para mim. mesmo que a configuração tenha sido configurada para buscar apenas refs para uma única ramificação, ela ainda extrai refs para todas as ramificações usando buscar ou puxar. este comando puxou apenas o ramo que eu queria, então o repo foi de apenas 500kb e não 5mb. obrigado.
herostwist
1
Esta resposta provavelmente está desatualizada. git cloneagora suporte --branche --single-branchopções, postei uma resposta com demonstração .
user1338062
3
@ user1338062 Isso ainda é válido se você quiser buscar um novo ramo única (nem todos os ramos usando git fetch) após a clonagem
rubyprince
35

Eu sei que já existem muitas respostas, mas estas são as etapas que funcionaram para mim:

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

Eles são baseados na resposta de @Abdulsattar Mohammed, no comentário de @Christoph nessa resposta e nas outras perguntas de excesso de pilha e suas respostas:

MrMadsen
fonte
1
Resposta mais útil aqui IMO
Daniel Holmes
31

Para atualizar o controle remoto existente para rastrear ramificações específicas, use apenas:

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ý
fonte
1
Incrível, eu estava em um --single-branchrepositório e não pude baixar ramificações adicionais mais tarde. Obrigado!
Yajo 6/06/19
22

Uma maneira de fazer isso:

na busca .git / config para o repositório remoto deve ser definido para buscar qualquer ramificação:

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

para buscar a ramificação remota:

git fetch origin branch-name

para criar uma ramificação local 'branch-name' configurada para rastrear a ramificação remota 'branch-name' da origem.

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

listar todos os ramos

git branch -a
klode
fonte
16

Copiado da postagem do autor:

Use a -topção para git remote add, por exemplo:

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

Você pode usar várias -t branchopções para obter várias ramificações.

astronauta
fonte
10
Com voto negativo, por que você responde com uma resposta existente no mesmo segmento?
Bowen
13

Se você deseja alterar o padrão para "git pull" e "git fetch" para buscar apenas ramificações específicas, é possível editar .git / config para que a configuração remota se pareça com:

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

Isso buscará apenas o mestre da origem por padrão. Veja para mais informações: https://git-scm.com/book/en/v2/Git-Internals-The-Refspec

EDIT: Acabei de perceber que é a mesma coisa que a opção -t faz para o git remote add. Pelo menos, é uma boa maneira de fazer isso depois que o controle remoto é adicionado, se você não deseja excluir o controle remoto e adicioná-lo novamente usando -t.

ColinM
fonte
1
O link progit.org/book/ch9-5 foi movido para git-scm.com/book/en/Git-Internals-The-Refspec
aqui
8

Por uma questão de integridade, eis um exemplo de comando para um novo checkout:

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

Como mencionado em outras respostas, ele define remote.origin.fetchassim:

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

versão git: 2.74

É assim que eu faço:

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

git versão 2.16.1.windows.4

Apenas executando git fetch remoteRepositoryName branchName (eg: git fetch origin my_local_branch) é suficiente. A busca será feita e uma nova ramificação local será criada com o mesmo nome e o rastreamento será definido como ramificação remota.

Em seguida, execute o git checkout branchName

Karthikeyan Mohan
fonte
o ramo não aparece embaixo git branchaté que você faça o check-out dele
commonpike
3

Minhas soluções alternativas:

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

se você não possui um clone local:

git clone --depth 1 -b <branch_name> <repo_url>
liy
fonte
3
  1. Escolha o que <remote_name>você deseja usar (fique à vontade para usar origin e pule a etapa 1.)
  2. git remote add <remote_name> <remote_url>
  3. git fetch <remote_name> <branch>
  4. Escolha o que <your_local_branch_name>você gostaria de usar. Pode ser o mesmo que <branch>.
  5. git checkout <remote_name>/<branch> -b <your_local_branch_name>

Espero que ajude!

Lukasz Czerwinski
fonte
1

A resposta realmente depende da lista atual de ramificações de rastreamento que você possui. Você pode buscar uma ramificação específica remota git fetch <remote_name> <branch_name> somente se a ramificação já estiver na lista de ramificações de rastreamento (você pode verificá-la emgit branch -r ).

Suponhamos que eu tenha clonado o controle remoto com a opção --single-branch anteriormente e, nesse caso, o único ramo de rastreamento que tenho é o "clonado". Estou um pouco confuso com as recomendações para ajustar o git config manualmente, bem como digitando git remote add <remote_name> <remote_url>comandos. Como o "git remote add" configura um novo controle remoto, obviamente ele não funciona com o repositório remoto existente; O fornecimento de opções "-t branch" não me ajudou.

Caso o controle remoto exista, e a ramificação que você deseja buscar existe nesse controle remoto:

  1. Verifique git branch -rse você pode ver esse ramo como um ramo de rastreamento. Caso contrário (como no meu caso com um único clone de ramificação), adicione essa ramificação à lista de ramificações de rastreamento "git remote set-branches" com a opção --add:

    • git remote set-branches --add <remote_name> <branch_name>
  2. Agora você pode buscar um ramo específico (duplicar aqui outras respostas):

    • git fetch <remote_name> <branch_name>
  3. E crie e efetue o checkout de uma nova filial local com "checkout --track", que receberá o mesmo "branch_name" que uma filial de rastreamento:

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

A maneira mais simples de fazer isso

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

Exemplo: quero buscar o ramo uat da origem e mudar para esse como o ramo de trabalho atual.

   git fetch origin uat && git checkout uat
Amitesh
fonte