Git 默认功能已经很强,但每个人的工作习惯不一样!就像给手机装插件、电脑换主题,Git 也能“个性化定制”~
本章会教你玩转 Git 配置、属性、钩子,让 Git 完全适配你的工作流:比如自动格式化提交信息、处理跨平台换行问题、限制文件修改权限等。新手也能轻松上手,配置一次,受益终身!
客户端配置
服务器配置
颜色配置
1. 配置层级 – 不同范围的设置 📌
Git 的配置分三个层级,优先级从高到低:本地仓库 > 全局用户 > 系统全局,高层级会覆盖低层级的设置。
git config –system 配置项 值
# 配置文件路径:/etc/gitconfig(Linux/Mac)、C:\Program Files\Git\etc\gitconfig(Windows)# 2. 全局级配置(当前用户所有仓库生效)
git config –global 配置项 值
# 配置文件路径:~/.gitconfig(Linux/Mac)、C:\Users\ 用户名 \.gitconfig(Windows)
# 3. 本地仓库配置(仅当前仓库生效)
git config 配置项 值
# 配置文件路径:当前仓库 /.git/config
# 查看所有配置(包含三个层级)
git config –list
# 查看某个具体配置
git config user.name
2. 常用客户端配置 – 提升日常使用体验 🚀
这些配置能解决日常使用中的小痛点,建议全局设置:
git config –global core.editor “code –wait” # VS Code
git config –global core.editor “subl -w” # Sublime Text
git config –global core.editor “emacs” # Emacs# 2. 设置提交信息模板(强制提交信息格式规范)
# 先创建模板文件 ~/.gitmessage.txt,内容示例:
# [类型] 简短描述(50 字内)
#
# 详细说明:
# 1. 功能亮点
# 2. 改动范围
# [关联工单:XXX]
git config –global commit.template ~/.gitmessage.txt
# 3. 关闭分页输出(git log、git diff 不再分页,直接显示全部)
git config –global core.pager “”
# 4. 设置 GPG 签名密钥(提交和标签自动签名,增强安全性)
git config –global user.signingkey 你的 GPG 密钥 ID
# 5. 全局忽略文件(所有仓库都忽略这些文件,比如编辑器缓存)
# 先创建 ~/.gitignore_global 文件,添加忽略规则:
# *.swp(Vim 缓存)
# *.sublime-*(Sublime 缓存)
# .DS_Store(Mac 系统文件)
git config –global core.excludesfile ~/.gitignore_global
# 6. 命令自动纠错(输错命令时自动提示并执行正确命令)
git config –global help.autocorrect 1 # 1=0.1 秒后自动执行
3. 颜色配置 – 让输出更易读 🎨
Git 默认会给日志、差异等输出上色,也可以自定义颜色:
git config –global color.ui true# 自定义 diff 输出颜色(比如元信息蓝色粗体)
git config –global color.diff.meta “blue bold”
# 自定义分支列表颜色
git config –global color.branch.current “green bold” # 当前分支绿色粗体
git config –global color.branch.remote “red” # 远程分支红色
颜色值支持:black、red、green、yellow、blue、magenta、cyan、white;属性支持:bold(粗体)、ul(下划线)、reverse(反色)。
4. 服务器配置 – 增强仓库安全性 🛡️
如果是自己搭建的 Git 服务器,可以通过配置限制推送行为:
git config –system receive.fsckObjects true# 2. 禁止非快进推送(防止强制覆盖已推送的提交)
git config –system receive.denyNonFastForwards true
# 3. 禁止删除分支和标签
git config –system receive.denyDeletes true
二进制文件处理
关键字替换
合并策略
导出忽略
1. 什么是 Git 属性?
Git 属性通过 .gitattributes 文件设置(放在仓库根目录,需提交到仓库),可以给特定文件或目录指定规则,比如“如何处理二进制文件”“合并时用什么策略”等。
如果不想把属性文件提交到仓库,可以写在 .git/info/attributes 文件中(仅本地生效)。
2. 二进制文件处理 – 让 Git 正确识别 📦
有些文件看似文本(比如 Xcode 的 .pbxproj),但实际是二进制格式,Git 默认可能误判,导致合并冲突或无用的 diff 输出:
# 标记 .pbxproj 文件为二进制,不尝试 diff 和合并
*.pbxproj binary# 让 Word 文档支持 diff(需要安装 docx2txt 工具)
*.docx diff=word
# 配置 diff 工具(全局设置)
git config diff.word.textconv docx2txt
# 让图片文件 diff 时显示 EXIF 信息(需要安装 exiftool)
*.png diff=exif
git config diff.exif.textconv exiftool
3. 关键字替换 – 自动注入信息 🔍
类似 SVN 的关键字替换,Git 可以在文件检出时注入提交信息(比如版本号、日期),提交时自动移除:
# .gitattributes 中添加:
*.txt ident
# 在文件中添加 $Id$,检出时会替换为 $Id: 文件 SHA-1 $# 2. 自定义替换(比如注入最后提交日期)
# 第一步:创建替换脚本 expand_date(放在 PATH 目录)
# #!/usr/bin/env ruby
# data = STDIN.read
# last_date = `git log –pretty=format:”%ad” -1`
# puts data.gsub(‘$Date$’, ‘$Date: ‘ + last_date.to_s + ‘$’)
# chmod +x expand_date
# 第二步:配置 Git 过滤器
git config –global filter.dater.smudge expand_date
git config –global filter.dater.clean ‘perl -pe “s/\\\$Date[^\\\$]*\\\$/\\\$Date\\\$/”‘
# 第三步:.gitattributes 中指定文件
date*.txt filter=dater
# 在 date_test.txt 中添加 $Date$,检出时会自动替换为最后提交日期
4. 合并策略 – 解决特定文件冲突 🤝
有些文件(比如配置文件)在不同分支可能有不同内容,合并时不想冲突,直接保留当前分支的版本:
database.xml merge=ours # 合并时保留当前分支的 database.xml# 配置“ours”合并策略(全局设置)
git config –global merge.ours.driver true
效果:合并其他分支时,database.xml 不会出现冲突,直接使用当前分支的版本,适合环境相关的配置文件。
5. 导出忽略 – 打包时排除文件 📤
用 git archive 打包仓库时,有些文件(比如测试用例、构建产物)不想包含,可以通过属性排除:
test/ export-ignore # 排除 test 目录
*.log export-ignore # 排除所有 .log 文件
.gitignore export-ignore # 排除 .gitignore 文件
执行 git archive HEAD –format=zip -o 项目名.zip 时,这些文件会自动排除,适合生成部署包。
服务器端钩子
提交相关钩子
推送相关钩子
1. 钩子基础 – 怎么启用钩子?
Git 钩子是事件触发的脚本(支持 Shell、Ruby、Python 等),仓库初始化后会在 .git/hooks 目录生成示例脚本(后缀 .sample),启用方法:
cd .git/hooks
cp pre-commit.sample pre-commit# 2. 编辑脚本,添加自定义逻辑
vim pre-commit
# 3. 给脚本添加执行权限
chmod +x pre-commit
2. 客户端钩子 – 本地操作触发 🔧
客户端钩子在本地执行(比如提交、合并、检出),常用钩子如下:
(1)pre-commit – 提交前触发
用于检查提交前的代码(比如语法检查、空格检查),脚本退出非 0 会终止提交:
# 检查代码中是否有 console.log(前端项目示例)
if git diff –cached –name-only — ‘*.js’ | xargs grep -q ‘console.log’; then
echo “❌ 错误:提交中包含 console.log,请删除后再提交!”
exit 1
fi# 检查是否有 trailing whitespace(行尾空格)
if git diff –cached –check; then
echo “✅ 代码格式检查通过!”
exit 0
else
echo “❌ 错误:存在行尾空格等格式问题,请修复!”
exit 1
fi
(2)commit-msg – 提交信息检查
强制提交信息符合规范(比如必须包含工单编号),脚本退出非 0 会终止提交:
# 获取提交信息文件路径
msg_file=$1
# 读取提交信息
msg=$(cat “$msg_file”)
# 正则匹配:必须包含 [ref: 数字] 格式
if ! echo “$msg” | grep -qE ‘\[ref: [0-9]+\]’; then
echo “❌ 错误:提交信息格式不正确!”
echo “✅ 正确格式示例:修复登录 bug [ref: 123]”
exit 1
fi
exit 0
(3)post-checkout – 检出后触发
检出分支后自动执行操作(比如安装依赖、生成文档):
# 检出后自动安装 npm 依赖(前端项目)
if [-f “package.json”]; then
echo “📦 正在安装依赖 …”
npm install
fi# 生成 API 文档
if [-f “README.md”]; then
echo “📄 正在生成文档 …”
npm run docs
fi
3. 服务器端钩子 – 推送操作触发 🚀
服务器端钩子在 Git 服务器上执行(仅针对裸仓库),常用钩子如下:
(1)pre-receive – 接收推送前触发
对所有推送的引用(分支、标签)进行检查,脚本退出非 0 会拒绝整个推送:
# 检查所有推送的提交信息是否符合规范
while read oldrev newrev refname; do
# 获取该分支新增的提交
commits=$(git rev-list $oldrev..$newrev)
for commit in $commits; do
# 读取提交信息
msg=$(git cat-file commit $commit | sed ‘1,/^$/d’)
# 检查格式
if ! echo “$msg” | grep -qE ‘\[ref: [0-9]+\]’; then
echo “❌ 错误:提交 $commit 的信息格式不正确!”
echo “✅ 正确格式示例:修复登录 bug [ref: 123]”
exit 1
fi
done
done
exit 0
(2)post-receive – 接收推送后触发
推送成功后执行操作(比如触发 CI/CD、发送通知):
# 推送成功后触发 Jenkins 构建
curl -X POST http://jenkins 服务器地址 /job/ 项目名 /build?token= 触发令牌# 发送邮件通知(假设存在 send-email.sh 脚本)
./send-email.sh “ 项目有新推送 ” “ 分支:$refname,提交范围:$oldrev..$newrev”
(3)update – 每个引用推送时触发
和 pre-receive 类似,但对每个推送的分支 / 标签单独触发,拒绝单个引用不会影响其他引用:
refname=$1 # 引用名(比如 refs/heads/master)
oldrev=$2 # 推送前的版本
newrev=$3 # 推送后的版本# 禁止强制推送 master 分支
if [“$refname” = “refs/heads/master”] && ! git merge-base –is-ancestor $oldrev $newrev; then
echo “❌ 错误:禁止强制推送 master 分支!”
exit 1
fi
exit 0
大型团队需要统一规范,结合配置、属性、钩子可以实现强约束,以下是常见场景:
场景 1:强制提交信息格式 + 分支权限控制
需求:所有提交必须包含工单编号,普通开发者只能修改指定目录,管理员无限制。
#!/usr/bin/env ruby
refname = ARGV[0]
oldrev = ARGV[1]
newrev = ARGV[2]
user = ENV[‘USER’] # 假设通过 SSH 环境变量获取用户名# 检查提交信息格式
regex = /\[ref: (\d+)\]/
`git rev-list #{oldrev}..#{newrev}`.split(“\n”).each do |rev|
msg = `git cat-file commit #{rev} | sed ‘1,/^$/d’`
unless regex.match(msg)
puts “[POLICY] 提交 #{rev} 信息格式错误,需包含 [ref: 工单编号]”
exit 1
end
end
# 检查目录权限(ACL 文件放在仓库根目录的 acl 文件中)
acl = {
‘admin’ => [”], # 管理员无限制
‘dev1’ => [‘lib’, ‘tests’], # 只能修改 lib 和 tests 目录
‘doc’ => [‘doc’] # 只能修改 doc 目录
}
`git rev-list #{oldrev}..#{newrev}`.split(“\n”).each do |rev|
`git log -1 –name-only –pretty=format:” #{rev}`.split(“\n”).each do |path|
next if path.empty?
has_access = acl[user]&.any? {|p| p.empty? || path.start_with?(p) }
unless has_access
puts “[POLICY] 用户 #{user} 无权限修改 #{path}”
exit 1
end
end
end
exit 0
场景 2:跨平台换行问题处理
Windows 用 CRLF 换行,Linux/Mac 用 LF 换行,导致提交时出现大量“空白修改”,通过配置和属性解决:
git config –global core.autocrlf true # 提交时 CRLF 转 LF,检出时 LF 转 CRLF# 2. 全局配置(Linux/Mac 用户)
git config –global core.autocrlf input # 提交时 CRLF 转 LF,检出时不转换
# 3. .gitattributes 中强制所有文件用 LF(推荐,统一仓库换行格式)
* text=auto eol=lf # 文本文件自动识别,强制 LF 换行
*.bat text eol=crlf # bat 文件特殊处理,保留 CRLF
*.png binary # 二进制文件不转换
场景 3:自动格式化代码 before commit
团队统一代码风格(比如 ESLint、Prettier),提交前自动格式化,避免格式冲突:
#!/bin/sh
# 安装依赖(如果未安装)
if ! command -v prettier &> /dev/null; then
echo “📦 正在安装 prettier…”
npm install -g prettier
fi# 格式化所有 staged 的 js、vue、css 文件
git diff –cached –name-only — ‘*.js’ ‘*.vue’ ‘*.css’ | xargs prettier –write
# 重新暂存格式化后的文件
git diff –cached –name-only — ‘*.js’ ‘*.vue’ ‘*.css’ | xargs git add
echo “✅ 代码格式化完成!”
exit 0
- 配置层级:本地 > 全局 > 系统,按需设置不同范围的参数
- 常用配置:编辑器、提交模板、颜色、全局忽略,提升日常效率
- Git 属性:通过 .gitattributes 控制文件的 diff、合并、导出规则
- Git 钩子:客户端钩子规范本地操作,服务器端钩子强制团队政策
- 实战场景:结合三者可以解决跨平台、代码规范、权限控制等问题
要不要我帮你整理一份 Git 个性化配置大全 ?包含常用配置命令、.gitattributes 模板、实用钩子脚本,直接复制就能用,让你快速打造专属 Git 工作流~