[原创]升级Gerrit的commit-msg,检查git commit时必须填写开发任务编号TaskID

公司使用git+gerrit+jenkins进行持续集成实践,其中gerrit用来进行Code Review。另外我们自己研发了一套敏捷项目管理系统TPM(TeamPlus Management),用来管理开发任务和电子看板。此时有一个需求,希望开发人员提交的代码能够关联到TPM上的开发任务,这样就能实现需求与代码的关联,实现 需求->backlog->userstory->task->code->build->test->deploy->prod 的全流程数据关联。

目前的一个方式是在开发人员提交代码的同时,在comments中指定TaskID,其中TaskID是TPM系统中开发任务编号。但是很多时候开发人员提交代码是,忘记在comments log中指定TaskID,导致数据缺失,不能有效辅助研发过程改进。

为此,考虑参考Gerrit的commit-msg的方式,在commit代码同时,检查comments log中是否有指定合法的TaskID。(Gerrit的commit-msg,就是在commit代码的同事,给comments log增加一个Change-ID编号)

 

首先,修改commit-msg,增加TaskID的检查。

# Check for if missing a unique TaskID related with TPM

#

check_TaskID() {

 

COMMIT_FILE=$MSG

COMMIT_MSG=$(cat $MSG)

TASK_ID=$(echo "$COMMIT_MSG" | grep -Eo "#task[A-Za-z0-9]+")

if [ -z "$TASK_ID" ]; then

echo "[ERROR] Please add TPM TaskID comment logs with a format like 'comment logs #task20180623001'"

exit 1

else

echo "[INFO] StoryId=["$TASK_ID"]"

fi

}

 

# Check for, and add if missing, a unique Change-Id

#

add_ChangeId() {

...

...

...

 

check_TaskID

add_ChangeId

 

其次,是替换旧的commit-msg文件。

检索了一遍gerrit-site目录,没有发现commit-msg文件,怀疑是在gerrit.war中。解开gerrit.war,仍然没有发现commit-msg文件,怀疑实在某个依赖lib中。我们用的gerrit版本是2.12.8。翻了一下gerrit的源代码,commit-msg是在gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/hooks/commit-msg,推测是在gerrit-server的依赖lib中。解开gerrit-server-server.jar后,果然发现commit-msg。

之后有两种办法替换:

1、重新编译gerrit源码。觉得太麻烦,放弃。

2、依次解压gerrit.war和gerrit-server-server.jar,修改commit-msg,再用jar命令依次打包gerrit-server-server.jar和gerrit.war。

注意打gerrit.war的时候,需要指定Manifest,指定gerrit.war的Main-Class: Main,否则java -jar gerrit.war启动的时候找不到MainClass。

 

最后,升级修改后的gerrit。

网上找一找gerrit版本升级的网页有一堆。务必注意,升级之前一定要备份gerrit-site。

1、停止gerrit。 cd gerrit-site/bin; sh gerrit.sh stop

2、备份gerrit-site

3、启动新的gerrit。  java -jar new-gerrit.war init -d gerrit-site

之后基本上一路回车就行。这个过程会替换gerrit-site/bin/gerrit.war,并会重新配置一遍gerrit。

 

验证效果

1、启动gerrit。 cd gerrit-site/bin; sh gerrit.sh start

2、打开 http://gerrit地址/tools/hooks/commit-msg,查看是否是修改以后的文件。

3、git clone项目测试。

:~/code>git clone ssh://[项目地址] && scp -p -P 29418 [gerrit地址]:hooks/commit-msg AgileMng/.git/hooks/

Cloning into 'AgileMng'...

remote: Counting objects: 1952, done

remote: Finding sources: 100% (1952/1952)

remote: Total 1952 (delta 918), reused 1870 (delta 918)

Receiving objects: 100% (1952/1952), 1.17 MiB, done.

Resolving deltas: 100% (918/918), done.

commit-msg                                                                                                                               100% 4946     4.8KB/s   00:00   

 

:~/code/AgileMng>touch 1

:~/code/AgileMng>git add 1

:~/code/AgileMng>git status

# On branch master

# Changes to be committed:

#   (use "git reset HEAD <file>..." to unstage)

#

#       new file:   1

#

 

:~/code/AgileMng>git commit -m "add new file 1"

[ERROR] Please add TPM TaskID in comment logs with a format like 'comment logs #task20180623001'

 

:~/code/AgileMng>git commit -m "add new file 1 #task20180618 new file 1"

[INFO] TaskId=[#task20180618]

[master 48daaed] add new file 1 #task20180618 new file 1

 1 file changed, 0 insertions(+), 0 deletions(-)

 create mode 100644 1

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用中提到了git commit -s命令。git commit -s命令用于提交一个带有签名的commit。签名是指提交者的身份验证,可以用于确保提交者的身份和代码的完整性。签名可以通过GPG(GNU Privacy Guard)密钥来生成和验证。当使用git commit -s命令Git会使用签名来标识提交者,并将签名信息包含在commit日志中。 引用中的示例展示了一个使用git reset和git commit命令来创建正确的代码树,然后使用git commit -c ORIG_HEAD命令来提交带有签名的commit的过程。 此外,引用提到了git branch -a命令,用于查看本地分支和与之对应的远程分支。该命令可以列出所有的本地分支和远程分支,以及它们之间的关联关系。 引用提到了cherry pick命令,它用于从Gerrit上获取特定的补丁,并将其应用到当前的代码库中。如果没有冲突,cherry pick命令会自动提交新的commit。如果有冲突,需要手动解决冲突,并通过git commit命令手动提交。可以通过查看git log是否包含cherry pick的commit信息来验证cherry pick是否成功。 综上所述,git commit -s命令用于提交带有签名的commit,可以通过使用git reset和git commit命令来创建正确的代码树,然后使用git commit -c ORIG_HEAD命令来提交带有签名的commitgit branch -a命令用于查看本地分支和与之对应的远程分支。cherry pick命令用于获取特定的补丁,并将其应用到当前的代码库中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [GIT提交命令之git-commit](https://blog.csdn.net/ystyaoshengting/article/details/104067528)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [git commit 常用命令](https://blog.csdn.net/lemontreehaha/article/details/119005145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值