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.

Était-ce utile?

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:

  1. 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/
    
  2. 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.

  3. 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
    
  4. 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".

  5. 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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top