这一篇在干嘛?
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-push | push 前 | 跑测试 |
一个最简 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+ 自动部署是自建工作流的经典搭配。
学完你会得到:
- 一份可以立刻抄的全局配置清单
- 行尾问题的根治方案
- 「软约束客户端、硬约束服务端」的钩子架构观
自测
自测
.gitattributes和全局git config最本质的区别是什么?- 为什么说客户端钩子「不能作为安全机制」?
- 要在团队强制「提交信息必须以工单号开头」,钩子装在哪、用哪个?
post-receive钩子最典型的应用是什么?- Windows 和 Linux 协作,行尾问题推荐怎么配?