有没有办法"unfetch"笔记?

Is there a way to "unfetch" notes?

上下文:

我们正在使用 gerrit,我错过了为一些 gerrit 变更集添加 主题

一个人建议做一个 git fetch origin "refs/notes/*:refs/notes/*",然后“编辑”评论笔记并推迟结果。事实证明:我们的权限已设置,因此我可以获取笔记,但不能推送它们。但是有权推动此类更改的人修复了需要修复的条目,所以我在这方面没问题。

出于好奇,我今天又做了git fetch origin "refs/notes/*:refs/notes/*",得到了

remote: Counting objects: 333792, done
...
Resolving deltas: 100% (103/103), completed with 44 local objects.
From ssh://whatever....
 ! [rejected]                refs/notes/review -> refs/notes/review  (non-fast-forward)

这就像我第一次获取“笔记”,我猜想:我在本地真的不需要那些信息。

因此:

您可以:

  • 完全删除您的 refs/notes/review 引用;
  • 保持原样(可能没有理由这样做);或
  • force-update 您自己的 refs/notes/review 来自他们的 refs/notes/review,以便始终拥有最新的。

正在删除您的笔记

其中第一个实现了您的第一个要点。为此,只需 运行:

git update-ref -d refs/notes/review

正在更新您的笔记

最后一个实现了你的第二个要点。为此,运行:

git fetch origin +refs/notes/review:refs/notes/review

或:

git fetch --force origin refs/notes/review:refs/notes/review

这是你第一次做的,除了设置了“强制”标志,告诉你自己的 Git 从他们的更新你的,即使这会丢失你在本地所做的工作。

要在每个 git fetch origin 上执行此操作,您可以执行以下操作之一。我的首选方法是在我的编辑器中打开 .git/configgit config --edit 会这样做)。你会发现,在这个配置文件中,有些行是这样的形式:

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

(还会有一个url设置。)

这条fetch行告诉你的Git:每次我连接到origin,默认情况下,我想要你,我的Git,获取他们所有的 refs/heads/* 名称——他们所有的分支名称——并将它们用于 force-update 我自己的 refs/remotes/origin/* 名称。 这就是你的 remote-tracking 名称工作。

添加 second fetch = 行:

        fetch = +refs/notes/review:refs/notes/review

告诉你的 Git: 然后,从他们的 refs/heads/* 更新了我的 refs/remotes/origin/*,也从他们的 force-update 我的 refs/notes/review refs/notes/review.

您可以有任意多的 fetch 行。您可以使用它们来实现奇特的技巧,例如将其他笔记带入并重命名它们。