当git笔记中存在合并冲突时,合并它们。

10

按照这些说明合并 Git 笔记。

我克隆了一个仓库,将笔记引用添加到提交记录中 (refs/notes/commits)。当我推送时,中央仓库会拒绝它,因为它不是快进式的——因为已经有了该提交对象的 refs/notes/commits。因此为了合并远程笔记引用到我的本地笔记引用中,

$ git checkout refs/notes/master
$ git fetch refs/notes/commits
$ git merge FETCH_HEAD
Auto-merging 206155715a78c9d91d42cda1de98449d2e0b1d36<br>
CONFLICT (add/add): Merge conflict in 206155715a78c9d91d42cda1de98449d........
Automatic merge failed; fix conflicts and then commit the result.
$ vi 206155715a78c9d91d42cda1de98449d........ [fix the conflict as usual manually]
$ git add 206155715a78c9d91d42cda1de98449d........
$ git commit -m "updated Notes"
[detached HEAD 0afb80f] changed notes
$ git update-ref refs/notes/commits HEAD
$ git checkout master <br>
Previous HEAD position was 0afb80f... changed notes
Switched to branch 'master'
$ git push origin refs/notes/commits
success

问题是,这是否是最好的方法?

按照git笔记手册的说明,我尝试了以下操作。

$ git fetch refs/notes/commits
$ git notes merge -v refs/notes/commits
Nothing to Update!

上述步骤显然对我无效。是否有一种方法可以使用git notes merge命令并合并注释,而不是第一幅图所示的“分支方法”?对于我的用途,这个简单直接的命令会更有帮助。


我可以在man页面中读到,有一个特定的命令是为此而设计的,称为git notes merge。参考:http://www.kernel.org/pub/software/scm/git/docs/git-notes.html - Vince
实际上,我尝试了 git notes merge。我更新了我的帖子。但是这对我没有用。它说没有要更新的内容。 - maxmelbin
有需要更新的吗?我的意思是在运行之前你是否尝试过创建冲突?你也可以尝试先执行 git checkout refs/notes/master ,或者至少注意你正在工作的分支。 - Vince
看起来对我来说还不错。但你应该重新考虑你正在做的事情,以便不再发生类似的情况。 - vonbrand
你真的是想要执行 git fetch refs/notes/commits 吗?据我所知,如果没有在前面指定仓库作为其先行参数,你是无法指定 refspec 的。 - Adam Spiers
2个回答

11

正如我在评论中暗示的那样,第一种方法不起作用的原因之一是您错误地复制了说明书:您的第二步骤 git fetch refs/notes/commits 没有指定远程名称。

关于使用 git notes merge 的第二种方法,您再次犯了相同的错误,即从 git fetch 中省略了远程名称。但即使修复了这个问题,我仍然很难让它起作用,直到最后终于发现,在合并之前必须将注释从远程获取到不同的 ref 命名空间中,因为如果存在冲突,它将不允许覆盖本地 refs/notes/commits 指向的内容(尽管如果没有冲突,它会轻松地快进)。

所以这对我有用:

git fetch origin refs/notes/commits:refs/notes/origin/commits
git notes merge -v origin/commits

如果出现冲突,现在会告诉您编辑.git/NOTES_MERGE_WORKTREE,然后通过git notes merge --commit提交结果,或使用git notes merge --abort中止合并。

上面链接建议的技术相比,使用git notes merge的一个主要缺点是合并不提供任何索引,因此不能通过git mergetool等常规合并工作流程进行合并。另一个缺点是它不支持rebase。因此,如果您预计会出现复杂的冲突或需要rebase,则建议使用git checkout refs/notes/commits方法。但在简单情况下,git notes merge可能更方便,因为您可以在工作树处于脏状态时执行合并,而git checkout refs/notes/commits则需要其处于干净状态。

我非常确定git-notes(1)手册可以让这一切更加明显。也许我会找些时间提交一个补丁。但在此期间,我编写了一个新的包装器,名为git-rnotes,可以更容易地与远程存储库共享笔记。


1
对于其他不幸需要这样做的人,请注意,只有当<notes-ref>在refs/notes目录内时,“git notes merge”才有效。如果您将它们放在其他任何地方,它将什么也不会说。 是的,这条路径并不好(多久后命令开始默认考虑所有笔记的“命名空间”,推送开始默认推送它们,并且各种存储库克隆中出现了虚假重复的笔记?),但这就是您必须使用的内容。 - gbr

3
注意:git 2.6(2015年第三/四季度)将使git notes merge更加高效和精确:
请参见提交4f655e2提交d2d68d9提交11dd2b2提交93efcad提交4d03dd1提交e48ad1b(由Jacob Keller (jacob-keller)于2015年8月17日提交)。
(由Junio C Hamano -- gitster --于2015年8月31日在提交5b6211a中合并)

notes:教授git notes关于notes.<name>.mergeStrategy选项的知识

教授notes一个新的"notes.<name>.mergeStrategy"选项,用于配置合并到refs/notes/<name>时的笔记合并策略。
此选项允许选择特定笔记引用的合并策略,而不是所有笔记引用合并,因为用户可能不希望对所有引用使用cat_sort_uniq,只想用于某些引用。
注意,<name>是我们要合并到的本地引用,而不是我们从中合并的远程引用。假设用户大多数情况下都希望配置单独的本地引用合并策略,而不是根据他们从哪个远程引用合并的策略。

notes.<name>.mergeStrategy覆盖通用行为,因为它更具体。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接