Comment cloner une seule branche dans Git?

800

J'ai un référentiel Git local appelé «squelette» que j'utilise pour stocker des squelettes de projet. Il dispose de plusieurs branches, pour différents types de projets:

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

Si je veux vérifier la branche principale pour un nouveau projet, je peux le faire

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

et tout est comme je le veux. Plus précisément, la nouvelle branche principale pointe vers la branche principale squelette, et je peux pousser et tirer pour déplacer les modifications apportées à la configuration de base du projet.

Ce qui ne fonctionne pas, cependant, c'est si je veux cloner une autre branche. Je ne peux pas l'obtenir de sorte que je ne tire que la branche que je veux, par exemple la railsbranche, puis le nouveau référentiel a une masterbranche qui pousse et tire de la railsbranche du référentiel squelette , par défaut.

Y a-t-il une bonne façon de procéder? Ou, peut-être que ce n'est pas ainsi que Git veut que je structure les choses, et je suis certainement ouvert à cela. Peut-être devrais-je avoir plusieurs référentiels, avec le référentiel squelette Ruby on Rails qui suit le référentiel squelette maître? Et tout projet individuel clonant le référentiel squelette Ruby on Rails.

Casey Rodarmor
la source
Que git branch -amontre-t-on?
Jakub Narębski
3
Serait git checkout -b newbranch origin/branchiwantmieux? (sans --trackoption)
VonC
3
Je pense que ce que vous essayez de faire est une mauvaise idée. Utilisez différents référentiels pour différents projets. Les succursales sont quelque chose de complètement différent.
innaM
@Manni, je pensais en quelque sorte que, puisque git ne semblait pas aimer ce que je fais. Pouvez-vous expliquer pourquoi? Est-ce parce que les branches ne devraient pas durer longtemps?
Casey Rodarmor
1
@rodarmor Je pense que ce que vous essayez de faire est une bonne idée, et j'avais exactement cette question.
Paul Du Bois

Réponses:

864

Remarque: le git1.7.10 (avril 2012) vous permet en fait de cloner une seule branche :

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

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

Vous pouvez le voir dans t5500-fetch-pack.sh:

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

Tobu commente que:

Ceci est implicite lors de la création d'un clone superficiel.
Cela constitue git clone --depth 1le moyen le plus simple d'économiser de la bande passante.

Et depuis Git 1.9.0 (février 2014), les clones peu profonds prennent en charge le transfert de données (push / pull), de sorte que cette option est encore plus utile maintenant.
Voir plus sur " Est-ce que git clone --depth 1(clone peu profond) est plus utile qu'il ne le semble? ".


"Annuler" un clone superficiel est détaillé dans " Convertir un clone superficiel en clone complet " (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

Comme le commente Chris :

la ligne magique pour inverser les branches manquantes --single-branchest (git v2.1.4):

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

Avec Git 2.26 (Q1 2020), " git clone --recurse-submodules --single-branch" utilise désormais la même option à branche unique lors du clonage des sous-modules .

Voir commit 132f600 , commit 4731957 (21 février 2020) par Emily Shaffer ( nasamuffin) .
(Fusionné par Junio ​​C Hamano - gitster- en commit b22db26 , 05 mars 2020)

clone: passer - single-branch pendant --recurse-submodules

Signé par: Emily Shaffer
Signé par: Jeff King

Auparavant, l'exécution de " git clone --recurse-submodules --single-branch" entraînait le clonage de toutes les branches par les sous-modules, même si le superprojet ne clonait qu'une seule branche.

Tuyautez à --single-branchtravers le cadre auxiliaire du sous-module pour le faire cloneplus tard.

VonC
la source
80
git clone <url> --branch <branch> --single-branch <folder>fonctionne comme un charme.
Alexander
1
Ouais, je pense qu'il est temps de mettre à jour la réponse acceptée :) Cela "fonctionne comme un charme"
kumarharsh
5
En outre, cela est implicite lors de la création d'un clone superficiel. Cela constitue clone --depth 1le moyen le plus simple d'économiser de la bande passante.
Tobu
1
@Tobu et VonC ne --depth 1sont pas sûrs pour l'utilisateur car ils peuvent souhaiter pousser / tirer avec le nouveau clone.
nmr
2
Juste pour expliquer la correction de Peter Cordes dans son intégralité, la ligne magique pour faire inverser les branches manquantes --single-branchest git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*et git fetch --unshallow(git v2.1.4)
Chris
670

Une façon consiste à exécuter ce qui suit.

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

branch_nameest la branche de votre choix et "/ votre / dossier" est le dossier de destination de cette branche. Il est vrai que cela apportera d'autres branches vous donnant la possibilité de fusionner d'avant en arrière.

Mise à jour

Maintenant, à partir de Git 1.7.10, vous pouvez maintenant le faire

git clone user@git-server:project_name.git -b branch_name --single-branch /your/folder
Alex Nolasco
la source
36
Cela fonctionne, mais il récupère toutes les branches. Voir la réponse de @ frerich = raabe ci-dessous.
cdunn2001
3
Merci. n'ajoute que "-b nom_branche" dans mon cas. Cela m'a fait gagner beaucoup de temps.
PhatHV
Oui ça marche parfaitement ...! Je suis plus une personne TFS et pour mes projets personnels, j'utilise git. Wrto git branching, je le faisais mal plus tôt et bon de connaître cette méthode facile et elle semble parfaite! Merci encore! Déjà +1, si possible je donnerais +100 :)
k25
11
Vous pouvez également ajouter --single-branchpour récupérer uniquement l'historique associé à cette branche au lieu de tout l'historique et les balises que contient le référentiel.
flawyte
1
@AlexNolasco Pouvez-vous s'il vous plaît modifier la réponse en disant ce qu'est / certains / dossier ? Merci
Nabin
112

En utilisant Git version 1.7.3.1 (sous Windows), voici ce que je fais ( $BRANCHest le nom de la branche que je souhaite extraire et $REMOTE_REPOest l'URL du référentiel distant à partir duquel je veux cloner):

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

L'avantage de cette approche est que les appels ultérieurs git pull(ou git fetch) ne feront que télécharger la branche demandée.

Frerich Raabe
la source
Quelle est la différence entre votre script et cette ligne? git clone -b $BRANCH $REMOTE_REPO $BRANCHafik ce sont les mêmes?
Ian Vaughan
12
@Ian: Une différence est que git clone -bvous donne toutes les références distantes (toutes les branches et balises distantes) comme le git branch -amontre. Avec mon script, vous obtenez juste une seule référence.
Frerich Raabe
1
Lorsque j'essaye ce qui précède (disons avec $ BRANCH = "nick"), j'obtiens 'fatal: impossible de trouver les références / têtes / nick de référence à distance'. Ça ne semble pas marcher pour moi ...
Nick
3
Notez que cela -t $BRANCHfonctionne même sans -f, qui serait récupéré immédiatement. Ensuite, git fetch originrécupérerait et git checkout $BRANCHétablirait la succursale locale et la caisse. Cela est utile lorsque vous devez configurer la télécommande avant de la récupérer, par exemple git config remote.origin.uploadpack=/bin/upload-pack.
cdunn2001
1
Comme je suis sur un "vieux" git d'entreprise (1.6.0.2), je suis lié à la solution ci-dessus. J'ai eu le même problème que @Nick. L'exécution de git a branch -amontré origin/$BRANCH. Faire git checkout origin/$BRANCHcorrigé cela.
dr jerry
30

Vous pouvez essayer la voie longue:

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

Ce que cela signifie:

  • Créez et lancez un référentiel Git vide.
  • Ajoute le référentiel d' origine comme appelé à distance origine .
  • Récupère uniquement la branche dont vous avez besoin depuis la télécommande appelée origine .
  • Crée et extrait une nouvelle branche qui est configurée pour suivre la branche source que vous venez de cloner.

J'espère que ce sera quelque chose comme ce que vous recherchez.

jkp
la source
Les arguments pour git remote add sont échangés, mais je n'ai pas pu faire fonctionner checkout. "git checkout origin / rails" m'a donné "erreur: pathspec 'origin / rails' ne correspond à aucun fichier connu de git." et l'alternative m'a donné "fatal: git checkout: la mise à jour des chemins est incompatible avec le changement de branche."
Casey Rodarmor
@rodarmor: avez corrigé la commande à distance git, merci. Pouvez-vous coller la sortie degit branch -r ?
jkp
@jkp, en fait git branch -r ne donne en aucune sortie.
Casey Rodarmor
@rodarmor: J'ai corrigé l'exemple et cela fonctionne définitivement (testé). HTH (vous pouvez l'accepter une fois testé, il vous plaît;))
jkp
le commutateur -b est relativement nouveau. La dernière fois que je l' ai couru sur un retrait obligatoire debian n'était pas disponible, IIRC
sehe
23

Vous pouvez le faire en utilisant la commande ci-dessous:

git clone -b branch_name --single-branch project_url local_folder_to_clone_in
nosaiba darwish
la source
2
A parfaitement fonctionné, j'ai en fait eu un problème dans Source Tree pour cloner une seule branche, donc je l'ai fait manuellement
azhar22k
17

Depuis la page de manuel de git-clone :

--single-branchest votre ami pendant le clonage n'oubliez pas d'utiliser avec --branch <branch name>ou seulement HEAD primaire distant sera cloné (maître par défaut)

Rappelez-vous toujours de faire Ctrl+ F5pour lire la nouvelle source, pas celle du cache :-) (Je ne savais donc pas depuis longtemps cette option.)

Casey
la source
1
git clone <url> --branch <branch> --single-branch <folder>
shridutt kothari
17
git clone <url> --branch <branch> --single-branch

Mettez simplement l'URL et le nom de la branche.

Jitendra
la source
8

Clonez une seule branche. C'est le moyen le plus simple:

$ git clone -b BRANCH_NAME --single-branch [email protected]:___/PROJECTNAME.git
Cubiczx
la source
3

Pour cloner une branche de Git dont vous n'avez pas la clé publique, utilisez ceci:

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

Ouvrez le cmd.

cd folder_name (entrez le chemin où cloner la branche)

Une seule commande:

git clone url_of_projecturltoclone -b branch_name
dhS
la source
2

Un peu tard mais je voulais ajouter la solution que j'ai utilisée pour résoudre ce problème. J'ai trouvé la solution ici .

Quoi qu'il en soit, la question semble se poser «comment démarrer un nouveau projet à partir d'une branche d'un autre référentiel?

Pour cela, la solution que j'ai utilisée serait de créer d'abord un nouveau dépôt dans github ou n'importe où. Cela servira de repo à votre nouveau projet.

Sur votre ordinateur local, accédez au projet qui a la branche que vous souhaitez utiliser comme modèle pour votre nouveau projet.

Exécutez la commande:

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

Ce que cela va faire, c'est pousser old_branch vers new-repo et en faire la branche principale du nouveau repo.

Il vous suffit alors de cloner le nouveau référentiel dans le répertoire local de votre nouveau projet et vous avez un nouveau projet démarré dans l'ancienne branche.

Aaron Pennington
la source
2

Prenons l'exemple du dépôt de fiole. Il a 3 branches en plus du master. Voyons la branche distante 1.1.x

cloner le dépôt git

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

cd dans le repo.

cd flask

récupérer la branche distante 1.1.x

git fetch origin 1.1.x

commander la succursale

git checkout 1.1.x

Vous passerez à la branche 1.1.x et il suivra la branche 1.1.x distante.

Chaitanya Vardhan
la source
0

Similaire à ce que @ nosaiba-darwish a dit ici: ici

C'est ce que nous faisons habituellement dans notre entreprise:

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

Aqeeb Imtiaz Harun
la source
0

Si vous voulez un clone peu profond, vous pouvez le faire avec:

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

--depth=1implique --single-branch.

thakis
la source
0

Il existe principalement 2 solutions pour cela:

  1. Vous devez spécifier le nom de la branche avec le commutateur de commande -b. Voici la syntaxe de la commande pour cloner la branche git spécifique.

git clone -b <BRANCH_NAME> <GIT_REMOTE_URL>

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

La commande suivante clonera la branche tahir du référentiel git. La commande ci-dessus ne clone que la branche spécifique mais récupère les détails des autres branches. Vous pouvez afficher tous les détails des branches avec la commande. git branch -a

  1. Vous pouvez utiliser l'indicateur '--single-branch' pour empêcher la récupération des détails d'autres branches comme ci-dessous:

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

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

Maintenant, si vous faites un git branch -a , il ne montrera que votre branche unique actuelle que vous avez clonée et pas toutes les branches. Cela dépend donc de vous comment vous le voulez.

J'espère que ça aidera quelqu'un un jour !! ...

Tahir77667
la source
0

vous pouvez utiliser cette commande pour créer une seule branche et renommer le dossier si vous souhaitez conserver une branche autonome

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

exemple

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

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

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

an-apluss
la source
-1

Peut se faire en 2 étapes

  1. Clonez le référentiel

    • git clone <http url>
  2. Commander la succursale que vous souhaitez

    • git checkout $BranchName
Pramod Setlur
la source