devops| git hooks 实战: 防分支 merge

简介: 基于工作中 git 工作流遇到的问题, 实战 git hooks, 防止测试分支合并到开发分支

先推荐一本书, Pro Git>. 接触并使用 git 的过程中, 会不断积累一个又一个 git 命令, 一个又一个 git 知识点, 而这本书, 可以让学习到的 git 知识 连接 起来.

曾经我以为会几条git命令就算是掌握git了,然后遇到一些问题时直呼『还有这种操作』,比如SVN切换到git,比如限制分支merge,比如看段代码谁闯的祸(git blame)。是的,这一切,都是你需要这本书的理由,当然如果你对 gfs 也感兴趣的话,那可以好好折腾了。

问题

项目切换到 git 后(再次重复一遍, 人生苦短, 快用 git), 效率大大提升, 需求和分支增长速度明显提高. 虽然切换到 git 之前进行过 技术讨论 协商了一套 git 工作流, 类似 git flow. 不过由于 节奏很快, 需求很多, 同时开发/测试的分支很多, 所以会有一个 rtest 分支, 作为集成测试使用.

问题在于 rtest 分支上可能有多个需求做集成测试, 所以这个分支不允许被合并到其他分支, 但是 git merge 合并反分支的情况时有发生.

git hooks

熟悉 github 可能听过 webhooks, 可以在 pull request / merge master 等几个场景下, 设置异步回调通知(http 请求). 这个背后就是 git hooks 在起作用.

git hooks 采用 事件机制, 在相应的操作(比如 git commit / git merge)下触发, 分为 2 种:

  • 服务端 hooks, github 的 webhooks 就是在此基础上建立起来的
  • 客户端 hooks, 每个 git 版本库的 .git/hooks/ 文件夹下就有可以使用的例子

注意: 客户端 hooks 并不会同步到版本库中

实战: 不允许分支合并

查看 git hooks 官方文档 可知, git merge 时会触发 commit-msg hook.

This hook is invoked by git commit and git merge, and can be bypassed with the --no-verify option. It takes a single parameter, the name of the file that holds the proposed commit log message. Exiting with a non-zero status causes the command to abort.

git 版本库在 .git/hooks/ 目录下都内置了几个常用 hooks 的示例, 比如 .git/hooks/commit-msg.sample:

#!/bin/sh
#
# An example hook script to check the commit log message.
# Called by "git commit" with one argument, the name of the file
# that has the commit message.  The hook should exit with non-zero
# status after issuing an appropriate message if it wants to stop the
# commit.  The hook is allowed to edit the commit message file.
#
# To enable this hook, rename this file to "commit-msg".

# Uncomment the below to add a Signed-off-by line to the message.
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
# hook is more suited to it.
#
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"

# This example catches duplicate Signed-off-by lines.

test "" = "$(grep '^Signed-off-by: ' "$1" |
         sort | uniq -c | sed -e '/^[   ]*1[    ]/d')" || {
        echo >&2 Duplicate Signed-off-by lines.
        exit 1
}

不允许合并 rtest 分支, 稍微修改一下 .git/hooks/commit-msg.sample 即可:

#!/c/bin/php/php
<?php

// var_dump($argv);
$str = file_get_contents($argv[1]);
// var_dump($str);
if (strpos($str, "Merge branch 'rtest'") !== false) {
    echo "can not merge rtest \n";
    exit(1);
}

// echo 'for test'; exit(2);

文件重命名为 commit-msg 即可生效, 执行效果如下:

git-hook-commit-msg

返回码不为 0 就会终止 git merge 命令的执行, 然后执行 git reset --hard head 即可撤销这次操作.

写在最后

除了使用 git hooks, 如果使用 gitlab, 也可以通过 gitlab 提供的 merge request, 减少发生此错误的情况.

目录
相关文章
|
2月前
|
开发工具 git
git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命令
这篇文章是关于Git常用命令的总结,包括初始化配置、基本提交、分支操作、合并、压缩历史、推送和拉取远程仓库等操作的详细说明。
141 1
git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命令
|
1月前
|
Prometheus 监控 Cloud Native
实战经验:成功的DevOps实施案例解析
实战经验:成功的DevOps实施案例解析
57 6
|
2月前
|
开发工具 git 开发者
关于git 解决分支冲突问题(具体操作,包含截图,教你一步一步解决冲突问题)
本文通过具体操作和截图,详细讲解了如何在Git中解决分支冲突问题,包括如何识别冲突、手动解决冲突代码、提交合并后的代码,以及推送到远程分支。
539 3
关于git 解决分支冲突问题(具体操作,包含截图,教你一步一步解决冲突问题)
|
4月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19376 30
|
3月前
|
缓存 开发工具 git
Git创建分支以及合并分支
在Git中,创建分支使用`git branch [branch_name]`,切换分支使用`git checkout [branch_name]`。修改文件后,通过`git add [file]`添加到暂存区,然后`git commit`提交到本地仓库。如果是新建分支的第一次推送,使用`git push origin [branch_name]`推送到远程仓库,之后可以简化为`git push`。合并分支时,使用`git merge [branch_name]`将指定分支的更改合并到当前分支。
91 2
Git创建分支以及合并分支
|
2月前
|
开发工具 git
Git分支使用总结
Git分支使用总结
41 1
|
3月前
|
测试技术 开发工具 git
掌握 Git 分支策略:提升你的版本控制技能
在现代软件开发中,版本控制至关重要,Git 作为最流行的分布式版本控制系统,其分支管理策略对于高效协作和代码维护尤为重要。本文介绍了几种常用的 Git 分支策略,包括主线开发模型、功能分支模型、Gitflow 工作流和 Forking 工作流,并探讨了如何根据项目需求选择合适的分支模型。通过保持 `master` 分支稳定、及时合并清理分支、使用命名规范、利用 Pull Request 进行代码审查及自动化测试等最佳实践,可以显著提升团队协作效率和软件质量。掌握这些策略将帮助开发者更好地管理代码库,加快开发流程。
|
3月前
|
存储 Linux 开发工具
Git基础命令,分支,标签的使用【快速入门Git】
本文详细介绍了Git版本控制系统的基础概念和常用命令,包括工作区、暂存区和版本库的区别,文件状态的变化,以及如何进行文件的添加、提交、查看状态、重命名、删除、查看提交历史、远程仓库操作和分支管理,还涉及了Git标签的创建和删除,旨在帮助读者快速入门Git。
Git基础命令,分支,标签的使用【快速入门Git】
|
2月前
|
Linux 开发工具 git
企业级Git管理工作流分析--GIT实战详解
企业级Git管理工作流分析--GIT实战详解
49 0
|
4月前
|
项目管理 开发工具 git