Ich bin gerade erst mit Git begonnen und ich habe eine Frage. An meiner App arbeiten 10 andere Entwickler, jeder hat seinen eigenen Zweig wie dev_XXXXX. Wenn ich einen Klon des Repositorys erstelle, wird dann der gesamte Code auf meinen Rechner kopiert? In diesem Fall möchte ich das nicht. Angenommen, mein Zweig ist dev_swamy, wie kann ich dann nur den stabilen Zweig und dev_swamy klonen? Danke!
Antworten
Zu viele Anzeigen?Standardmäßig git clone
würde alle Zweige abrufen, aber diese Zweige würden als Remote-Tracking-Zweige gespeichert: z.B. würde der Zweig 'dev_XXXXX' als 'origin/dev_XXXXX' gespeichert (mit 'refs/remotes/origin/dev_XXXXX' als vollständigem Namen). Diese Remote-Tracking-Zweige wären nicht sichtbar in git branch
Ausgabe: Sie benötigen git branch -r
zur Auflistung von Zweigen mit Fernverfolgung (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. Daher verstehe ich nicht, warum Sie nur ausgewählte Zweige klonen wollen.
Wenn Sie jedoch einen Klon mit nur zwei ausgewählten Zweigen haben möchten, können Sie dies wie folgt tun:
-
Erstellen Sie zunächst ein neues leeres Repository
$ mkdir repoclone $ cd repoclone/ $ git init Initialized empty Git repository in /home/user/repoclone/.git/
-
Fügen Sie dann Ihr Repository unter dem Namen "origin" hinzu (so wie es bei "git clone" heißen würde) und fordern Sie die Verfolgung von nur zwei Zweigen an: 'master' und 'dev_swamy', unter Verwendung von " Git-Fernbedienung Befehl". Überprüfen Sie, ob er korrekt hinzugefügt wurde.
$ 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)
Wenn der stabile Zweig "stable" und nicht "master" heißt, müssen Sie natürlich das obige Beispiel ändern. Außerdem gibt es
-m <branch>
wenn Sie möchten, dass der angegebene Zweig der Standardzweig in remote ist. -
Fetch from 'origin' (Sie können dies auch durch Verwendung von
-f
Option zu "git remote add" oben):$ 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
-
Richten Sie den lokalen Zweig "master" (in dem Sie Ihre Arbeit erledigen) so ein, dass er auf "origin/master" folgt (damit "origin/master" als Upstream fungiert), genau wie es "git clone" tun würde:
$ git checkout -t origin/master Branch master set up to track remote branch master from origin. Already on 'master'
Sie können dies für den Zweig "dev_swamy" wiederholen.
-
Jetzt können Sie sehen, wie die Konfigurationsdatei aussieht. Sie können genau das gleiche Ergebnis erzielen, indem Sie
.git/config
Datei wie folgt aussehen lassen und dann "git fetch" ausführen .$ 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
Vergessen Sie nicht, sich in Git einzuführen, bevor Sie mit der Arbeit am Repository beginnen (d.h. setzen Sie die Konfigurationsvariablen 'user.name' und 'user.email'; normalerweise in der Konfigurationsdatei pro Benutzer)!
Wenn Sie klonen, werden alle Revisionen in allen Zweigen mit geklont, aber das geklonte Repository checkt standardmäßig master aus.
Die Übernahme ausgewählter Zweige ist schwieriger, da Git diese Arbeitsweise nicht wirklich unterstützt. Sie müssen die Zweige manuell herunterziehen:
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
Ich wusste, dass die obige Methode funktioniert. Wenn Sie jedoch ein Git-Repository einrichten möchten, das normal funktioniert, nur mit einer engeren Sicht auf die entfernten Zweige? Das können Sie ganz einfach tun:
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
Eine andere Möglichkeit besteht darin, einen direkten Klon zu vermeiden und stattdessen manuell ein 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
Ich denke, die wichtigere Frage ist hier, was andere vorantreiben werden, und nicht, was Sie klonen oder abziehen werden. Da jeder Entwickler an seinem eigenen Zweig arbeitet, ist eine weitere Frage, wie man zu einer gemeinsamen Codebasis kommt. Führen die Entwickler ihre Zweige zu Master zusammen? Und schieben sie dann ihren geänderten Master-Zweig in ein zentrales Repository? Wenn das der Fall ist, gibt es für Sie keine Möglichkeit, die Zweige der anderen Entwickler zu übernehmen.
Wenn das nicht der Fall ist, weiß ich nicht, wie Sie ein funktionierendes Team bilden können.
Und wie ich zuletzt dachte: Ich würde gerne wissen, warum Sie die Zweige der anderen Entwickler nicht in Ihr Repository klonen wollen?