git hook 与 submodule
约 679 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › Git › 工具与技巧(在新窗口打开) › git hook 与 submodule
git hook
Git 钩子是在特定事件发生时自动执行的脚本,位于 .git/hooks/ 目录。
ls .git/hooks/
# applypatch-msg.sample pre-applypatch.sample pre-commit.sample
# commit-msg.sample pre-commit.sample pre-push.sample
# ...钩子文件默认以 .sample 结尾,去掉后缀即可启用。
常用客户端钩子
# pre-commit:提交前运行(代码检查、格式化)
.git/hooks/pre-commit
# commit-msg:检查提交信息格式
.git/hooks/commit-msg
# pre-push:推送前运行(运行测试)
.git/hooks/pre-pushpre-commit 示例
#!/bin/sh
# .git/hooks/pre-commit
# 检查是否有未解决的冲突标记
if grep -rn "^<<<<<<< \|^=======$\|^>>>>>>>" --include="*.py" --include="*.js" .; then
echo "Error: Found unresolved merge conflict markers"
exit 1
fichmod +x .git/hooks/pre-commitHusky(Node.js 项目)
# 使用 Husky 管理 Git Hooks(自动安装到 .git/hooks)
npx husky-init
npm install
# 添加 pre-commit hook
npx husky add .husky/pre-commit "npm run lint-staged"
# 添加 commit-msg hook
npx husky add .husky/commit-msg "npx --no -- commitlint --edit $1"git submodule
将一个 Git 仓库作为另一个仓库的子目录进行管理。
# 添加子模块
git submodule add https://github.com/user/lib.git lib/
git submodule add git@github.com:user/lib.git lib/
# 提交时记录子模块的当前 hash
git add lib/
git commit -m "add lib submodule"克隆包含子模块的仓库
# 方式一:递归克隆
git clone --recursive https://github.com/user/main-repo.git
# 方式二:先克隆,再初始化子模块
git clone https://github.com/user/main-repo.git
cd main-repo
git submodule init
git submodule update子模块操作
# 更新子模块到最新提交
git submodule update --remote
# 更新特定子模块
git submodule update --remote lib/
# 查看子模块状态
git submodule status
# 遍历执行命令
git submodule foreach git pull origin main子模块注意事项
- 主仓库记录子模块的具体 commit hash(不是分支名)。
- 子模块默认处于分离 HEAD 状态(detached HEAD)。
- 在子模块内修改后需先提交子模块,再提交主仓库。
.gitattributes
控制 Git 如何处理特定文件:
# .gitattributes
# 统一换行符
* text=auto
# 二进制文件不进行 diff
*.png binary
*.jpg binary
# 指定文件的 diff 方式
*.ipynb diff=jupyter
# 合并策略
CHANGELOG.md merge=union小结
- Git Hook 在
commit/push等事件触发时自动执行脚本,适合代码检查自动化。 - Husky 简化 Node.js 项目的 Hook 管理,配合 lint-staged 和 commitlint。
- 子模块将一个仓库嵌入另一个仓库,主仓库记录子模块的具体提交 hash。
- 克隆含子模块的仓库用
git clone --recursive。 .gitattributes控制换行符、二进制文件和 diff 行为。
