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=xxx@gmail.com # 默认邮箱
      name="xxx" # 默认提交用户名

      echo $remote

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

配置完成后,测试一下

$ git clone ssh://git@xxxx.com/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://git@xxxx.com/xxxx.git
Configuring user <name: xxxx email: xxxx@xxxx.com>

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

相关推荐

  1. git hook 自动设置作者

    2024-01-26 12:24:02       34 阅读
  2. Edge 浏览器设置自动刷新

    2024-01-26 12:24:02       32 阅读
  3. Edge浏览器设置自动刷新

    2024-01-26 12:24:02       41 阅读
  4. Linux 设置自动挂载磁盘

    2024-01-26 12:24:02       33 阅读
  5. Ubuntu 设置mysql 自动备份

    2024-01-26 12:24:02       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-26 12:24:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-26 12:24:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-26 12:24:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-26 12:24:02       20 阅读

热门阅读

  1. nginx如何运行在ipv6上

    2024-01-26 12:24:02       34 阅读
  2. ES数据处理方法

    2024-01-26 12:24:02       30 阅读
  3. Flink State backend状态后端

    2024-01-26 12:24:02       31 阅读
  4. HashMap的扩容过程

    2024-01-26 12:24:02       29 阅读
  5. 第28章复数矩阵到微分,乘法以及除法

    2024-01-26 12:24:02       38 阅读
  6. 极简pandas库Series

    2024-01-26 12:24:02       36 阅读
  7. 2401llvm,clang转换器

    2024-01-26 12:24:02       28 阅读
  8. 2401llvm,clang插件

    2024-01-26 12:24:02       37 阅读