31

在我们公司,我们正在从 svn 迁移到 git。对于问题跟踪,我们使用 Atlassian 的 JIRA。

现在我们要强制每个提交消息都包含一个问题编号(就像我们对 svn 所做的那样)。

我们找到了 commit-msg 钩子,如果它不包含问题编号,我们会使用它来拒绝提交。

JIRA 使用 Fisheye 扫描 git repo。如果提交消息包含问题编号,则更改将显示在该问题下。

问题是克隆 git 存储库时不会复制挂钩。因此,提交消息中的问题编号不会被强制执行。这意味着当向上游推送新提交时,Jira 可能不会列出问题下的更改。

问题是; 我们是否以某种错误的方式使用 Git,有什么方法可以真正在提交消息中强制执行问题编号?或者有没有人简单地有一个脚本/钩子(除了 commit-msg 钩子)来完成这个?

4

6 回答 6

15

I used git-jira-hook and modified it to my needs, which should also work for you. For your needs, just remove the parts where it logs into Jira to check if the jira issue number regexed from the commit message is valid. If you don't like python (git-jira-hook is written in python) and prefer bash, you should be able to adapt the example scripts in each repo's .git/hooks dir to your needs.

As to implementing something that will work for everyone, you want to use git-jira-hook as the 'update' hook on your upstream repos. This will block pushes that contain commit messages that lack proper jira issue references. Since it is more convenient to get feedback about missing issue references at commit time (rather than at push time), you'll need to get your developers to install git-jira-hook as their commit-msg hook. I'll explain later how this can be done globally.

Here is how I have solved this issue:

  1. Private repo commit-msg hook: I modified git-jira-hook to check for jira issue references in the notation that we use. Then, I emailed out the hook with instructions to everyone explaining how to install the hook globally, as is explained in this SO question. If you install the hook globally then it will be used in all future clones, and can be easily applied to already cloned repos using git init.

  2. Upstream repo update hook: I used the already modified git-jira-hook script and installed it in each of our repos. I couldn't get the interactive authentication bits working on the upstream repo (symlinked it), so I instead created a restricted permissions Jira user and hard coded their authentication into the script.

于 2013-03-05T21:30:58.050 回答
8

如果您使用的是 npm,您可以使用https://github.com/typicode/husky​​https://github.com/marionebl/commitlint

创建文件:commitlint.config.js

module.exports = {
rules: {
    'references-empty': [2, 'never']
},
parserPreset: {
    parserOpts: {
        issuePrefixes: ['REF-']
    }
}};

并在 package.json 中为钩子添加配置

commit-msg: commitlint -E HUSKY_GIT_PARAMS
于 2018-12-09T23:59:33.340 回答
1

你也可以有服务器端的钩子,pre-receive-hook 之类的,但是如果你习惯了 github,这并不明显。

如果做不到这一点,我可能会考虑提供一个“安装挂钩”构建选项(作为 rake 任务、制作任务或其他),尽管这会让我觉得有点“肮脏”,因为现在我的构建与版本控制系统相关联...

于 2012-07-06T15:53:37.553 回答
0

如果您在 .git 文件夹中使用默认挂钩,那么您在其中所做的更改不会被编入索引,这仅仅意味着它们无法被检出或克隆。

您可以将您的提交消息挂钩移动到名为“挂钩”的不同文件夹中并提交它,以便它覆盖 .git 中的默认挂钩。

如果提交不包含问题编号,我们会显示一个消息框作为错误,以便用户在不需要问题跟踪编号时仍然可以继续(适用于补丁/修补程序)

于 2017-04-26T04:17:51.597 回答
0

有一个附加组件:JIRA 的提交策略插件

它不仅检查 JIRA 问题键是否“正式”包含在消息中,还检查相应的问题是否与 JQL 查询匹配。使用它,您有多种可能性,允许仅检查特定问题类型、特定状态的问题、当前 Scrum sprint 中的问题、针对下一个版本的问题等等。

在此处输入图像描述

作为奖励,它可以与您的原始版本 ( Subversion ) 和目标版本控制系统 ( Git ) 一起使用,即使在过渡期间也可以控制您的工作。

您可以将挂钩脚本安装到受祝福的 repo 和任何分叉中。不幸的是,使用 Git 克隆存储库时不会克隆钩子脚本,但我们目前正在研究解决此问题的方法。

完整文档: http: //www.midori-global.com/products/jira-commit-policy-plugin/documentation/

免责声明:这是 JIRA 的商业和受支持的附加组件,我是一名开发人员。

于 2015-08-12T09:43:34.953 回答
0

克隆存储库时不会复制 Git 挂钩。我们建议使用husky。这有助于将 git hooks 发布给克隆 repo 的每个人。

强制 git commit 包含 jira id 参考。我已经在 repo- husky-jira-demo中配置了它。希望这可以解决您的要求。

于 2019-11-04T11:02:23.547 回答