仅当 运行ning git 工作树添加命令时如何 运行 git 挂钩

How to run a git hook only when running git worktree add command

我想在调用命令 git worktree add 时 运行 一个 shell 脚本。阅读 docs for post-checkout 似乎对 git worktree add 会 运行 但对于其他我不想使用它的命令也会 运行,例如 [=16] =].

还有其他我可以使用的挂钩吗?或者也许我可以使用 post checkout 但有脚本设置所以如果它不是 git worktree add 命令它退出?

我想这样做的原因是 运行 一组命令来设置我的目录,当我 运行 git worktree add 时需要,但我不需要为仅使用 git checkout 命令的普通 git 存储库执行此设置。

我想出了一个解决方案,虽然我不确定它有多难。我将 post-checkout 挂钩用作 bash 脚本,并且在顶部有以下几行。

if ! [[ "[=10=]" =~ ".bare/hooks/post-checkout" ]] \
    || ! [[ "" == "0000000000000000000000000000000000000000" ]]; then
    echo "WARNING: post-checkout hook running for reason otherwise than git worktree add, bailing";
    exit 0;
fi

# Do something down here every time we run `git worktree add`

这是如何工作的:$0 是脚本的路径,$1 是前一个头的引用。

按照惯例,我一直在将我的裸存储库克隆到一个名为 .bare 的目录中,这是第一个语句正在检查的目录。第二条语句检查 HEAD 的前一个 ref 是否为 0 字符串。如果您只是使用其他结帐命令(例如 git checkout),这会捕获并退出,因为在这种情况下,先前的 HEAD 不是 0 的字符串,因为它指向提交。但是,似乎是因为我每次 运行 git worktree add 都会创建一个新的 HEAD,它将之前的 HEAD ref 设置为该字符串的 0,这使我可以断言该条件。

这确实适用于我的用例,所以我不确定是否有更好的方法。如果有人有更好的建议,请告诉我。

P.S。我可以在我的 post-checkout 脚本中简单地使用 pwd 来获取新分支的目录,这对于我想在钩子中 运行 的命令很有用。