Comment cloner une seule branche dans Git?
j'ai un dépôt Git local appelé "skeleton" que j'utilise pour stocker des squelettes de projet. Il a 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 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 souhaite. Plus précisément, la nouvelle branche master pointe vers la branche skeleton master, et je peux pousser et tirer pour déplacer les changements dans 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 branche rails
, et ensuite le nouveau dépôt a une branche master
qui pousse et tire vers la branche rails
du dépôt squelette, par défaut.
Est-il une bonne façon de faire? Ou, peut-être que ce n'est pas la façon dont Git veut que je structure les choses, et je suis certainement ouvert à que. Peut-être devrais-je avoir plusieurs dépôts, avec le dépôt de squelette Ruby on Rails qui suit le dépôt de squelette principal? Et tout projet de Clonage individuel du dépôt de squelettes de Ruby on Rails.
14 réponses
Note: the git1.7.10 (avril 2012) 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 en t5500-fetch-pack.sh
:
test_expect_success 'single branch clone' '
git clone --single-branch "file://$(pwd)/." singlebranch
'
ceci est implicite lorsque l'on fait une clone.
Cela fait degit clone --depth 1
la façon la plus facile 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.
En savoir plus sur est-ce que git clone --depth 1
(clone superficiel) est plus utile qu'il n'y paraît? ".
"défaire" un clone superficiel est détaillé à " convertir 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 magie de la ligne pour obtenir manquant branches à l'envers
--single-branch
est (git v2.1.4):
git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git fetch --unshallow
une façon est d'exécuter ce qui suit.
git clone user@git-server:project_name.git -b branch_name /your/folder
où branch_name
est la branche de votre choix et" /your/folder " est le dossier de destination pour cette branche. Il est vrai que cela va apporter d'autres branches vous donnant l'occasion de fusionner en avant et en arrière. Maintenant, à partir de Git 1.7.10, vous pouvez maintenant faire ceci""
git clone user@git-server:project_name.git -b branch_name --single-branch /your/folder
en utilisant la version 1.7.3.1 de Git (sur 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 dépôt 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 subséquents git pull
(ou git fetch
) téléchargeront simplement la branche demandée.
Vous pouvez essayer de longue haleine:
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 n'est:
- crée et inite un dépôt Git vide.
- ajoute le dépôt original comme une télécommande appelée origin .
- ne récupère que la branche dont vous avez besoin à partir de la télécommande appelée origin .
- Crée et vérifie une nouvelle branche qui est mis en place pour trace la branche source que tu viens de cloner.
J'espère que ce sera quelque chose comme ce que vous êtes après.
vous pouvez le faire en utilisant la commande suivante:
git clone -b branch_name --single-branch project_url local_folder_to_clone_in
à Partir de git clone de l'homme page :
--single-branch
est votre ami pendant le clone
n'oubliez pas d'utiliser avec --branch <branch name>
ou seule la tête primaire distante sera clonée (master par défaut)
rappelez-vous de Toujours faire Ctrl + F5 pour lire la nouvelle source, et non celle de cache :-) (Je ne savais pas trop à propos de cette option pendant longtemps.)
git clone <url> --branch <branch> --single-branch
vient de mettre L'URL et le nom de la branche.
peut être fait en 2 étapes
-
Cloner le dépôt
-
git clone <http url>
-
-
la Caisse de la branche que vous souhaitez
-
git checkout $BranchName
-
après le clonage était complet, j'ai dû entrer git submodule update --init --recursive
pour télécharger tous les sous-modules
ouvrez le cmd.
cd folder_name
(entrer le chemin où cloner la branche)
une seule commande:
git clone url_of_projecturltoclone -b branch_name
pour cloner une branche de Git vous n'avez pas la clé publique, utilisez ceci:
git clone -b <branch> <Git repository URL or clone URL you get from Git repository>
pour cloner une branche spécifique, vous pouvez faire:
git clone --branch yourBranchName git@yourRepository.git
Clone une seule branche. C'est la voie la plus facile:
$ git clone -b BRANCH_NAME --single-branch git@bitbucket.org:___/PROJECTNAME.git
- Ouvrir Git Bash.
- Créer un répertoire dans votre système de fichiers où vous voulez extraire.
- $ mkdir Feature_develop_branch
- changer le répertoire en Feature_develop_branch dossier.
- $ cd Feature_develop_branch
- Clone le dépôt utilisant une URL de clone externe.
- $ git clone https://someurl.repositoryName.git
- après le clonage, changez le répertoire en created repositoryName.
- $ cd /repositoryName
- Vérifiez la succursale.
- $ git checkout
<Branch Name>
- $ git checkout