git错误:还有日志

时间:2016-05-12 14:24:47

标签: git

我正在尝试使用git fetch --all但是在获取某个存储库时它会给我带来错误。

  

错误:'。git / logs / refs / remotes / tpickel / RS'下仍有日志

  

[新分支] RS - > tpickel / RS(无法更新本地参考)

出了什么问题以及如何解决?

Java test page

3 个答案:

答案 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今天有分支tpickelmaster,明天又添加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添加了两个配置项:--prunefetch.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已解决