Come posso clonare un singolo ramo in Git?


800

Ho un repository Git locale chiamato 'scheletro' che uso per archiviare scheletri di progetto. Ha alcune filiali, per diversi tipi di progetti:

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

Se voglio controllare il ramo principale per un nuovo progetto, posso farlo

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

e tutto è come lo voglio. In particolare, il nuovo ramo principale punta al ramo principale scheletro e posso spingere e tirare per spostarmi tra le modifiche alla configurazione di base del progetto.

Ciò che non funziona, tuttavia, è se voglio clonare un altro ramo. Non riesco a ottenerlo in modo da estrarre solo il ramo desiderato, ad esempio il railsramo, quindi il nuovo repository ha un masterramo che spinge e rimuove dal railsramo del repository scheletro , per impostazione predefinita.

C'è un buon modo per fare questo? O forse questo non è il modo in cui Git vuole che io strutturi le cose, e sono certamente aperto a questo. Forse dovrei avere più repository, con il repository di scheletri Ruby on Rails che traccia il repository di scheletri master? E ogni singolo progetto che clona il repository di scheletri Ruby on Rails.


Cosa git branch -amostra?
Jakub Narębski,

3
Funzionerebbe git checkout -b newbranch origin/branchiwantmeglio? (senza l' --trackopzione)
VonC,

3
Penso che quello che stai cercando di fare ci sia una cattiva idea. Utilizzare repository diversi per progetti diversi. I rami sono qualcosa di completamente diverso.
innaM

@Manni, stavo pensando che, dal momento che git non mi è piaciuto quello che sto facendo. Puoi spiegare perché? È perché i rami non dovrebbero essere vissuti a lungo?
Casey Rodarmor,

1
@rodarmor Penso che quello che stai cercando di fare sia una buona idea, e ho avuto esattamente questa domanda.
Paul Du Bois,

Risposte:


864

Nota: git1.7.10 (aprile 2012) in realtà ti consente di clonare solo un ramo :

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

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

Puoi vederlo in t5500-fetch-pack.sh:

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

Tobu commenta che:

Questo è implicito quando si fa un clone superficiale.
Questo rende git clone --depth 1il modo più semplice per risparmiare larghezza di banda.

E da Git 1.9.0 (febbraio 2014), i cloni superficiali supportano il trasferimento di dati (push / pull), quindi questa opzione è ancora più utile ora.
Vedi di più su " Il git clone --depth 1(clone superficiale) è più utile di quanto non capisca? ".


"Annullare" un clone superficiale è dettagliato in " Converti clone superficiale in 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

Come commenta Chris :

la linea magica per far invertire i rami mancanti --single-branchè (git v2.1.4):

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

Con Git 2.26 (Q1 2020), " git clone --recurse-submodules --single-branch" ora utilizza la stessa opzione a ramo singolo durante la clonazione dei sottomoduli .

Vedi commit 132f600 , commit 4731957 (21 febbraio 2020) di Emily Shaffer ( nasamuffin) .
(Unito da Junio ​​C Hamano - gitster- in commit b22db26 , 05 mar 2020)

clone: passa --sele-branch durante --recurse-submodules

Firmato-fuori: Emily Shaffer
Acked-by: Jeff King

In precedenza, eseguendo " git clone --recurse-submodules --single-branch" risultava che i sottomoduli clonavano tutti i rami anche se il superprogetto clonava solo un ramo.

Inoltra --single-branchattraverso il framework di supporto del sottomodulo per renderlo " clone" in seguito.


80
git clone <url> --branch <branch> --single-branch <folder>funziona come un fascino.
Alexander

1
Sì, penso che sia ora di aggiornare la risposta accettata :) Questo "funziona come un incantesimo"
kumarharsh

5
Inoltre, questo è implicito quando si fa un clone superficiale. Questo rende clone --depth 1il modo più semplice per risparmiare larghezza di banda.
Tobu,

1
@Tobu e VonC --depth 1non sono sicuri per l'utente perché potrebbero voler effettivamente spingere / tirare con il nuovo clone.
nmr

2
Giusto per precisare la correzione completa di Peter Cordes, la linea magica per ottenere i rami mancanti per invertire --single-branchè git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*e git fetch --unshallow(git v2.1.4)
Chris,

670

Un modo è quello di eseguire quanto segue.

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

Dov'è branch_nameil ramo di tua scelta e "/ your / folder" è la cartella di destinazione per quel ramo. È vero che questo porterà altri rami dandoti l'opportunità di unirti avanti e indietro.

Aggiornare

Ora, a partire da Git 1.7.10, ora puoi farlo

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

36
Funziona, ma recupera tutti i rami. Vedi @ frerich = la risposta di raabe sotto.
cdunn2001,

3
Grazie. aggiungere solo "-b branch_name" nel mio caso. Mi ha fatto risparmiare un sacco di tempo.
PhatHV,

Sì, funziona perfettamente ...! Sono più una persona TFS e per i miei progetti personali ho usato git. Wrto git branching, lo stavo facendo nel modo sbagliato prima e buono a conoscere questo metodo semplice e sembra perfetto! Grazie ancora! Ho già fatto +1, se possibile avrei dato +100 :)
k25 l'

11
È inoltre possibile aggiungere --single-branchper recuperare solo la cronologia associata a questo ramo invece di tutta la cronologia e i tag contenuti nel repository.
flawyte,

1
@AlexNolasco Puoi per favore modificare la risposta dicendo cos'è / cartella / ? Grazie
Nabin,

112

Usando Git versione 1.7.3.1 (su Windows), ecco cosa faccio ( $BRANCHè il nome del ramo che voglio controllare ed $REMOTE_REPOè l'URL del repository remoto da cui voglio clonare):

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

Il vantaggio di questo approccio è che le chiamate successive git pull(o git fetch) scaricheranno anche la filiale richiesta.


Qual è la differenza tra la tua sceneggiatura e questa linea? git clone -b $BRANCH $REMOTE_REPO $BRANCHafik sono gli stessi?
Ian Vaughan,

12
@Ian: Una differenza è che git clone -bti dà tutti i riferimenti remoti (tutti i rami e tag remoti) come git branch -amostra. Con la mia sceneggiatura, ottieni solo un riferimento.
Frerich Raabe,

1
Quando provo quanto sopra (diciamo con $ BRANCH = "nick"), ottengo "fatale: impossibile trovare ref / ref / nick remoti". Non sembra funzionare per me ...
Nick,

3
Si noti che -t $BRANCHfunziona anche senza -f, che andrebbe a prendere immediatamente. Quindi git fetch originrecupererebbe e git checkout $BRANCHstabilirà la filiale e il checkout locali. Ciò è utile quando è necessario configurare il telecomando prima di recuperare, ad es git config remote.origin.uploadpack=/bin/upload-pack.
cdunn2001,

1
Dato che sono su un "vecchio" git aziendale (1.6.0.2) sono legato alla soluzione sopra. Ho avuto lo stesso problema di @Nick. Ha branch -amostrato l' esecuzione di git origin/$BRANCH. Farlo git checkout origin/$BRANCHrisolto.
Dr Jerry,

30

Puoi provare nel modo tortuoso:

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

Quello che fa è:

  • Crea e avvia un repository Git vuoto.
  • Aggiunge il repository originale come origine chiamata remota .
  • Recupera solo il ramo richiesto dal telecomando chiamato origin .
  • Crea e verifica un nuovo ramo impostato per tenere traccia del ramo di origine appena clonato.

Spero che sarà qualcosa di simile a ciò che stai cercando.


Gli argomenti per aggiungere l'aggiunta remota vengono scambiati, ma non sono riuscito a far funzionare il checkout. "git checkout origin / rails" mi ha dato "errore: pathspec 'origin / rails' non corrisponde ad alcun file noto a git." e l'alternativa mi ha dato "fatal: checkout git: l'aggiornamento dei percorsi è incompatibile con il cambio di rami".
Casey Rodarmor,

@rodarmor: grazie, ho corretto il comando remoto git. Puoi incollare l'output di git branch -r?
jkp,

@jkp, in realtà git branch -rnon fornisce output.
Casey Rodarmor,

@rodarmor: ho corretto l'esempio e questo sicuramente funziona (testato). HTH (puoi accettarlo una volta testato che ti piace;))
jkp

l'opzione -b è relativamente nuova. L'ultima volta che l'ho eseguito su una compressione debian non era disponibile, IIRC
sehe

23

Puoi farlo usando il comando seguente:

git clone -b branch_name --single-branch project_url local_folder_to_clone_in

2
Ha funzionato perfettamente, in realtà ho avuto problemi in Source Tree per clonare un singolo ramo, quindi l'ho fatto manualmente
azhar22k

17

Dalla pagina man di git-clone :

--single-branch è il tuo amico durante il clone ricordati di usare con --branch <branch name> o verrà clonato solo HEAD primario remoto (master per impostazione predefinita)

Ricorda sempre di fare Ctrl+ F5per leggere una nuova fonte, non quella dalla cache :-) (non lo sapevo da tempo su questa opzione.)


1
git clone <url> --branch <branch> --single-branch <folder>
shridutt kothari

17
git clone <url> --branch <branch> --single-branch

Inserisci l'URL e il nome della filiale.


8

Clona solo un ramo. Questo è il modo più semplice:

$ git clone -b BRANCH_NAME --single-branch git@bitbucket.org:___/PROJECTNAME.git

4

Per clonare un ramo specifico puoi fare:

git clone --branch yourBranchName git@yourRepository.git


3

Per clonare un ramo di Git per il quale non hai la chiave pubblica, usa questo:

git clone -b <branch> <Git repository URL or clone URL you get from Git repository>

2

Apri il cmd.

cd folder_name (inserisci il percorso in cui clonare il ramo)

Solo un comando:

git clone url_of_projecturltoclone -b branch_name

2

Un po 'in ritardo, ma volevo aggiungere la soluzione che ho usato per risolvere questo problema. Ho trovato la soluzione qui .

Ad ogni modo, la domanda sembra porsi "come avviare un nuovo progetto da un ramo di un altro repository?"

Per questo, la soluzione che ho usato sarebbe stata quella di creare prima un nuovo repository in Github o dove mai. Questo servirà come repository per il tuo nuovo progetto.

Sul tuo computer locale, vai al progetto che ha il ramo che vuoi usare come modello per il tuo nuovo progetto.

Esegui il comando:

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

Quello che farà sarà spingere old_branch a new-repo e renderlo il ramo master del nuovo repository.

Devi solo clonare il nuovo repository nella directory locale del tuo nuovo progetto e hai un nuovo progetto avviato nella vecchia filiale.


2

Facciamo l'esempio del repository di matracci. Ha 3 rami oltre al master. Diamo un'occhiata al ramo remoto 1.1.x.

clonare il repository git

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

cd nel repository.

cd flask

recuperare il ramo remoto 1.1.x

git fetch origin 1.1.x

controlla la filiale

git checkout 1.1.x

Passerai al ramo 1.1.x e seguirà il ramo 1.1.x remoto.


0

Simile a ciò che ha detto @ nosaiba-darwish qui: qui

Questo è ciò che di solito facciamo nella nostra azienda:

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


0

Se vuoi un clone superficiale, puoi farlo con:

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

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


0

Ci sono principalmente 2 soluzioni per questo:

  1. È necessario specificare il nome del ramo con l'opzione di comando -b. Ecco la sintassi del comando per clonare il ramo git specifico.

git clone -b <BRANCH_NAME> <GIT_REMOTE_URL>

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

Il seguente comando clonare il ramo Tahir dal repository.The git sopra cloni comando solo il ramo specifico, ma recupera i dettagli di altri rami. È possibile visualizzare tutti i dettagli dei rami con il comando. git branch -a

  1. Puoi usare il flag '--single-branch' per impedire il recupero dei dettagli di altri rami come di seguito:

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

Esempio: git clone -b tahir --single-branch https://github.com/Repository/Project.git

Ora se lo fai a git branch -a , mostrerà solo il tuo singolo ramo attuale che hai clonato e non tutti i rami, quindi dipende da te come lo vuoi.

Spero che possa aiutare qualcuno un giorno !! ...


0

è possibile utilizzare questo comando per accedere a un singolo ramo e rinominare la cartella se si desidera mantenere i rami autonomi

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

esempio

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


-1

Può essere fatto in 2 passaggi

  1. Clona il repository

    • git clone <http url>
  2. Dai un'occhiata al ramo che desideri

    • git checkout $BranchName
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.