24 Stimmen

Nur den stabilen und einen anderen Zweig in Git klonen?

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!

27voto

Jakub Narębski Punkte 286531

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:

  1. Erstellen Sie zunächst ein neues leeres Repository

    $ mkdir repoclone
    $ cd repoclone/
    $ git init
    Initialized empty Git repository in /home/user/repoclone/.git/
  2. 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.

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

  5. 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)!

4voto

u0b34a0f6ae Punkte 45029

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

2voto

CB Bailey Punkte 693084

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

0voto

innaM Punkte 46916

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X