混帐 这是一个很棒的工具。 它不仅允许您通过挂钩跟踪文件中的更改,还可以与其他人无缝协作。 在这方面,Git 是推动 FOSS 发展的工具之一。 然而,Git 的最大问题之一是管理存储库需要时间和精力。 例如,执行和同步这些存储库可能需要两到三个 git 命令。 这使得管理它们不仅乏味而且容易出现用户错误。 在这里,我们向您展示一些简单但功能强大的 Git 挂钩,以更好地管理您的存储库。
什么是 Git 钩子?
git-hook 的核心是一个灵活的子命令,您可以使用它来创建在 Git 对存储库执行操作时运行的自定义脚本。 例如,可以在提交之前使用 hook 自动检查存储库中的样式错误。
hook 子命令通过读取存储库“.git”目录下的“hooks”文件夹来工作。 此文件夹包含许多预制文件,这些文件为您可以自动运行的每个 Git 操作提供示例脚本。
大多数情况下,您可以使用任何您喜欢的脚本语言编写 git hook。 这使得它对任何软件开发人员来说都非常灵活和平易近人。
1.防止push to master
用户在 Git 中最常犯的错误之一是将开发分支的提交直接推送到主分支。 如果您使用 Github 来跟踪和维护您的项目,这可能会非常令人沮丧。
您可以通过创建一个预推送来防止此问题,它会在您尝试从 master 分支推送存储库时进行检查和确认。
- 去 Git 仓库 你想要保护的。
- 创建 Git 钩子文件 使用您的脚本校对器。 因为这个钩子必须在之前运行 “支付” , 然后你需要创建一个钩子 “预付费”:
触摸 .git/hooks/pre-push
- 打开 挂钩文件 新的 文本编辑器.
纳米.git/钩子/预推
- 在里面,写 勾选“付款前”。 例如,下面是一个脚本,当你从 master 分支推送时,它会要求你确认:
#!/bin/sh protect='master' current=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,') if [ $protect = $current ]然后阅读-p“确认推送到主服务器?是/否。” -n 1 -r < /dev/tty echo if echo $REPLY | grep -E '^[Yy]$' > /dev/null then exit 0 fi exit 1 else exit 0 fi
- 保存 新钩子. 在一个 纳米 按 Ctrl + O ث 按Ctrl + X.
- 运行以下命令以确保 Git 可以运行新的挂钩。
chmod +x .git/hooks/预推
2.拒绝推送到主分支
除了防止自己被推送到 master 之外,您还可以在服务器端创建一个钩子,拒绝任何对其 master 分支的推送。 如果您与多个开发人员共享一个存储库,这将非常有用。
通过创建一个“预接收”挂钩来解决此问题,该挂钩将自动防止任何受限用户被推送到主分支。
- 创建 用于“预获取”的 Git 钩子文件 在您的远程仓库中。
触摸 .git/hooks/pre-receive
- 打开这个 文件。
nano .git/hooks/预接收
- 添加拒绝文本 勾上“预收据”. 例如,以下代码行应该开箱即用:
#!/bin/sh 分支=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,') blacklist=(alice bob) if [[ ${blacklist[ *]} =~ $USER ]]; 那么如果 [ "$branch" == "master" ]; 然后回显“你不允许在这个分支中提交更改” exit 1 fi fi
- 保存新的挂钩文件。 就我而言,我需要按 Ctrl+O,然后按 Ctrl+X 来保存文件。
- 保存 勾文字 并使其具有可操作性。
chmod +x .git/hooks/预接收
提示:您还可以使用 Git 别名来提高 Git 的使用效率。
3. 锁定存储库以防止变基
用户在 Git 中犯的另一个常见错误是重置当前活动的分支。 如果您正在处理一个有许多贡献者的存储库,这可能是一个令人沮丧的问题,因为重构会删除其他用户所做的提交。
您可以通过创建一个“预重新建立”挂钩来防止此问题,该挂钩将检查当前分支是否已关闭。
- 创建 “预变基”文件 在目录中 “.git/钩子”:
触摸 .git/hooks/pre-rebase
- 打开这个 编辑文件.
纳米 .git/hooks/pre-rebase
- 添加脚本 变基 进入 新的钩子文件.
#!/bin/sh branch="$2" [ -n "$branch" ] || branch=$(git rev-parse --abbrev-ref HEAD) lock="branch.${branch}.rebaselock" if [ "$(git config --bool "$lock")" = true ]; 然后 echo “pre-rebase hook: \"$lock\" 设置为 true。拒绝 rebase。" 出口 1
- 保存 挂钩文件 new 并使其可执行。
chmod +x .git/hooks/pre-rebase
4. 强制对代码进行样式和语法检查
Hook Git 最有用的用途之一是将其挂接到 linter 代码。 这是一个简单的程序,用于检查您的代码是否遵循项目的样式和格式。
- 关联 短绒 到您的 Git 存储库,首先创建一个挂钩文件 “事先承诺”。
触摸 .git/hooks/pre-commit
- 安装 短绒 适合您项目的语言。 在这种情况下,我使用 “外壳检查” 解析我的 Bash 代码:
sudo apt 安装 shellcheck
- 打开 挂钩文件 新建并添加以下脚本。
#!/bin/bash for file in $(git diff --cached --name-only --diff-filter=AM | grep -E '\.sh$') do shellcheck "$file" # 运行 linter for每个新文件。 如果 [ $? -ne 0 ]; then exit 1 # 如果 linter 失败则终止提交。 我完成了
- 保存 挂钩文件 new 并使其可执行:
chmod +x .git/hooks/预提交
5.自动通知用户存储库更改
最后,您还可以创建一个 Git 挂钩,只要您的存储库收到新提交,它就会自动发送电子邮件。 如果您想为您的存储库创建一个简单的通知系统,这将很有用。
- 创建 钩子文件“post-receiver” 在目录中 .git/钩子 在您的仓库中:
触摸 .git/hooks/post-receive
- 打开 Git 钩子文件 新建并输入以下脚本:
- 保存 挂钩文件 new 并使其可执行。
chmod +x .git/hooks/post-receive
经常问的问题
Q1. 我可以用 C 语言等编译型语言编写 Git hooks 吗?
回答。 Git Hooks 的最大限制之一是它要求您使用一种可以直接从终端运行的语言。 这意味着 Git hooks 的脚本不支持任何本地化语言。 例如,您可以使用 Python 或 Shell 而不是 C 或 C++ 创建新的 Git 挂钩。
Q2. 是否可以在同一个 Git 存储库中运行多个钩子?
回答。 是的。 虽然上面的示例将钩子显示为单独的单独功能,但您可以轻松地将它们混合在一起以创建您自己独特的工作流程,这使得 Git 钩子非常灵活并且可以适应任何编码情况。 例如,您可以在存储库中同时使用“Prevent Push to Master”挂钩和“Syntax Check”预提交挂钩。
Q3. 为什么Git hooks 不给用户发邮件?
回答。 此问题很可能是由于您的远程服务器无法正确发送任何外发电子邮件引起的。 要解决此问题,请确保您的远程服务器是安全的,并且具有与 SMTP 域协同工作的邮件递送代理。