Como clonar uma única ramificação no Git?

799

Eu tenho um repositório Git local chamado 'esqueleto' que eu uso para armazenar esqueletos de projetos. Possui alguns ramos, para diferentes tipos de projetos:

casey@agave [~/Projects/skeleton] git branch
* master
  rails
  c
  c++

Se eu quiser verificar a ramificação principal de um novo projeto, eu posso fazer

casey@agave [~/Projects] git clone skeleton new
Initialized empty Git repository in /Users/casey/Projects/new/.git/

e tudo é como eu quero. Especificamente, o novo ramo mestre aponta para o ramo mestre do esqueleto, e eu posso pressionar e puxar para mover as alterações na configuração básica do projeto.

O que não funciona, no entanto, é se eu quero clonar outro ramo. Não consigo obtê-lo, de modo que apenas puxo a ramificação que desejo, por exemplo, a railsramificação e, em seguida, o novo repositório possui uma masterramificação que envia e extrai da railsramificação do repositório esqueleto , por padrão.

Existe uma boa maneira de fazer isso? Ou talvez não seja dessa maneira que o Git queira que eu estruture as coisas, e certamente estou aberto a isso. Talvez eu devesse ter vários repositórios, com o repositório esqueleto do Ruby on Rails rastreando o repositório mestre de esqueletos? E qualquer projeto individual que esteja clonando o repositório de esqueletos do Ruby on Rails.

Casey Rodarmor
fonte
O que git branch -amostra?
Jakub Narębski 22/11/2009
3
Será que git checkout -b newbranch origin/branchiwantfunciona melhor? (sem a --trackopção)
VonC 22/11/2009
3
Eu acho que o que você está tentando fazer é uma má ideia. Use repositórios diferentes para projetos diferentes. Ramos são algo completamente diferente.
InnaM 22/11/2009
@Manni, eu estava pensando que, já que o git não parecia gostar do que estou fazendo. Você pode explicar o porquê? É porque os galhos não devem durar muito?
Casey Rodarmor 22/11/2009
1
@rodarmor Acho que o que você está tentando fazer é uma boa ideia, e eu tive exatamente essa pergunta.
Paul Du Bois

Respostas:

863

Nota: o git1.7.10 (abril de 2012) na verdade permite clonar apenas uma ramificação :

# clone only the remote primary HEAD (default: origin/master)
git clone --single-branch

as in:
git clone <url> --branch <branch> --single-branch [<folder>]

Você pode vê-lo em t5500-fetch-pack.sh:

test_expect_success 'single branch clone' '
  git clone --single-branch "file://$(pwd)/." singlebranch
'

Tobu comenta que:

Isso está implícito ao fazer um clone superficial.
Isso torna git clone --depth 1a maneira mais fácil de economizar largura de banda.

E desde o Git 1.9.0 (fevereiro de 2014), os clones rasos suportam a transferência de dados (push / pull), portanto essa opção é ainda mais útil agora.
Veja mais em " O git clone --depth 1clone superficial é mais útil do que parece? ".


"Desfazendo" um clone superficial é detalhado em " Converter clone superficial em clone completo " (git 1.8.3+)

# unshallow the current branch
git fetch --unshallow

# for getting back all the branches (see Peter Cordes' comment)
git config remote.origin.fetch refs/heads/*:refs/remotes/origin/*
git fetch --unshallow

Como Chris comenta:

a linha mágica para fazer com que os ramos ausentes sejam revertidos --single-branché (git v2.1.4):

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

Com o Git 2.26 (1º trimestre de 2020), " git clone --recurse-submodules --single-branch" agora usa a mesma opção de ramificação única ao clonar os submódulos .

Consulte commit 132f600 , commit 4731957 (21 de fevereiro de 2020) por Emily Shaffer ( nasamuffin) .
(Incorporado por Junio ​​C Hamano - gitster- in commit b22db26 , 05 mar 2020)

clone: passa - único ramo durante - sub-módulos -recurse

Assinado por: Emily Shaffer
Acked-by: Jeff King

Anteriormente, a execução " git clone --recurse-submodules --single-branch" resultou na clonagem de submódulos de todas as ramificações, mesmo que o superprojeto tenha clonado apenas uma ramificação.

Passe --single-branchpela estrutura auxiliar do submódulo para torná-la clonemais tarde ' '.

VonC
fonte
80
git clone <url> --branch <branch> --single-branch <folder>Funciona como um encanto.
Alexander
1
Sim, eu acho que é hora de atualizar a resposta aceita :) Este faz "trabalho como um encanto"
kumarharsh
5
Além disso, isso está implícito ao fazer um clone superficial. Isso torna clone --depth 1a maneira mais fácil de economizar largura de banda.
Tobu
1
O @Tobu e o VonC --depth 1não são seguros para o usuário, porque eles podem querer realmente pressionar / puxar com o novo clone.
RMN
2
Só para soletrar correção Peter Cordes' na íntegra, a linha mágica para obter ramos faltando para reverter --single-branché git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*e git fetch --unshallow(v2.1.4 git)
Chris
670

Uma maneira é executar o seguinte.

git clone user@git-server:project_name.git -b branch_name /your/folder

Onde branch_nameestá o ramo de sua escolha e "/ your / folder" é a pasta de destino para esse ramo. É verdade que isso trará outros ramos, dando a você a oportunidade de mesclar para frente e para trás.

Atualizar

Agora, começando com o Git 1.7.10, agora você pode fazer isso

git clone user@git-server:project_name.git -b branch_name --single-branch /your/folder
Alex Nolasco
fonte
36
Isso funciona, mas busca todos os ramos. Veja a resposta de @ frerich = raabe abaixo.
cdunn2001
3
Te agradece. adicione apenas "-b branch_name" no meu caso. Isso me salvou muito tempo.
PhatHV
Sim, funciona perfeitamente ...! Sou mais uma pessoa do TFS e, para meus projetos pessoais, tenho usado o git. Wrto git branching, eu estava fazendo isso da maneira errada mais cedo e é bom conhecer esse método fácil e parece perfeito! Obrigado novamente! Já marcaram com +1, se possível eu daria +100 :)
k25
11
Você também pode adicionar --single-branchpara buscar apenas o histórico associado a esse ramo, em vez de todo o histórico e tags que o repositório contém.
flawyte
1
@AlexNolasco Você pode editar a resposta dizendo o que é / some / folder ? Obrigado
Nabin
112

Usando o Git versão 1.7.3.1 (no Windows), aqui está o que eu faço ( $BRANCHé o nome da ramificação que eu quero fazer o checkout e $REMOTE_REPOa URL do repositório remoto que eu quero clonar):

mkdir $BRANCH
cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout $BRANCH

A vantagem dessa abordagem é que as chamadas subsequentes git pull(ou git fetch) também farão o download da ramificação solicitada.

Frerich Raabe
fonte
Qual é a diferença entre o seu script e esta linha? git clone -b $BRANCH $REMOTE_REPO $BRANCHafik eles são os mesmos?
Ian Vaughan
12
@Ian: Uma diferença é que git clone -bvocê fornece todas as referências remotas (todas as ramificações e tags remotas) como git branch -amostra. Com o meu script, você apenas recebe uma única referência.
Frerich Raabe
1
Quando tento o acima (digamos com $ BRANCH = "nick"), recebo 'fatal: Não foi possível encontrar ref refs / heads / nick' remoto. Não parece trabalhar para mim ...
Nick
3
Observe que -t $BRANCHfunciona mesmo sem -f, o que seria buscado imediatamente. Em seguida, git fetch originbuscava e git checkout $BRANCHestabelecia a filial e o checkout locais. Isso é útil quando você precisa configurar o controle remoto antes de buscar, por exemplo git config remote.origin.uploadpack=/bin/upload-pack.
cdunn2001
1
Como estou em um git corporativo "antigo" (1.6.0.2), estou vinculado à solução acima. Eu tive o mesmo problema que o @Nick. Executando git branch -amostrou origin/$BRANCH. Fazendo git checkout origin/$BRANCHisso.
dr jerry
30

Você pode tentar o longo caminho:

mkdir newrepo.git
cd newrepo.git
git init
git remote add origin file:///path/to/original
git fetch origin branchiwant:refs/remotes/origin/branchiwant
git checkout -b branchiwant --track origin/branchiwant

O que isso faz é:

  • Crie e inicie um repositório Git vazio.
  • Adiciona o repositório original como uma origem chamada remota .
  • Busca apenas a ramificação necessária do remoto chamado origem .
  • Cria e faz check-out de uma nova ramificação configurada para rastrear a ramificação de origem que você acabou de clonar.

Espero que seja algo parecido com o que você procura.

jkp
fonte
Os argumentos para o git remote add são trocados, mas não consegui fazer o checkout funcionar. erro "origem / rails do git checkout" me deu "erro: pathspec 'origin / rails' não corresponde a nenhum arquivo conhecido pelo git." e a alternativa me deu "fatal: git checkout: atualizar caminhos é incompatível com a troca de ramificações".
Casey Rodarmor 22/11/2009
@rodarmor: corrigimos o comando remoto git, obrigado. Você pode colar a saída de git branch -r?
jkp
@jkp, na verdade git branch -rnão dá saída.
Casey Rodarmor 22/11/2009
@rodarmor: Corrigi o exemplo e isso definitivamente funciona (testado). HTH (você pode aceitá-la, uma vez testei você gosta;))
jkp
a opção -b é relativamente nova. A última vez que o executei em um aperto do debian, não estava disponível,
IIRC
23

Você pode fazer isso usando o comando abaixo:

git clone -b branch_name --single-branch project_url local_folder_to_clone_in
nosaiba darwish
fonte
2
Trabalhou problema perfeitamente, eu realmente tive na árvore de origem para clonar um único ramo, assim, fez-lo manualmente
azhar22k
17

Na página do manual git-clone :

--single-branché seu amigo durante o clone, lembre-se de usar com --branch <branch name>ou apenas o HEAD primário remoto será clonado (mestre por padrão)

Lembre-se sempre de fazer Ctrl+ F5para ler a fonte nova, não a do cache :-) (eu não sabia sobre essa opção há muito tempo.)

Casey
fonte
1
git clone <url> --branch <ramo> --single-branch <pasta>
shridutt kothari
17
git clone <url> --branch <branch> --single-branch

Basta colocar o URL e o nome do ramo.

Jitendra
fonte
8

Clone apenas um ramo. Esta é a maneira mais fácil:

$ git clone -b BRANCH_NAME --single-branch [email protected]:___/PROJECTNAME.git
Cubiczx
fonte
4

Para clonar uma ramificação específica, você pode:

git clone --branch yourBranchName [email protected]

nPcomp
fonte
3

Para clonar uma ramificação do Git para a qual você não tem a chave pública, use o seguinte:

git clone -b <branch> <Git repository URL or clone URL you get from Git repository>
Prem S
fonte
2

Abra o cmd.

cd folder_name (digite o caminho para clonar a ramificação)

Apenas um comando:

git clone url_of_projecturltoclone -b branch_name
dhS
fonte
2

Um pouco tarde, mas eu queria adicionar a solução que usei para resolver este problema. Encontrei a solução aqui .

Enfim, a pergunta parece estar perguntando 'como iniciar um novo projeto a partir de uma ramificação de outro repositório?'

Para isso, a solução que usei seria criar um novo repositório no github ou onde quer que fosse. Isso servirá como repo para o seu novo projeto.

Na sua máquina local, navegue até o projeto que possui a ramificação que você deseja usar como modelo para o seu novo projeto.

Execute o comando:

git push https://github.com/accountname/new-repo.git +old_branch:master

O que isso fará é enviar o old_branch para o novo repo e torná-lo o ramo principal do novo repo.

Você só precisa clonar o novo repositório no diretório local do seu novo projeto e iniciar um novo projeto na ramificação antiga.

Aaron Pennington
fonte
2

Vamos dar o exemplo de repositório de frascos. Possui 3 filiais além do master. Vamos verificar a ramificação remota 1.1.x

clonar o repositório git

git clone https://github.com/pallets/flask

cd no repositório.

cd flask

buscar ramificação remota 1.1.x

git fetch origin 1.1.x

checkout do ramo

git checkout 1.1.x

Você alternará para a ramificação 1.1.xe rastreará a ramificação 1.1.x remota.

Chaitanya Vardhan
fonte
0

Semelhante ao que @ nosaiba-darwish disse aqui: aqui

É o que costumamos fazer em nossa empresa:

git clone -b <name_of_branch> --single-branch <git_url> folder_to_clone_locally

Aqeeb Imtiaz Harun
fonte
0

Se você deseja um clone superficial, pode fazer isso com:

git clone -b mybranch --depth=1 https://example.com/myproject.git localname

--depth=1implica --single-branch.

thakis
fonte
0

Existem basicamente 2 soluções para isso:

  1. Você precisa especificar o nome da ramificação com a opção de comando -b. Aqui está a sintaxe do comando para clonar o ramo git específico.

git clone -b <BRANCH_NAME> <GIT_REMOTE_URL>

Exemplo: git clone -b tahir https://github.com/Repository/Project.git

O comando a seguir clonará o ramo tahir do repositório git. O comando acima clona apenas o ramo específico, mas busca os detalhes de outros ramos. Você pode visualizar todos os detalhes das filiais com o comando git branch -a

  1. Você pode usar o sinalizador '--single-branch' para impedir a obtenção de detalhes de outros ramos como abaixo:

git clone -b <BRANCH_NAME> --single-branch <GIT_REMOTE_URL>

Exemplo: git clone -b tahir - único ramo https://github.com/Repository/Project.git

Agora, se você fizer um git branch -a, ele mostrará apenas o seu único ramo atual que você clonou e não todos os ramos. Portanto, depende de você como deseja.

Espero que ajude alguém um dia !! ...

Tahir77667
fonte
0

você pode usar este comando para obter uma única ramificação e renomear a pasta, se desejar manter a ramificação independente

git clone -b [branch-name] --single-branch [url]  [folder_name]

exemplo

git clone -b mybranch --single-branch git://github/repository.git  project_mybranch
Elbaz
fonte
0

git clone --branch {branch-name} {repo-URI}

Exemplo: git clone --branch dev https://github.com/ann/cleaningmachine.git

um apluss
fonte
-1

Pode ser feito em 2 etapas

  1. Clonar o repositório

    • git clone <http url>
  2. Faça o checkout da filial que você deseja

    • git checkout $BranchName
Pramod Setlur
fonte