【问题标题】:fetch in git doesn't get all branches在 git 中获取并没有得到所有分支
【发布时间】:2012-07-22 08:35:04
【问题描述】:

我已经克隆了一个存储库,之后其他人创建了一个新分支,我想开始处理它。我阅读了手册,似乎很容易。奇怪的是它不起作用,我发现的所有帖子都表明我在做正确的事情。所以我会接受抨击,因为这必须有什么明显的错误:

正确的动作似乎

git fetch
git branch -a
* master
  remotes/origin/HEAD --> origin/master
  remotes/origin/master
git checkout -b dev-gml origin/dev-gml

此时出现问题,不知为何git fetch之后看不到dev-gml远程分支。为什么不?如果我新克隆存储库,它就在那里,所以远程分支肯定存在:

$ mkdir ../gitest
$ cd ../gitest
$ git clone https://github.com/example/proj.git
Cloning into proj...
remote: Counting objects: 1155, done.
remote: Compressing objects: 100% (383/383), done.
remote: Total 1155 (delta 741), reused 1155 (delta 741)
Receiving objects: 100% (1155/1155), 477.22 KiB | 877 KiB/s, done.
Resolving deltas: 100% (741/741), done.
$ cd projdir
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/dev-gml
  remotes/origin/master

我已经尝试了所有可能的排列方式中的git updategit pullgit fetch --allgit pretty-please...

【问题讨论】:

  • git config --get remote.origin.fetch 产生什么?如果不是+refs/heads/*:refs/remotes/origin/*,应该是。
  • 是的,这正是它所产生的
  • 完全相同的问题,但上面的评论解决了它!我有+refs/heads/master:refs/remotes/origin/mastermaster 而不是*
  • 对我来说同样的问题,但此页面上的建议都没有解决它。很奇怪。
  • @thoni56:是的,这可能是由于浅克隆造成的。

标签: git git-branch git-fetch


【解决方案1】:

检查remote.origin.fetch设置时可以看到问题
(以$ 开头的行是我输入的命令的 bash 提示。其他行是结果输出)

$ git config --get remote.origin.fetch
+refs/heads/master:refs/remotes/origin/master

如您所见,在我的例子中,遥控器被设置为专门且仅获取主分支。我按照下面的方法修复了它,包括检查结果的第二个命令。

$ git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
$ git config --get remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*

通配符* 当然表示该路径下的所有内容。

不幸的是,在我已经挖掘并通过反复试验找到答案之后,我看到了this comment

【讨论】:

  • 这应该是公认的答案,因为它实际上解决了原始帖子中的问题。
  • 请注意,如果您仅使用单个分支克隆存储库,则可能会发生这种情况,例如git clone <url> --branch <branch> --single-branch [<folder>]
  • 检查 stux 的答案
  • 使用git clone ... --depth 1克隆时可能会发生这种情况
  • 带有git clone --depth <depth> <repo> 的浅层克隆意味着--single-branch,如手册页git-clone(1) 中所述,因此我们最好使用git clone --depth <depth> --no-single-branch <repo>
【解决方案2】:

我今天在回购中遇到了这个问题。

根据顶级解决方案,这不是 +refs/heads/*:refs/remotes/origin/* 问题。

症状只是 git fetch origingit fetch 似乎没有做任何事情,尽管有远程分支要获取。

在尝试了很多事情之后,我删除了原始遥控器,然后重新创建了它。这似乎已经解决了它。不知道为什么。

删除: git remote rm origin

并重新创建: git remote add origin <git uri>

【讨论】:

  • 我有正确的 git 配置 remote.origin.fetch+refs/heads/*:refs/remotes/origin/*。上述解决方案对我有帮助。
  • 这个解决方案对我来说也是正确的。这是不幸的,因为它表明 Git 中可能存在错误。
  • 这也解决了我的问题。我似乎在 git 版本 2.19.1v 的机器上也遇到了这个问题,但在另一台 git 版本 2.17.1 的机器上没有遇到这个问题
  • git remote update origin 为我工作。我想有些东西需要刷新?
  • git remote update origin 对我不起作用,但删除和添加遥控器可以。
【解决方案3】:

远程更新

你需要跑

git remote update

git remote update <remote> 

然后你可以运行git branch -r 来列出远程分支。

结帐一个新的分支

将(新)远程分支作为本地分支进行跟踪:

git checkout -b <local branch> <remote>/<remote branch>

或(有时如果没有额外的remotes/,它就无法工作):

git checkout -b <local branch> remotes/<remote>/<remote branch>

有用的 git 备忘单

【讨论】:

  • 但我的问题是我无法签出一个 existing 远程分支,因为我的 git 客户端认为它不存在。看我的问题。请注意,当我运行git fetch 后跟git branch -a 时,它不会显示所有分支。我不得不删除我的工作目录并重新克隆以查看协作者创建的分支dev-gml。这次成功了,但我们会经常分支!
  • 嘿@EdwardNewell,谢谢你的回答,只是为了让你知道,你的链接cheat.errtheblog.com/s/git对我来说已经死了......
  • 第一次问这个问题已经很久了,因为有人重新发帖才被ping通。我接受了这个答案,尽管最初对我没有任何实际作用。我最终将其标记为正确的原因是因为我怀疑他在Edit: 旁边写的内容可能会奏效。如果我仍然面临问题,这是我会尝试的。 HTH
  • 为了记录,在这里帮助我的一点是git remote update origin。这使得通过git branch -l -r 可以看到丢失的分支。 (我确实查看了git config --get remote.origin.fetch,结果如预期的那样是+refs/heads/*:refs/remotes/origin/*。)
【解决方案4】:

今天从头开始设置我的仓库时遇到了同样的问题。我尝试了一切,除了删除原点并重新添加它之外,没有任何效果。

git remote rm origin
git remote add origin git@github.com:web3coach/the-blockchain-bar-newsletter-edition.git

git fetch --all
// Ta daaa all branches fetched

【讨论】:

    【解决方案5】:

    从终端写入

    git fetch --prune.
    

    效果很好。

    【讨论】:

    • 谢谢!我尝试了很多东西,并认为我只是试一试...现在来看看我实际做了什么...
    • 它有什么作用?
    • 它需要所有可用的分支。看看头。
    【解决方案6】:

    为了更具体 创建一个跟踪分支,这意味着您现在正在跟踪一个远程分支。

    git branch --track branch remote-branch
    git branch --track exp remotes/origin/experimental
    

    之后就可以了

    git branch   # to see the remote tracking branch "exp" created .
    

    然后在那个分支上工作

    git checkout branchname
    git checkout exp
    

    在对分支进行更改之后。您可以 git fetch 和 git merge 与您的远程跟踪分支合并您的更改并推送到远程分支,如下所示。

    git fetch origin
    git merge origin/experimental  
    git push origin/experimental
    

    希望它对您有所帮助,并让您了解其工作原理。

    【讨论】:

      【解决方案7】:

      我遇到了类似的问题,但在我的情况下,我可以拉/推到远程分支,但 git status 没有显示本地分支状态 w.r.t 远程分支。

      另外,就我而言,git config --get remote.origin.fetch 没有返回任何内容

      问题是在相应远程块的提取行中的.git/config 文件中有错字。可能是我之前误加的东西(有时我直接看这个文件,甚至编辑它)

      所以,请检查您在.git/config 文件中的远程条目是否正确,例如:

      [remote "origin"]
          url = https://[server]/[user or organization]/[repo].git
          fetch = +refs/heads/*:refs/remotes/origin/*
      

      【讨论】:

      • 我今天遇到了同样的情况,我想我找到了线索。我克隆了我的仓库,因为它包含一个“master”和一个“devel”分支。当我运行git config --get remote.origin.fetch 时,它返回+refs/heads/master:refs/remotes/origin/master。但同时,如果我查看配置文件,它会显示 两个 refspecs fetch = +refs/heads/devel:refs/remotes/origin/devel 以及 fetch = +refs/heads/master:refs/remotes/origin/master。似乎git config --get remote.origin.fetch 只返回最后一个条目。因此,如果有疑问,请查看文件并手动添加 refspec。
      • 至少这是我在我的环境中得到的。我绑定在 Windows 系统上,所以我使用安装了 posh-git 模块的 powershell
      【解决方案8】:

      这可能是由于面部手掌时刻:如果您在多个克隆之间切换,很容易发现自己在错误的源代码树中试图拉出一个不存在的分支。当克隆具有相似的名称,或者 repos 是来自多个贡献者中的每个贡献者的同一项目的不同克隆时,这会更容易。当真正的问题是失去焦点或工作环境或两者兼而有之时,一个新的 git clone 显然会解决这个“问题”。

      【讨论】:

        【解决方案9】:

        我不得不进入我的 GitExtensions 远程存储库,因为这里似乎没有任何工作。在那里我看到 2 个分支没有配置远程存储库。调整后如下

        注意分支noExternal3 仍然显示为没有远程存储库。不确定哪个 bash 命令组合会找到或调整它。

        【讨论】:

          【解决方案10】:

          git checkout --track origin/formats 似乎成功了:

          % git branch      ### show local branches
          * main
          
          % git branch - a  ### show local and remote branches
          * main
            remotes/origin/HEAD -> origin/main
            remote/origin/formats
            remote/origin/main
          
          % git checkout --track origin/formats
          Switched to a new branch 'formats'
          Branch 'formats' set up to track remote branch 'formats' from 'origin'
          
          % git branch
          * formats
            main
          

          以下应该做同样的事情,但使用不同的本地分支名称:

          git checkout -b my-formats origin/formats 
          

          在 git c2.23 中提供了新语法 git switch

          git switch -c <branch> --track <remote>/<branch>
          

          【讨论】:

            【解决方案11】:

            我们遇到了同样的问题,你必须使用

            git fetch
            
            git push origin branch_name
            
            git branch -r
            

            希望对遇到同样问题的人有所帮助

            【讨论】:

              猜你喜欢
              • 2020-10-22
              • 2014-04-21
              • 2019-11-02
              • 1970-01-01
              • 2016-03-01
              • 2015-04-24
              • 2021-03-20
              • 1970-01-01
              • 2014-03-28
              相关资源
              最近更新 更多