裸仓库中创建新工作树时post-checkout钩子未触发的原因?
问题分析与解决方案
核心原因
你误解了钩子的触发位置:post-checkout 钩子是在非裸的工作树仓库中执行的,而非你操作的裸仓库。当你在裸仓库运行 git worktree add master 时,Git 会在指定路径创建一个新的非裸工作树仓库,这个新仓库才是触发 post-checkout 钩子的载体,你之前在裸仓库配置的 hooks/post-checkout 不会被执行。
解决方法
有两种可行方式实现你的需求:
方式一:手动为新工作树添加钩子
执行 git worktree add <path> master 后,进入新创建的工作树目录(即 <path> 对应的目录),在它的 .git/hooks 目录下创建可执行的 post-checkout 文件,写入你需要的逻辑即可。
方式二:通过模板目录自动注入钩子
Git 支持通过模板目录在创建新仓库(包括工作树仓库)时自动复制钩子文件,实现自动化配置:
- 在任意位置创建模板目录,比如
~/.git-template - 在该目录下创建并配置钩子文件:
echo 'echo foo' > ~/.git-template/hooks/post-checkout chmod +x ~/.git-template/hooks/post-checkout - 配置 Git 全局使用这个模板目录:
git config --global init.templateDir ~/.git-template - 之后再执行
git worktree add <path> master时,新工作树仓库会自动从模板目录复制post-checkout钩子,并在 checkout 完成后自动触发。
额外说明
裸仓库本身没有工作树,像 post-checkout、pre-commit 这类依赖工作目录的钩子,设计初衷就是针对有工作目录的仓库操作,因此在裸仓库中本来就不会被触发。
内容的提问来源于stack exchange,提问作者Sebastian Nemeth
相关产品推荐
相关产品推荐

