代码之家  ›  专栏  ›  技术社区  ›  Swamy g

只克隆稳定和Git中的另一个分支?

  •  14
  • Swamy g  · 技术社区  · 17 年前

    我刚开始和Git打交道,我有个问题。我的应用程序还有10个开发人员在开发它,每个开发人员都有自己的分支,比如dev_xxxxx。所以,如果我克隆了存储库,它们的所有代码是否都会复制到我的机器上?那样的话,我不想那样。假设我的分支是dev_swamy,那么如何克隆稳定分支和dev_swamy?谢谢。

    4 回复  |  直到 17 年前
        1
  •  24
  •   Jakub Narębski adamtaub    17 年前

    默认 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. 从“原点”提取(也可以使用 -f 上面的“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 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”一样:

      $ 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
      

    在开始使用存储库之前,不要忘记向Git介绍自己(例如,设置'user.name'和'user.email'配置变量;通常在每个用户配置文件中)!

        2
  •  4
  •   u0b34a0f6ae    17 年前

    如果克隆,则所有分支中的所有修订都将被克隆,但默认情况下,克隆的存储库将签出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
    
        3
  •  0
  •   CB Bailey    17 年前

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

    例如

    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
    
        4
  •  0
  •   innaM    17 年前

    我认为这里更重要的问题是其他人将推动什么,而不是你将克隆或拉动什么。由于每个开发人员都在自己的分支上工作,另一个问题是如何最终得到一个公共的代码库。开发人员是否将其分支合并到master?然后他们是否将更改后的主分支推送到中央存储库?如果是这样的话,那么无论如何,您也无法拉动其他开发人员的分支。

    如果不是这样的话,我看不出你是如何组成一个有效的团队的。

    最后我想:我很好奇为什么你不想把其他开发人员的分支克隆到你的存储库中?