Cloner juste l'écurie et une autre branche dans git?
Question
Je viens juste de commencer avec git et j'ai une question. Mon application emploie 10 autres développeurs, chacun ayant sa propre branche, telle que dev_XXXXX. Donc, si je fais un clone du référentiel, est-ce que tout leur code est copié sur ma machine? Dans ce cas, je ne veux pas ça. Supposons que ma branche soit dev_swamy, comment puis-je cloner uniquement la branche stable et dev_swamy? Merci.
La solution
Par défaut, git clone
récupérerait toutes les branches, mais celles-ci seraient stockées en tant que branches de suivi à distance: par exemple, la branche 'dev_XXXXX' serait stockée sous le nom 'origine / dev_XXXXX' (avec 'refs / remotes / origin / dev_XXXXX 'comme nom complet). Ces branches de suivi à distance ne seraient pas visibles dans la sortie git branch
: vous auriez besoin de git branch -r
pour répertorier les branches de suivi à distance (ou git branch -a
pour répertorier toutes les branches). Si ces branches ne divergent pas trop de Mainline, elles ne prendraient pas trop d'espace disque dans le référentiel. Par conséquent, je ne vois pas pourquoi vous souhaitiez cloner uniquement les branches sélectionnées.
Néanmoins, si vous voulez avoir un clone avec seulement deux branches sélectionnées, vous pouvez le faire comme ceci:
-
Tout d'abord, créez un nouveau référentiel vide
$ mkdir repoclone $ cd repoclone/ $ git init Initialized empty Git repository in /home/user/repoclone/.git/
-
Ajoutez ensuite votre référentiel sous le nom 'origine' (comme & "; clone git &"; nommez-le), demandant le suivi de deux branches seulement: "master" et "dev_swamy". , en utilisant " git remote & Quot; commander. Vérifiez qu'il a été ajouté correctement.
$ git remote add -t master -t dev_swamy origin user@example.com:repo.git $ git remote origin $ git remote show origin * remote origin Fetch URL: user@example.com:repo.git Push URL: user@example.com:repo.git HEAD branch: master Remote branches: master new (next fetch will store in remotes/origin) dev_swamy new (next fetch will store in remotes/origin)
Si la branche stable s'appelle 'stable' plutôt que 'master', vous devrez bien sûr modifier l'exemple ci-dessus. Il existe également une option
-m <branch>
si vous souhaitez que la branche spécifiée soit la branche par défaut de la télécommande. -
Récupérer à partir de 'origine' (vous pouvez également le faire en utilisant l'option
-f
pour & cter; ajouter Git à distance " ci-dessus):$ git fetch remote: Counting objects: 282, done. remote: Compressing objects: 100% (193/193), done. remote: Total 282 (delta 82), reused 0 (delta 0) Receiving objects: 100% (282/282), 81.30 KiB | 135 KiB/s, done. Resolving deltas: 100% (82/82), done. From user@example.com:repo.git * [new branch] master -> origin/master * [new branch] dev_swamy -> origin/dev_swamy From user@example.com:repo.git * [new tag] v1.0 -> v1.0 * [new tag] v1.0.1 -> v1.0.1 * [new tag] v1.1 -> v1.1
-
Configurez "branche" locale (où vous feriez votre travail) pour suivre "origine / maître" (pour avoir "origine / maître" en amont), exactement comme & "; clone git < !> quot; ferait:
$ git checkout -t origin/master Branch master set up to track remote branch master from origin. Already on 'master'
Vous pouvez répéter cette opération pour la branche "dev_swamy".
-
Vous pouvez maintenant voir à quoi ressemble le fichier de configuration. Vous pouvez obtenir exactement le même résultat en éditant
..git/config
le fichier comme suit, puis en effectuant & "; git fetch &"; .$ cat .git/config # or just open this file in your editor [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] url = user@example.com:repo.git fetch = +refs/heads/master:refs/remotes/origin/master fetch = +refs/heads/dev_swamy:refs/remotes/origin/dev_swamy [branch "master"] remote = origin merge = refs/heads/master
N'oubliez pas de vous présenter à Git avant de commencer à travailler sur le référentiel (c'est-à-dire les variables de configuration 'user.name' et 'user.email'; généralement dans un fichier de configuration par utilisateur)!
Autres conseils
Si vous clonez, toutes les révisions de toutes les branches sont clonées, mais le référentiel cloné extraira master par défaut.
Prendre des branches sélectionnées est plus délicat, car git ne pense pas vraiment que vous devriez travailler de cette façon. Vous devez descendre les branches manuellement:
mkdir repoclone
cd repoclone
git init
git remote add origin git://remote/url
git fetch origin master:master
git fetch origin dev_XXX:dev_XXX
Ci-dessus, c’est ce que je savais avoir fonctionné. Cependant, si vous souhaitez configurer un repo git qui fonctionne normalement, avez-vous une vue plus étroite de ses branches distantes? Vous pouvez le faire assez facilement:
mkdir repoclone cd repoclone git init git remote add origin git://remote/url # now open .git/config for editing in your editor # replace the following line (grab all remote branches) fetch = +refs/heads/*:refs/remotes/origin/* # replace with lines listing exactly which branches you want fetch = +refs/heads/master:refs/remotes/origin/master fetch = +refs/heads/dev_XXX:refs/remotes/origin/dev_XXX # save the file, now run git fetch
Une autre façon de le faire est d'éviter un clonage direct, mais d'ajouter manuellement une télécommande avec un ensemble personnalisé de références de récupération d'extraction.
par exemple
mkdir myclone
cd myclone
git init
git remote add origin url://origin.repo
# Add fetch rules for the branches that we want to track
git config remote.origin.fetch +refs/heads/master:+refs/remotes/origin/master
git config --add remote.origin.fetch +refs/heads/dev_swamy:+refs/remotes/origin/dev_swamy
# fetch now fetches just what we need, subsequently it will do incremental fetches
git fetch
# Creating local branches tracking the remote branches
git checkout -b master origin/master
git branch dev_swamy origin/dev/swamy
Je pense que la question la plus importante ici est de savoir ce que les autres vont pousser, pas ce que vous allez cloner ou tirer. Étant donné que chaque développeur travaille sur sa propre branche, une autre question est de savoir comment créer une base de code commune. Les développeurs fusionnent-ils leurs branches pour les maîtriser? Et poussent-ils alors leur branche principale modifiée vers un référentiel central? Si tel est le cas, vous ne pourrez de toute façon pas tirer les branches des autres développeurs.
Si ce n'est pas le cas, je ne vois pas comment vous pouvez former une équipe fonctionnelle.
Et en fin de compte, je serais curieux de savoir pourquoi vous ne voudriez pas cloner les branches des autres développeurs dans votre référentiel?