2009-10-23 5 views
14

Ich beginne gerade mit Git und ich habe eine Frage. In meiner App arbeiten 10 andere Entwickler daran, jeder hat seinen eigenen Zweig wie dev_XXXXX. Also, wenn ich einen Klon des Repositories mache, wird der gesamte Code auf meinen Rechner kopiert? In diesem Fall will ich das nicht. Angenommen, mein Zweig ist dev_swamy, wie klon 'ich dann nur den stabilen Zweig und dev_swamy? Vielen Dank.Clone nur den Stall und einen anderen Zweig in Git?

Antwort

23

standardmäßig git clone würde holen alle Verzweigungen, aber diese Zweige würden als Fernverfolgung Verzweigungen gespeichert werden: zum Beispiel Zweig ‚dev_XXXXX‘ gespeichert würden als ‚origin/dev_XXXXX‘ (mit ‚refs/Fernbedienungen/Herkunft/dev_XXXXX 'als vollständiger Name). Diese Remote-Tracking-Zweige sind in der Ausgabe git branch nicht sichtbar: Sie benötigen git branch -r, um Remote-Tracking-Zweige aufzulisten (oder git branch -a, um alle Zweige aufzulisten). Wenn diese Zweige nicht zu sehr von der Hauptlinie abweichen, würden sie nicht zu viel Speicherplatz im Repository beanspruchen. Deshalb sehe ich nicht, warum du nur ausgewählte Zweige klonen willst.

Dennoch, wenn Sie einen Klon mit nur zwei ausgewählten Filialen haben wollen, können Sie es wie folgt tun:

  1. Zunächst erstellen neues leeres Repository

    $ mkdir repoclone 
    $ cd repoclone/ 
    $ git init 
    Initialized empty Git repository in /home/user/repoclone/.git/ 
    
  2. Dann Repository hinzufügen unter dem Namen 'Herkunft' (genau wie "git clone" es nennen würde), das Verfolgen von nur zwei Zweigen anfordert: "Master" und "dev_swamy", mit dem Befehl "git remote". Überprüfen Sie, ob es korrekt hinzugefügt wurde.

    Wenn der stabile Zweig "stabil" statt "Master" heißt, müssten Sie das obige Beispiel natürlich ändern. Außerdem gibt es die Option -m <branch>, wenn Sie festlegen möchten, dass die angegebene Verzweigung standardmäßig in remote verzweigt ist.

  3. Fetch von 'Ursprung' (man könnte dies durch die Verwendung -f Option auch tun, um oben "git remote add"):

    $ 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 [email protected]:repo.git 
    * [new branch]  master  -> origin/master 
    * [new branch]  dev_swamy -> origin/dev_swamy 
    From [email protected]:repo.git 
    * [new tag]   v1.0  -> v1.0 
    * [new tag]   v1.0.1 -> v1.0.1 
    * [new tag]   v1.1  -> v1.1 
    
  4. lokale Niederlassung einrichten 'Master' (wo Sie tun würden Ihre

    für Zweig 'dev_swamy'
    $ git checkout -t origin/master 
    Branch master set up to track remote branch master from origin. 
    Already on 'master' 
    

    Sie können dies wiederholen: Arbeit) tun würde 'origin/master' (haben 'origin/master' als upstream), genau wie "git clone" zu folgen.

  5. Jetzt können Sie sehen, wie die Konfigurationsdatei aussieht. Sie können genau das gleiche Ergebnis erhalten, indem Sie die Datei .git/config so bearbeiten, dass sie wie folgt aussieht, und dann "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 = [email protected]: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 
    

Vergessen Sie sich nicht vorstellen vor Beginn der Arbeiten auf Repository Git (d Satz 'user.name' und 'user.email' config Variablen, in der Regel in pro-Benutzer-Konfigurationsdatei)!

4

Wenn Sie klonen, werden alle Revisionen in allen Zweigen gleichzeitig geklont, aber das geklonte Repository wird standardmäßig den Master auschecken.

Die Auswahl ausgewählter Zweige ist schwieriger, da Git nicht wirklich denkt, dass Sie so arbeiten sollten. Sie müssen die Zweige nach unten ziehen manuell:

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 

Oben ist, was ich gearbeitet wusste. Wenn Sie jedoch ein Git-Repo einrichten möchten, das wie normal funktioniert, haben Sie nur eine engere Sicht auf seine Remote-Zweige? Sie können das tun ziemlich leicht:

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 
+0

Aha! Das ist etwas, über das ich eine Weile nachgedacht habe - gibt es eine Möglichkeit, nur einen Zweig zu klonen. Eine interessante Idee, es auf den Kopf zu stellen und nur das zu holen, was Sie brauchen. Aber der erste Abruf erzeugt diesen Fehler: "fatal: Ablehnen, in aktuellen Zweig Refs/Köpfe/Master von nicht-bare-Repository holen" –

+0

BTW mit modernen Git können Sie 'git init repoclone' –

+0

@Steve: Ah, Sie haben Recht . Sie können ersetzen durch "' git fetch ursprung master; git reset --hard FETCH_HEAD' "Setup-Master. – u0b34a0f6ae

0

Ich denke, die wichtigere Frage ist hier, was andere werden darauf drängen, nicht das, was Sie wird das Klonen oder Ziehen. Da jeder Entwickler an seinem eigenen Zweig arbeitet, ist eine andere Frage, wie Sie mit einer gemeinsamen Codebasis enden. Verschmelzen die Entwickler ihre Zweige zu Master? Und drängen sie dann ihren veränderten Masterzweig zu einem zentralen Repository? Wenn das der Fall ist, gibt es keine Möglichkeit für Sie, die Zweigstellen der anderen Entwickler zu übernehmen.

Wenn das nicht der Fall ist, sehe ich nicht, wie Sie ein funktionierendes Team bilden können.

Und wie ich letzten Gedanken: Ich wäre neugierig zu wissen, warum Sie die Zweige der anderen Entwickler nicht zu Ihrem Repository klonen möchten?

0

Eine andere Möglichkeit besteht darin, einen direkten Klon zu vermeiden, aber stattdessen manuell einen Remote mit einem benutzerdefinierten Satz von fetch refspecs hinzuzufügen.

z.B.

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