我正在尝试使用git fetch --all
但是在获取某个存储库时它会给我带来错误。
错误:'。git / logs / refs / remotes / tpickel / RS'下仍有日志
和
! [新分支] RS - > tpickel / RS(无法更新本地参考)
出了什么问题以及如何解决?
答案 0 :(得分:13)
显然曾经有tpickel/RS/foo
(某些名称为foo
)。
您的Git在.git/logs/refs/remotes/tpickel/RS/foo
中记录了相关信息。现在你的Git正在尝试创建一个名为.git/logs/refs/remotes/tpickel/RS
的文件,它将记录有关新分支tpickel/RS
的信息。它不能这样做,因为有一个目录,.git/logs/refs/remotes/tpickel/RS
。在路上目录包含一些文件(foo
或其他名称,上面没有任何内容可以显示实际名称),这就是你的Git为tpickel/RS/foo
保留reflog的方式。
现在远程分支tpickel/RS
消失了,你的Git需要删除refs/remotes/tpickel/RS/foo
及其reflog文件。理想情况下,git fetch --prune tpickel
将同时为您执行这两个操作,在尝试创建tpickel/RS
及其reflog之前,这是因为延迟{{ 1}}。
如果tpickel/RS/foo
有效,那就完成了。如果没有,您必须转到--prune
并删除所有.git/logs/refs/remotes/tpickel/
和RS
条目,或者重命名它们以使它们不受影响。 (如果你想保存这些,尽管远程RS/*
已经删除了分支,移动它们而不是删除它们,并且不要让tpickel
删除它们。你可能不想保存它们。)
git fetch --prune
意味着什么当您运行--prune
(例如git fetch remote
)时,Git会联系指定的 git fetch tpickel
,并从中获取所有引用的列表。您可以随时通过运行remote
来查看此列表:这会调用相同的开始,但在获取列表后停止,而不是继续执行获取。
假设(正常的默认情况),Git被指示将所有分支引用复制到远程跟踪分支。在此特定示例中,这意味着将git ls-remote remote
复制到refs/heads/master
。这种复制通常是附加的:如果远程refs/remotes/tpickel/master
今天有分支tpickel
和master
,明天又添加develop
,那么今天您将拥有两个远程跟踪分支机构你明天在取feature
时会添加一个新的。但是,在某些时候,他们可能删除分支。如果他们在您使用feature
时删除feature
该怎么办?
Git对这个难题的回答是默认永远保留任何复制的引用。正如您刚刚看到的,在删除旧分支后,这有时会妨碍新分支,因此这种解决方案并不完美。添加refs/remotes/tpickel/feature
的做法是获取完整列表,将其与您的远程跟踪分支集进行比较,并从本地存储库中删除任何没有相应分支的远程跟踪分支遥控器。也就是说,仅仅因为我们昨天将他们的 --prune
复制到我们的 refs/heads/develop
,并不意味着我们应该保持今天refs/remotes/tpickel/develop
,如果他们的 refs/remotes/tpickel/develop
消失了。因此,如果您指定refs/heads/develop
,Git会查找此类事件并删除任何陈旧的远程跟踪分支。
这段代码已经存在了一段时间(我认为是1.7左右)。 Git版本1.8.5添加了两个配置项:--prune
和fetch.prune
(例如,remote.remote.prune
)。如果remote.tpickel.prune
设置为fetch.prune
,则true
始终会修剪;如果特定遥控器的配置设置为git fetch
,则true
修剪该特定遥控器。
(代码在Git 2.0.0版本中有所改进,以处理潜在的模糊映射。这包括多个上游引用可能映射到相同远程跟踪引用的情况。通过正常设置,这种情况永远不会发生:它只有在为某些命名的远程组成自己的git fetch
条目时才会出现。)
答案 1 :(得分:5)
运行“rm -rf .git / logs”解决了我的问题。
答案 2 :(得分:0)
我遇到了类似的问题,删除了.git/logs/refs/remotes/tpickel/RS/foo
已解决