这一篇在干嘛?

Git 的默认行为能改。这一篇讲三层定制手段:全局配置、仓库属性(.gitattributes)、钩子(hooks),末尾顺带看一眼「从 SVN 等旧系统迁移」的入口。对应《Pro Git》第 8 章与第 9 章。

配置再进阶:让 Git 顺手起来

第 1 篇配过 user.name/email,这里补几个高价值配置:

# 默认分支名用 main(init 时不再生成 master)
git config --global init.defaultBranch main
 
# 常用别名(配置文件 ~/.gitconfig 里是 [alias] 段)
git config --global alias.last "log -1 HEAD"
git config --global alias.unstage "restore --staged"
 
# 合并/差异工具换掉默认的
git config --global merge.tool vimdiff
 
# 格式化与空白:提交时把行尾空格自动去掉
git config --global core.autocrlf input

仓库级配置覆盖全局

项目有特殊要求(比如必须用某编辑器)就在仓库里 git config(不带 —global),只影响本仓库。团队约定则写进项目文档,让大家各自配。

.gitattributes:仓库自带的「说明书」

.gitignore 管「谁不进来」,.gitattributes 管「进来的文件怎么对待」。放在仓库根目录,随仓库分发给所有协作者——这是它和全局配置最大的区别:配置是各人自己的,属性是项目强制的。

行尾战争终结者

Windows CRLF、Linux/macOS LF,混编项目的老大难:

# 仓库里统一按 LF 存储,各平台 checkout 时按需转换
* text=auto
*.bat text eol=crlf     # Windows 批处理必须是 CRLF
*.sh text eol=lf        # 脚本必须 LF

二进制文件特殊处理

*.png binary                     # 明确声明二进制,禁止 diff/转换
*.docx diff=word                 # 用专用过滤器比较 Word 文档

钩子:在关键动作前后插一脚

.git/hooks/ 目录下一堆 .sample 模板,去掉后缀启用。钩子就是 Git 在特定时点自动执行的脚本,分两类:

客户端钩子(本机生效)

钩子触发时机典型用途
pre-commit提交前跑 lint/检查空白,不过就拒绝提交
commit-msg写完提交信息后校验提交信息格式
pre-pushpush 前跑测试

一个最简 pre-commit 示例(拒绝提交带尾随空格的改动):

#!/bin/sh
if git diff --cached --check; then
    exit 0
fi
echo "发现尾随空格或冲突标记,请修正后再提交"
exit 1

记得 chmod +x .git/hooks/pre-commit

客户端钩子不是安全机制

它只在本机生效,git commit --no-verify 或干脆删掉钩子就能绕过。强约束必须放服务端

服务端钩子(团队强约束)

服务器裸仓库的 hooks/ 里:

  • pre-receive:收推送前校验——比如「禁止直接推 main」「提交信息必须带工单号」,不满足就整个拒绝;
  • update:按分支逐条校验;
  • post-receive:推送后动作——最经典的是自动部署:收到推送后自动 checkout 并重启服务,一条 git push 上线。

第 8 章还演示了用服务端钩子实现「强制提交信息带工单号 + 快进推送」的完整策略脚本,思路就是:校验失败 exit 1,成功 exit 0

从其他系统迁移(速览)

  • SVN 客户端git svn 让 Git 直接当 SVN 的客户端用,边用边过渡。
  • 整体迁移:GitHub/SVN 的导入工具、git filter-repo(清理历史中的大文件/敏感信息)能把 SVN/Mercurial 项目完整转成 Git 仓库并保留历史。

日常开发中你大概率只会用「一次性迁移」,用到时查官方文档即可,不必背。

小结

  • 配置三层级:system → global → 仓库(就近覆盖)。
  • .gitattributes 是随仓库分发的强制约定:行尾、二进制声明。
  • 客户端钩子(pre-commit 等)提效但不设防;服务端钩子(pre-receive 等)才是团队强约束。
  • post-receive + 自动部署是自建工作流的经典搭配。

学完你会得到:

  • 一份可以立刻抄的全局配置清单
  • 行尾问题的根治方案
  • 「软约束客户端、硬约束服务端」的钩子架构观

自测

下一篇:🔬 Git 内部原理:对象、引用与包文件