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
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:
Zunächst erstellen neues leeres Repository
$ mkdir repoclone $ cd repoclone/ $ git init Initialized empty Git repository in /home/user/repoclone/.git/
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.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
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.
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)!
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
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?
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
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" –
BTW mit modernen Git können Sie 'git init repoclone' –
@Steve: Ah, Sie haben Recht . Sie können ersetzen durch "' git fetch ursprung master; git reset --hard FETCH_HEAD' "Setup-Master. – u0b34a0f6ae