首页 > 解决方案 > Git - 检查 git notes 分支是否在远程后面

问题描述

我正在开发一个在 pre-push 上运行的 git-hook。它的目的是防止你推送分支,如果有未推送的 git 注释。为了实现这一点,我需要能够在 pre-push 挂钩期间运行一些逻辑,以检测是否有 unpush refs/notes/commits

不幸的是 - 我在 git 上很糟糕。

我在这里尝试了这种方法:检查本地 git repo 是否在远程之前/之后 但是当我这样做时,git merge-base refs/notes/commits origin/refs/notes/commitsgit 只会告诉我:

fatal: Not a valid object name origin/refs/notes/commits

这是我的参考规范:

[remote "origin"]
    url = https://github.com/dazinator/GitHookExperiment.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    fetch = +refs/notes/*:refs/notes/*

我已经在本地添加了一些注释,git notes add所以我的本地仓库 - 我知道它有尚未推送的注释。当我在另一个分支(当前正在推送的分支)上时,我只是不知道运行什么 git 命令来检测这个事实。

我正在寻找一些git可以运行的命令以产生可以解析的输出,从而给我一个明确的“是”或“否”,说明注释分支是否落后。

标签: git

解决方案


这一行:

fetch = +refs/notes/*:refs/notes/*

告诉你的 Git:把他们的refs/notes/*名字复制到我的refs/notes/*名字。 您根本没有任何origin/refs/notes/commits名字,您只需将他们的哈希 ID 复制 refs/notes/commits您自己的refs/notes/commits.

这意味着如果您添加自己的提交注释,下一个会将它们git fetch清除掉,因为它会获取最新的注释,丢弃(强制更新)您自己的.refs/notes/commits

如果您想维护自己的笔记,您需要将他们的笔记放在不同的地方,或者将您的笔记存储在不同的地方(其中一个)。该git notes系统在所有这些方面都不是非常好 - 它在这里根本不是真正的用户友好型。

我建议以您自己的名字存储您的笔记,并为他们的笔记使用标准名称。我认为你可以这样做:

git config core.notesRef refs/notes/mynotes

例如。确保不要使用以下方法覆盖注释参考:

fetch = +refs/notes/commits:refs/notes/commits

这样您就只能refs/notes/commits从他们的refs/notes/commits.

您现在可以使用以下方法判断您的笔记和他们的笔记是否不匹配:

git rev-parse refs/notes/commits
git rev-parse refs/notes/mynotes

这两个命令将产生两个哈希 ID。如果哈希 ID 不匹配,则您有不同的提交作为最尖端的注释提交。

(请注意,如文档所示,您可以通过多种方式临时覆盖注释名称,无论您是否refs/notes/commits使用上述方法覆盖了默认默认名称core.notesRef。此处的术语“默认默认”表示这refs/notes/commits是默认值,如果core.notesRef未设置。设置设置新的默认值。core.notesRef


推荐阅读