在git中克隆稳定和另一个分支?

时间:2009-10-23 19:38:47

标签: git git-clone

我刚刚开始使用git,我有一个问题。我的应用程序有10个其他开发人员在使用它,每个开发人员都有自己的分支,如dev_XXXXX。因此,如果我对存储库进行克隆,那么他们的所有代码都会被复制到我的机器上吗?在那种情况下,我不想要那样。假设我的分支是dev_swamy,那么如何克隆稳定分支和dev_swamy呢?谢谢。

4 个答案:

答案 0 :(得分:24)

默认情况下git clone将获取所有分支,但这些分支将存储为远程跟踪分支:例如,分支'dev_XXXXX'将存储为'origin / dev_XXXXX'(带'refs / remotes / origin / dev_XXXXX'作为全名)。这些远程跟踪分支在git branch输出中不可见:您需要git branch -r列出远程跟踪分支(或git branch -a列出所有分支)。如果这些分支与主线没有太大分歧,则它们不会在存储库中占用太多磁盘空间。因此,我不明白为什么你只想克隆选定的分支。

然而,如果你想要一个只有两个选定分支的克隆,你可以这样做:

  1. 首先,创建新的空存储库

    $ mkdir repoclone
    $ cd repoclone/
    $ git init
    Initialized empty Git repository in /home/user/repoclone/.git/
    
  2. 然后以名称'origin'添加您的存储库(就像“git clone”将其命名),请求仅跟踪两个分支:'master'和'dev_swamy',使用“git remote “命令。检查它是否已正确添加。

    $ 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)
    

    如果稳定分支被称为“稳定”而不是“主”,那么你当然可以修改上面的例子。如果您希望指定的分支是远程的默认分支,还有-m <branch>选项。

  3. 从'origin'获取(您也可以使用上面的“git remote add”-f选项执行此操作):

    $ 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. 设置本地分支'master'(你将在哪里工作)跟随'origin / master'(将'origin / master'作为上游),就像“git clone”那样:< / p>

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

    您可以对分支'dev_swamy'重复此操作。

  5. 现在您可以看到配置文件的外观。 您可以通过将.git/config文件编辑为如下所示来获得完全相同的结果,然后执行“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
    
  6. 在开始使用存储库之前,不要忘记向Git介绍自己(例如,设置'user.name'和'user.email'配置变量;通常在每用户配置文件中)!

答案 1 :(得分:4)

如果您克隆,则克隆所有分支中的所有修订,但克隆的存储库将默认签出master。

选择分支是很棘手的,因为git并不认为你应该这样做。你必须手动拉下分支:

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

以上就是我所知道的。但是,如果你想设置一个正常工作的git repo,那么它的远程分支只有一个更窄的视图?你可以很容易地做到这一点:

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

答案 2 :(得分:0)

我认为这里更重要的问题是其他人会推动什么,而不是你将克隆或拉动什么。由于每个开发人员都在自己的分支上工作,另一个问题是如何最终使用公共代码库。开发人员是否将他们的分支合并到掌握?然后他们将他们改变的主分支推送到中央存储库吗?如果是这种情况,那么无论如何都无法吸引其他开发者的分支机构。

如果情况并非如此,我看不出你如何组建一个有效的团队。

正如我最后想的那样:我很想知道你为什么不想将其他开发人员的分支克隆到你的存储库?

答案 3 :(得分:0)

另一种方法是避免直接克隆,而是使用一组自定义的fetch refspecs手动添加一个遥控器。

e.g。

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