【问题标题】:How do I fetch only one branch of a remote Git repository?如何只获取远程 Git 存储库的一个分支?
【发布时间】:2020-11-23 16:01:47
【问题描述】:

我想获取远程存储库的单个分支(不是全部)并创建一个本地跟踪分支,该分支可以跟踪对该远程分支的进一步更新。远程存储库中的其他分支非常大,所以我想避免获取它们。我该怎么做?

【问题讨论】:

  • 一个 git clone 获取整个存储库,包括所有分支。您可以制作浅拷贝,但这仅允许您指定修订的数量,而不是哪些分支。
  • git clone 只需要master。如果你 git fetch,它会占用所有分支

标签: git


【解决方案1】:
git fetch <remote_name> <branch_name>

为我工作。

【讨论】:

  • 刚刚得知获取的分支在获取后可用FETCH_HEAD。谢谢!
  • 然后git checkout FETCH_HEAD 结帐
  • 如何获取
  • @mrgloom 在大多数情况下remote_nameorigin。例如:git fetch origin &lt;branch_name&gt;
  • @mrgloom git remote -v
【解决方案2】:

一种方法如下:

git fetch <remotename> <remote branch>:refs/remotes/<remotename>/<local branch>

但这不会设置跟踪。

有关详细信息,请参阅the documentation of git fetch

编辑:作为@user1338062 notes below:如果您还没有要添加新分支的存储库的本地克隆,但您想创建一个新的本地存储库,那么git clone --branch &lt;branch_name&gt; --single-branch &lt;repo_url&gt; 提供了一个更短的解决方案。

【讨论】:

  • 感谢这符合操作人员的要求。创建一个跟踪分支 git checkout -t /
  • 如果我只是简单地做git checkout &lt;branchname&gt;,我看到 git 会自动设置跟踪分支,如果唯一具有该名称的分支是远程分支。
  • 这是唯一对我有用的东西。即使配置设置为仅获取单个分支的 refs,它仍然使用 fetch 或 pull 将 refs 拉到所有分支。这个命令只拉出我想要的分支,所以 repo 只有 500kb 而不是 5mb。谢谢。
  • 这个答案可能已经过时了。 git clone 现在支持--branch--single-branch 选项,我发布了an answer with demonstration
  • @user1338062 如果您只想在克隆后获取一个新分支(不是所有使用 git fetch 的分支),这仍然有效
【解决方案3】:

我知道已经有很多答案,但这些是对我有用的步骤:

  1. git fetch &lt;remote_name&gt; &lt;branch_name&gt;
  2. git branch &lt;branch_name&gt; FETCH_HEAD
  3. git checkout &lt;branch_name&gt;

这些基于@Abdulsatar Mohammed 的答案、@Christoph 对该答案的评论以及这些其他堆栈溢出问题及其答案:

【讨论】:

  • IMO 最有用的答案
  • 如果分支已经在本地,则失败如下:fatal: A branch named '&lt;branch_name&gt;' already exists.因此我根据您的建议提供了这个improved solution
【解决方案4】:

要更新现有遥控器以跟踪特定分支,请仅使用:

git remote set-branches <remote-name> <branch-name>

来自git help remote

set-branches
    Changes the list of branches tracked by the named remote. This can be used to track a subset of the available remote branches
    after the initial setup for a remote.

    The named branches will be interpreted as if specified with the -t option on the git remote add command line.

    With --add, instead of replacing the list of currently tracked branches, adds to that list.

【讨论】:

  • 太棒了,我在 --single-branch 存储库中,以后无法下载其他分支。谢谢!
【解决方案5】:

一种方法:

在 .git/config 中为远程 repo 获取应该设置为获取任何分支:

   [remote "origin"]
            fetch = +refs/heads/*:refs/remotes/origin/*

获取远程分支:

git fetch origin branch-name

创建一个本地分支 'branch-name' 设置为从源跟踪远程分支 'branch-name'。

git checkout -b branch-name origin/branch-name

列出所有分支

git branch -a

【讨论】:

    【解决方案6】:

    复制自作者的帖子:

    -t 选项用于git remote add,例如:

    git remote add -t remote-branch remote-name remote-url
    

    您可以使用多个-t branch 选项来抓取多个分支。

    【讨论】:

      【解决方案7】:

      如果您想将“git pull”和“git fetch”的默认值更改为仅获取特定分支,那么您可以编辑 .git/config 使远程配置如下所示:

      [remote "origin"]
        fetch = +refs/heads/master:refs/remotes/origin/master
      

      默认情况下,这只会从原点获取主节点。 查看更多信息:https://git-scm.com/book/en/v2/Git-Internals-The-Refspec

      编辑:刚刚意识到这与 -t 选项对 git remote add 所做的相同。如果您不想删除遥控器并使用 -t 再次添加它,那么至少这是在添加遥控器后执行此操作的好方法。

      【讨论】:

      【解决方案8】:

      为了完整起见,这里有一个新结帐的示例命令:

      git clone --branch gh-pages --single-branch git://github.com/user/repo
      

      正如其他答案中提到的,它设置remote.origin.fetch 如下:

      [remote "origin"]
              url = git://github.com/user/repo
              fetch = +refs/heads/gh-pages:refs/remotes/origin/gh-pages
      

      【讨论】:

        【解决方案9】:

        答案实际上取决于您拥有的当前跟踪分支列表。您可以使用git fetch &lt;remote_name&gt; &lt;branch_name&gt; 从远程获取特定分支仅当该分支已经在跟踪分支列表中(您可以使用git branch -r 检查它)。

        假设我之前使用 --single-branch 选项克隆了遥控器,在这种情况下,我唯一的一个跟踪分支是“克隆”的分支。我对手动调整 git config 以及键入 git remote add &lt;remote_name&gt; &lt;remote_url&gt; 命令的建议感到有些困惑。由于“git remote add”设置了一个新的远程,它显然不适用于现有的远程存储库;提供“-t 分支”选项对我没有帮助。

        如果远程存在,并且您要获取的分支存在于该远程中:

        1. 检查git branch -r 是否可以将此分支视为跟踪分支。如果没有(就像我的情况下使用单个分支克隆),请通过“git remote set-branches”和 --add 选项将此分支添加到跟踪分支列表中:
        • git remote set-branches --add &lt;remote_name&gt; &lt;branch_name&gt;
        1. 从远程获取你添加的分支:
        • git fetch &lt;remote_name&gt; &lt;branch_name&gt; 注意:只有在从远程获取新的跟踪分支后,您才能在跟踪分支列表中看到它git branch -r
        1. 使用“checkout --track”创建并签出一个新的本地分支,该分支将被赋予与跟踪分支相同的“branch_name”:
        • git checkout --track &lt;remote_name&gt;/&lt;branch_name&gt;

        【讨论】:

          【解决方案10】:

          最简单的方法

            git fetch origin <branch> && git checkout <branch>
          

          示例:我想从 origin 获取 uat 分支并切换到此作为当前工作分支。

             git fetch origin uat && git checkout uat
          

          【讨论】:

            【解决方案11】:

            git 版本:2.74

            这就是我的做法:

            git remote add [REMOTE-NAME] [REMOTE-URL]
            git fetch [REMOTE-NAME] -- [BRANCH]
            

            【讨论】:

              【解决方案12】:

              git 版本 2.16.1.windows.4

              只需执行 git fetch remoteRepositoryName branchName (eg: git fetch origin my_local_branch) 就足够了。 Fetch 将完成,将创建一个具有相同名称的新本地分支,并将跟踪设置为远程分支。

              然后执行git checkout branchName

              【讨论】:

              • 分支不会出现在git branch 下,直到您签出它
              • 如果您执行git branch -a(所有分支),您应该能够看到远程分支
              【解决方案13】:

              我的解决方法:

              git fetch --depth=1
              git checkout <branch_name>
              

              如果您没有本地克隆:

              git clone --depth 1 -b <branch_name> <repo_url>
              

              【讨论】:

                【解决方案14】:
                1. 选择任何你想使用的&lt;remote_name&gt;(随意使用origin 并跳过第 1 步。)
                2. git remote add &lt;remote_name&gt; &lt;remote_url&gt;
                3. git fetch &lt;remote_name&gt; &lt;branch&gt;
                4. 选择任何你想使用的&lt;your_local_branch_name&gt;。可能与&lt;branch&gt; 相同。
                5. git checkout &lt;remote_name&gt;/&lt;branch&gt; -b &lt;your_local_branch_name&gt;

                希望有帮助!

                【讨论】:

                  【解决方案15】:

                  这种方式适合我。

                  获取目标分支的远程分支:

                  git fetch origin branch-name
                  

                  查看目标分支:

                  git checkout -b branch-name origin/branch-name
                  

                  在这里,我尝试成功获取 release-20.10.08。

                  name:directory zgong$ git fetch release-20.10.04 release-20.10.04
                  fatal: 'release-20.10.04' does not appear to be a git repository
                  fatal: Could not read from remote repository.
                  
                  Please make sure you have the correct access rights
                  and the repository exists.
                  WM-C02WM0T3HTD8:vdca_android_20_10_04_stable zgong$ git fetch origin release-20.10.04
                  From ssh://stash.trusted.visa.com:7999/vdcbc3a/vmcp-android-mobile-app
                   * branch                  release-20.10.04 -> FETCH_HEAD
                  WM-C02WM0T3HTD8:vdca_android_20_10_04_stable zgong$ git checkout -b release-20.10.08 origin/release-20.10.08
                  fatal: 'origin/release-20.10.08' is not a commit and a branch 'release-20.10.08' cannot be created from it
                  WM-C02WM0T3HTD8:vdca_android_20_10_04_stable zgong$ git fetch origin release-20.10.08
                  remote: Counting objects: 637, done.
                  remote: Compressing objects: 100% (320/320), done.
                  remote: Total 637 (delta 303), reused 465 (delta 202)
                  Receiving objects: 100% (637/637), 312.26 KiB | 262.00 KiB/s, done.
                  Resolving deltas: 100% (303/303), done.
                  From ssh://stash.trusted.visa.com:7999/vdcbc3a/vmcp-android-mobile-app
                   * branch                  release-20.10.08 -> FETCH_HEAD
                   * [new branch]            release-20.10.08 -> origin/release-20.10.08
                  WM-C02WM0T3HTD8:vdca_android_20_10_04_stable zgong$ git checkout -b release-20.10.08 origin/release-20.10.08
                  M   VMCP/fmcore_android
                  M   VMCP/foundation_android
                  M   VMCP/mep_3ds_android
                  M   VMCP/mep_login_android
                  M   VMCP/mep_provisioning_and
                  Branch 'release-20.10.08' set up to track remote branch 'release-20.10.08' from 'origin'.
                  Switched to a new branch 'release-20.10.08'
                  

                  【讨论】:

                    【解决方案16】:

                    让我把我的两便士换成MrMadsen's answer

                    1. git fetch &lt;remote_name_or_url&gt; &lt;branch_name&gt;
                    2. git checkout FETCH_HEAD -B &lt;branch_name&gt;

                    这两行相对于MrMadsen's proposal 的主要优势在于,如果分支已经在本地存在,它甚至可以工作。

                    【讨论】:

                      猜你喜欢
                      • 2014-06-20
                      • 2011-03-03
                      • 1970-01-01
                      • 2013-02-21
                      • 1970-01-01
                      • 2014-09-03
                      • 2011-02-02
                      相关资源
                      最近更新 更多