1053 votes

Comment cloner une branche unique dans Git ?

J'ai un dépôt Git local appelé "skeleton" que j'utilise pour stocker les squelettes de projets. Il possède quelques branches, pour différents types de projets :

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

Si je veux vérifier la branche master pour un nouveau projet, je peux 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 maîtresse pointe vers la branche maîtresse du squelette, et je peux pousser et tirer pour déplacer les modifications de la configuration de base du projet.

Ce qui ne fonctionne pas, cependant, c'est si je veux cloner une autre branche. Je n'arrive pas à faire en sorte que je ne tire que la branche que je veux, par exemple la branche rails et ensuite le nouveau dépôt a une branche master qui pousse vers et tire depuis le dépôt de squelette rails par défaut.

Y a-t-il une bonne façon de procéder ? Ou peut-être que ce n'est pas la façon dont Git veut que je structure les choses, et je suis certainement ouvert à cette idée. Peut-être devrais-je avoir plusieurs dépôts, le dépôt de squelette Ruby on Rails suivant le dépôt de squelette maître ? Et chaque projet individuel clonant le dépôt de squelette Ruby on Rails.

1 votes

Qu'est-ce que git branch -a le spectacle ?

5 votes

git checkout -b newbranch origin/branchiwant fonctionne mieux ? (sans le --track option)

4 votes

Je pense que ce que vous essayez de faire là est une mauvaise idée. Utilisez des dépôts différents pour des projets différents. Les branches sont quelque chose de complètement différent.

1187voto

VonC Points 414372

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

# clone only the remote primary HEAD (default: origin/master)
git clone <url> --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 commentaires que :

Ceci est implicite lors d'un clone peu profond.
Cela rend git clone --depth 1 le moyen le plus simple d'économiser de la bande passante.

Et depuis Git 1.9.0 (février 2014), les clones superficiels supportent le transfert de données (push/pull), donc cette option est encore plus utile maintenant.
Voir plus à " Est git clone --depth 1 (clone superficiel) plus utile qu'il ne le prétend ? ".


"L'annulation d'un clone superficiel est détaillée dans la section " Convertir un clone peu profond 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 Chris commentaires :

la ligne magique pour que les branches manquantes s'inversent --single-branch est (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 de branche unique lors du clonage des sous-modules .

Voir commettre 132f600 , commit 4731957 (21 févr. 2020) par Emily Shaffer ( nasamuffin ) .
(fusionné par Junio C Hamano -- gitster -- sur commettre b22db26 , 05 Mar 2020)

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

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

Auparavant, le spectacle " git clone --recurse-submodules --single-branch "Le résultat est que les sous-modules clonent toutes les branches même si le superprojet ne clone qu'une seule branche.

Tuyau --single-branch à travers le cadre d'aide du sous-module pour arriver à ' clone plus tard.

116 votes

git clone <url> --branch <branch> --single-branch <folder> fonctionne comme un charme.

2 votes

Oui, je pense qu'il est temps de mettre à jour la réponse acceptée :) Cela "fonctionne comme un charme".

8 votes

De plus, ceci est implicite lors d'un clone peu profond. Cela rend clone --depth 1 le moyen le plus simple d'économiser de la bande passante.

701voto

AlexanderN Points 5805

Une façon de procéder est d'exécuter ce qui suit.

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

branch_name est la branche de votre choix et "/votre/dossier" est le dossier de destination de cette branche. Il est vrai que cela fera apparaître d'autres branches vous donnant la possibilité de fusionner dans les deux sens.

Mise à jour

Maintenant, à partir de Git 1.7.10, vous pouvez faire ceci

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

37 votes

Cela fonctionne, mais il récupère tous branches. Voir la réponse de @frerich=raabe ci-dessous.

3 votes

Merci. J'ai seulement ajouté "-b branch_name" dans mon cas. Cela m'a fait gagner beaucoup de temps.

0 votes

Oui, cela fonctionne parfaitement... ! Je suis plus une personne TFS et pour mes projets personnels, j'ai utilisé git. En ce qui concerne le branchement de git, je le faisais de la mauvaise façon auparavant et je suis content de connaître cette méthode facile et cela semble parfait ! Merci encore ! Déjà +1, si possible je donnerais +100 :)

116voto

Frerich Raabe Points 23711

En utilisant la version 1.7.3.1 de Git (sous Windows), voici ce que je fais ( $BRANCH est le nom de la branche que je veux vérifier et $REMOTE_REPO est 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 l'on peut git pull (ou git fetch ), les appels ne téléchargeront que la branche demandée.

0 votes

Quelle est la différence entre votre script et cette ligne ? git clone -b $BRANCH $REMOTE_REPO $BRANCH afik ils sont les mêmes ?

12 votes

@Ian : Une différence est que git clone -b vous donne toutes les réfs distantes (toutes les branches et tags distants) en tant que git branch -a montre. Avec mon script, vous obtenez juste une seule référence.

1 votes

Lorsque j'essaie ce qui précède (par exemple avec $BRANCH="nick"), j'obtiens "fatal : Couldn't find remote ref refs/heads/nick". Cela ne semble pas fonctionner pour moi...

34voto

jkp Points 20410

Vous pouvez essayer la méthode 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 fait :

  • Créer et initier un dépôt Git vide.
  • Ajoute le dépôt d'origine comme un dépôt distant appelé origine .
  • Récupère uniquement la branche dont vous avez besoin à partir de la branche distante 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 cela correspondra à ce que vous recherchez.

0 votes

Les arguments de git remote add sont échangés, mais je n'ai pas réussi à faire fonctionner checkout. "git checkout origin/rails" m'a donné "error : pathspec 'origin/rails' did not match any file(s) known to git." et l'alternative m'a donné "fatal : git checkout : updating paths is incompatible with switching branches."

0 votes

@rodarmor : j'ai corrigé la commande git remote, merci. Pouvez-vous coller la sortie de git branch -r ?

0 votes

@jkp, en fait git branch -r ne donne aucun résultat.

20voto

Casey Points 471

De Page de manuel de git-clone :

--single-branch est votre ami pendant le clonage n'oubliez pas de l'utiliser avec --branch <branch name> ou seul le HEAD primaire distant sera cloné (master par défaut)

N'oubliez jamais de faire Ctrl + F5 pour lire la source fraîche, pas celle du cache :-) (Je n'ai donc pas connu cette option depuis longtemps).

1 votes

Git clone <url> --branch <branch> --single-branch <folder>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X