git hook 自动设置作者

问题背景

在日常版本控制操作中,时常会遇到因混淆不同场景下的身份信息而导致的邮件地址误用问题,例如,在提交企业内部项目时意外使用了个人邮箱地址,或是在向GitHub等公共平台提交代码时采用了公司专属邮箱。
为解决此类问题,期望实现一种自动化机制,使得Git在执行提交操作时能根据目标远程仓库的域名智能切换相应的邮箱配置,确保与项目及环境相匹配的身份标识得以正确运用。

实现方案

认识Git Hooks

Git Hook 是 Git 仓库中的一组脚本,它们允许你在特定的Git事件发生时执行自定义操作。这些脚本放置在 .git/hooks 目录下,并且每个脚本对应一个特定的Git生命周期事件。

以下是一些常见的 Git Hook 类型及其触发时机:

  1. pre-commit: 在提交信息被记录之前运行。这个钩子可以用来进行代码格式检查、linting、单元测试等,如果脚本执行失败(返回非零退出码),则会阻止这次提交。

  2. prepare-commit-msg: 在编辑提交消息文件之前运行,可以用于修改或预填充提交消息。

  3. commit-msg: 当提交消息被创建后运行,可用于验证提交消息是否符合项目规范。

  4. post-commit: 提交完成后立即运行,通常用于更新其他系统或者触发后续动作。

  5. pre-receive: 在服务器端接收到推送请求之后但在实际接受提交之前运行,可以用于实现对推送内容的全局性预检。

  6. update: 同样是服务器端的 hook,在 pre-receive 之后调用,对于每一个更新到仓库中的分支都会执行一次,常用于实现更细粒度的访问控制和策略。

  7. post-receive: 推送操作完成后在服务器上运行,可用来触发构建、部署或其他后处理任务。

  8. pre-auto-gc: 在自动垃圾回收开始前运行,可以用来定制垃圾回收的行为。

  9. post-checkout:在完成 git checkout 或 git switch 命令后触发。

每个 hook 脚本都是可执行文件(需要设置正确的执行权限),并且在执行时会传入相应的参数,以便获取关于所执行操作的详细信息。通过 Git Hook,开发者能够根据团队需求定制工作流程,确保遵循特定的开发规范和实践。

基于Hook机制,我们可以使用post-checkout在代码拉取时自动按照域名设置不同的提交用户名

配置

全局设置必须配置用户名邮箱

git config --global user.useConfigOnly true

并且删除全局的 user.name 和 user.email 配置,所有的全局配置都在 ~/.gitconfig 文件中,删除[user]下的用户名和邮箱配置。
然后使用git config查看一下是否删除成功。

git config --list
...
user.useconfigonly=true

设置 git hooks templates 目录

mkdir -p ~/.git-templates/hooks
git config --global init.templatedir ~/.git-templates

配置post-checkout脚本

~/.git-templates/hooks目录里新建post-checkout文件,内容如下:

#!/bin/bash

if [[ $1 == 00000000000* ]]; then
      remote=`git remote -v | awk '/\(push\)$/ {print $2}'`
      email=[email protected] # 默认邮箱
      name="xxx" # 默认提交用户名

      echo $remote

      if [[ $remote =~ '公司git域名' ]]; then
        email=[email protected] # 该域名使用的邮箱
        name="xxxx" # 该域名使用的用户名
      fi
      
      echo "Configuring user $name email: $email>"
      git config user.email "$email"
      git config user.name  "$name"
fi

配置完成后,测试一下

$ git clone ssh://[email protected]/xxxx.git
Cloning into 'xxxx'...
remote: Enumerating objects: 1284, done.
remote: Counting objects: 100% (1284/1284), done.
remote: Compressing objects: 100% (828/828), done.
remote: Total 265979 (delta 275), reused 423 (delta 18)
Receiving objects: 100% (265979/265979), 61.32 MiB | 2.00 MiB/s, done.
Resolving deltas: 100% (98214/98214), done.
ssh://[email protected]/xxxx.git
Configuring user <name: xxxx email: [email protected]>

至此就配置完毕了,以后在拉取代码或切换分支的时候,会自动根据域名判断使用的用户名,不会再出错了。

你可能感兴趣的:(程序人生,git)