我们如何验证推送的提交消息?

2024-03-11

来自 CVS 的政策是,提交消息应标有错误编号(简单后缀“... [9999]”)。 CVS 脚本在提交期间对此进行检查,如果消息不符合则拒绝提交。

git hook commit-msg 在开发人员方面执行此操作,但我们发现自动系统检查并提醒我们这一点很有帮助。

在 git Push 期间,commit-msg 不会运行。推送期间是否有另一个钩子可以检查提交消息?

我们如何在 git Push 期间验证提交消息?


使用更新挂钩

您了解 Hooks - 请阅读文档 http://www.kernel.org/pub/software/scm/git/docs/githooks.html#cruft-to-get-past-stackoverflow-6-character-minimum-edit关于他们!您可能需要的钩子是 update,每个引用运行一次。 (预接收钩子在整个推送过程中运行一次)SO 上已经有大量关于这些钩子的问题和答案;根据您想要执行的操作,如果需要,您可能可以找到有关如何编写挂钩的指导。

为了强调这确实是可能的,引用文档中的一段话:

通过确保对象名称是一个提交对象,该对象是旧对象名称命名的提交对象的后代,可以使用此挂钩来防止对某些引用进行强制更新。也就是说,强制执行“仅快进”策略。

它还可用于记录旧的..新的状态。

以及具体情况:

该钩子为每个要更新的引用执行一次,并采用三个参数:

  • 正在更新的引用的名称,
  • 存储在 ref 中的旧对象名称,
  • 以及要存储在 ref 中的新对象名。

因此,举例来说,如果您想确保所有提交主题都不超过 80 个字符,则一个非常基本的实现将是:

#!/bin/bash
long_subject=$(git log --pretty=%s $2..$3 | egrep -m 1 '.{81}')
if [ -n "$long_subject" ]; then
    echo "error: commit subject over 80 characters:"
    echo "    $long_subject"
    exit 1
fi

当然,这只是一个玩具示例;在一般情况下,您将使用包含完整提交消息的日志输出,将其按提交拆分,并在每个单独的提交消息上调用验证代码。

为什么需要更新挂钩

这已在评论中讨论/澄清;这是一个总结。

更新挂钩每个引用运行一次。 ref 是指向对象的指针;在这种情况下,我们讨论的是分支和标签,通常只是分支(人们不经常推送标签,因为它们通常只是用于标记版本)。

现在,如果用户将更新推送到两个分支(主分支和实验分支):

o - o - o (origin/master) - o - X - o - o (master)
 \
  o - o (origin/experimental) - o - o (experimental)

假设 X 是“坏”提交,即会使 commit-msg 挂钩失败的提交。显然我们不想接受掌握的推动。因此,更新挂钩拒绝了这一点。但是实验性的提交没有任何问题!更新挂钩接受该挂钩。因此,origin/master 保持不变,但 origin/experimental 会更新:

o - o - o (origin/master) - o - X - o - o (master)
 \
  o - o - o - o (origin/experimental, experimental)

预接收挂钩仅在开始更新引用之前(第一次运行更新挂钩之前)运行一次。如果你使用它,你将不得不导致整个推送失败,也就是说,因为 master 上有一个错误的提交消息,你以某种方式不再相信实验上的提交是好的,即使它们的消息很好!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们如何验证推送的提交消息? 的相关文章

  • Git:man 命令不起作用

    在 Git Bash 中 他们给了我一个error用于返回 man command man git bash man command not found 我的 Git 版本 git version git version 2 18 0 wi
  • 是否可以在一次 git 调用中取消设置多个 git 配置值,而不是逐一取消设置?

    我需要自动取消全局 git 配置文件中的许多别名 diff difftool merge mergetool 设置 现在我正在打电话git config global unset对于他们每个人来说 这有点慢 嗯 相对而言 大约需要 3 秒
  • git分支和标签如何存储在磁盘中?

    我最近检查了我工作中的一个 git 存储库 其中有 10 000 多个分支和 30000 多个标签 新克隆后 存储库的总大小为 12Gigs 我确信没有理由拥有 10000 个分支机构 所以我相信它们会占用磁盘中相当大的空间 所以 我的问题
  • GIT 中的重复合并。它如何计算差异?

    我一直在做一项研究 试图了解 GIT 合并是如何工作的 我知道有几种合并类型 如递归 章鱼等 我发现解析 递归是最常用的 并且递归合并仅在存在多个共同祖先 基础时才有用 但是 我找不到从分支重复合并到主节点时使用哪种算法 或者如何计算祖先
  • Git:结帐而不运行结帐后挂钩

    我有一个我喜欢的结帐后挂钩 大多数时候 但有时我知道运行它会浪费时间 或者 因为它会删除并重建我的开发数据库 所以我不希望它去做它的事情 有没有跳过钩子的 git 选项 公平地说 我已经开始寻找一个了 我认为没有命令行选项可以完成您想要的操
  • 如何重命名 GitHub 网站上的目录/文件夹?

    我在 GitHub 网站上找到了一种方法rename https github com blog 1436 moving and renaming files on github一个文件并成功完成 我也找到了一种方法rename https
  • Git 子模块:[电子邮件受保护]:权限被拒绝(公钥)。致命:无法从远程存储库读取

    我有一个问题git submodule update init remote 我收到错误 权限被拒绝和克隆失败 但我将 SSH 密钥添加到了我的 github 存储库中 我可以拉 推 git 克隆 我拥有所有需要的访问权限 我使用操作系统
  • Gerrit 安装后无法克隆所有项目存储库

    我有一个新设置的 Gerrit 实例 目前只有两个存储库 所有项目 binutils 测试 尝试克隆所有项目时 我收到以下错误 git clone ssh user hostname 29418 All Projects Initializ
  • 如何查看上次提交和现在之间发生了什么变化(进行一些更改后)

    与此类似question https stackoverflow com questions 1552340 how to list the file names only that changed between two commits但
  • 有没有办法缓存 https 凭据以推送提交?

    我最近转而将我的存储库同步到 GitHub 上的 https 由于防火墙问题 并且每次都要求输入密码 有没有办法缓存凭据 而不是每次都进行身份验证git push 自 Git 1 7 9 2012 年发布 以来 Git 中有一个巧妙的机制可
  • vscode通过SSH连接gitlab的问题

    我在尝试通过 SSH 连接到 GitLab 远程存储库时遇到问题 这里是迄今为止完成的步骤 成功生成 SSH 密钥 管理人员将密钥添加到存储库中 因此当我访问 GitLab 网站时 我可以提交和发布分支 我无法从 VSCODE 发布分支并收
  • 如何修复树与树之间的 Git 错误断开链接?

    我的事务被中断 当我再次尝试时 我遇到了空或损坏的对象错误 在另一个问题之后 我删除了所有空文件 当我运行时 git fsck full 我收到这个错误 Checking object directories 100 256 256 don
  • 颠覆和混合修订:破坏构建的秘诀?

    在使用 TFS 一段时间后 我刚刚回到 subversion 一般来说我已经很退出了 有一件事情我记得不一样 我不记得能够从过时的工作副本中提交 或者也许我的记忆力让我无法理解 过时 的定义 我认为 过时 意味着自从我上次更新工作副本以来
  • 运行“git apply”时出错

    当我尝试时 您能否告诉我如何解决 补丁不适用 错误 git 应用补丁 git apply 0001 my patch error patch failed test xml 114 error text xml patch does not
  • refname 不明确且拉取失败

    我运行了以下命令 因为我想将生产分支移回而不必先签出 git branch f production HEAD 1 现在 当我检查生产时 我收到以下警告 warning refname production is ambiguous 然后我
  • 推送时发生 Git 错误 - update_ref 失败

    当我尝试推送本地提交时遇到问题 这可能是在 Android Studio 崩溃时发生的 这是错误 update ref 引用 refs remotes origin master 失败 无法锁定 ref refs remotes origi
  • 如何从 android.googlesource.com 或 github.com 下载单个目录?

    我想下载 https android googlesource com platform frameworks base git master tools aapt https android googlesource com platfo
  • 如何将更改移出主分支

    基本问题 但这一直发生在我身上 进行更改working branch 切换到master git merge working branch git push cap deploy 到舞台 泡一杯新茶 然后我回来思考其他事情并开始做出一些改变
  • `git ls-files -s` 输出中不同字段的含义是什么?

    在 Git 中 命令返回的典型结果行git ls files s好像 100755 be2c2e9b0966253096472d4b482c458bc892e493 0 gitignore 这些字段是什么意思 不用再犹豫了git ls fi
  • git reset 命令中的 ~1 是什么意思?

    git 重置 HEAD 1 我的印象是 1 的意思是 从 HEAD 开始 遵循 1 链接 并将 HEAD 标签设置为新的提交节点 我正期待着 git 重置 HEAD 2 跟随 2 个链接 然后设置 HEAD 标签 但是 如果我尝试它 我会收

随机推荐

  • 在 RecyclerView 项目中显示动态数量的视图?

    我正在尝试重新创建这个 我有一个数据列表 List
  • XDocument.Load(feedUrl) 返回“根级别的数据无效。第 1 行,位置 1。”

    首先 这更多的是一个解决方案 而不是一个问题 我花了一段时间才解决 所以我认为我的解决方案值得分享 我试图使用加载 RSS 提要XDoument Load feedUrl 并收到上述异常 我检查了养活自己 http www limun hr
  • 允许来自 env 的 mod_rewrite 而不是 .htaccess 中的 mod_setenvif

    我试图使用 htaccess 和 Apache 2 2 控制对测试站点 主机的访问 但不控制对生产站点的访问 我使用 mod rewrite 来检测主机名并设置一些用于控制站点各个方面的环境变量 但无法利用它来控制访问 我只能使用 mod
  • 中文字符以粗体呈现

    Silverlight 在文本框中将少数中文字符呈现为粗体 该文本框没有设置字体系列 请参考以下截图 在上面的屏幕截图中 第一个字符比另一个字符更粗 MSDN 的一篇帖子说这是因为字体系列问题和设置SimSun字体系列应该可以解决这个问题
  • 如何更改 matplotlib 中的当前轴实例(即 gca())

    我用一个技巧绘制高度与主轴匹配的颜色条 http matplotlib org mpl toolkits axes grid users overview html colorbar whose height or width in syn
  • 生成唯一的随机字符串

    我正在用 Dancer 编写一个非常小的 URL 缩短器 它使用 REST 插件将发布的 URL 存储在数据库中 该数据库包含六个字符串 用户可以使用该字符串来访问短 URL 现在我对我的随机字符串生成方法有点不确定 sub generat
  • 使用 movefolder 方法时找不到 vbscript 错误路径

    我对 vbscript 相当陌生 并尝试编写一个脚本来获取带有月份和年份标记的文件夹 2012 04 并将它们移动到带有年份标记的文件夹 2012 当我尝试移动文件夹时 我收到 路径未找到 错误 并且我似乎无法在任何地方找到有关其发生原因的
  • 如何计算字符串语句

    给定一个作为计算语句的字符串组合 我怎样才能得到结果 在本例中是下面代码中的列 cal 我知道我可以使用案例 但是有没有直接的方法来进行计算 create table tl test cl1 int create table tl test
  • WPF 的现代 UI - 导航

    如何在页面之间传递参数 我尝试向页面 uri 添加参数 但它不起作用 因为我无法在用户控件上使用 onNavieratedTo 事件 请帮忙 您必须使用 OnFragmentNavigation public void OnFragment
  • 使用 CameraX 的长焦镜头进行变焦

    在我的应用程序中 变焦仅限于主镜头 而不是设备的长焦镜头 如果有的话 长焦镜头可以由任何制造商提供 我不希望实现特定于制造商设备的 API 来访问长焦或广角镜头 这会导致照片质量较差 并且应用程序无法变焦至超过主摄像头的变焦限制 如何使用长
  • 一页上有多个引导轮播,只能控制一个

    我在视图中一次性加载了动态数量的轮播 但我只能滚动浏览渲染的第一个轮播 我怎样才能控制所有加载的 一次只能查看一个轮播 其他轮播被隐藏 myCarousel carousel interval 10000 carousel item eac
  • 我可以在 Julia 中专门化类型定义吗?

    Julia 的参数类型实际上定义了一系列包含不同内存布局的类型 我想知道这是否也适用于复合类型中的字段名称和数量 一个简单的例子如下 type mytype Float64 a Float64 b Float64 end type myty
  • Bigquery 流:“由于超时而无法插入 XX 行”

    最近几天 我们的直播遇到了 Failed to insert XX rows First error errors reason timeout index YY 在过去半个月的连续流式数据源和程序脚本不变的情况下 之前没有发现过这样的故障
  • C++ 获得整数除法和余数的最佳方法

    我只是想知道 如果我想将 a 除以 b 并且对结果 c 和余数都感兴趣 例如 假设我有秒数并想将其分成分钟和秒 那么最好的方法是什么去做吧 可不可能是 int c int a b int d a b or int c int a b int
  • 在Python中快速绘制数据

    我正在尝试使用 arduino 绘制来自 mpu6050 imu 的数据 MPU6050 发送数据的速度比绘图快 Arduino 代码从串口提供 6 个数据 即偏航 俯仰 滚动 轴 ay 和 az 我需要快速情节的建议 Python代码 i
  • SQL LIMIT 按 id 列

    我有以下声明 SELECT s u fname u lname aif airport FROM services s INNER JOIN airports in flight aif ON s id aif service id INN
  • Ocaml 模块实现

    Ocaml的标准库包含各种模块 List Map Nativeint等等 我知道提供了这些模块的接口 例如 列表模块 http caml inria fr pub docs manual ocaml libref List html 但我对
  • Php 与 NetBeans:在没有实际声明的情况下应用新的 PhpDoc

    有没有一种方法可以应用新的 PhpDoc 而无需重新声明方法 例如我有一个类 class GeneralContainer private children public function construct this gt childre
  • Swift 不会播放链接中的音频 - iOS

    我正在使用 Subsonic 因此 mp3 文件是通过网络服务提供给我的 当我使用具有 mp3 扩展名的文件进行测试时 此代码有效 当我将它与下面的链接一起使用时 它不会 var player AVPlayer override func
  • 我们如何验证推送的提交消息?

    来自 CVS 的政策是 提交消息应标有错误编号 简单后缀 9999 CVS 脚本在提交期间对此进行检查 如果消息不符合则拒绝提交 git hook commit msg 在开发人员方面执行此操作 但我们发现自动系统检查并提醒我们这一点很有帮