全局post-commit钩子中无法在指定目录执行Git命令问题
问题解答
1. 是否是我的操作导致了该异常结果?
是的,你的操作细节存在疏漏。最可能的原因是git -C后指定的路径不正确(比如使用了错误的相对路径),导致Git未能成功切换到A的仓库目录,最终在当前的B仓库上下文执行了命令。
2. 若操作无误,该现象的原因是什么?
这并非post-commit钩子的限制。Git的post-commit钩子确实会在提交操作的仓库目录下运行,但git -C参数本身支持切换到任意合法的Git仓库目录执行命令。如果出现显示B远程信息的情况,只有两种可能:
- 指定的A仓库路径不存在、拼写错误,或你没有访问权限;
- 路径指向的目录并非A的Git仓库根目录(比如不小心指向了B自身)。
当Git无法切换到指定的目标目录时,不会终止执行,而是默认使用当前工作目录(即B的仓库)继续运行命令,因此显示了B的远程信息。
3. 如何实现预期行为?
你可以通过以下方式确保命令正确切换到A的仓库:
使用绝对路径
直接指定A仓库根目录的绝对路径,这样无论钩子在哪个目录运行,都能准确定位到A:
#!/bin/sh git -C /完整绝对路径/to/A remote show origin
验证路径合法性(可选优化)
在脚本中添加路径验证逻辑,避免因路径错误导致意外行为:
#!/bin/sh A_REPO="/完整绝对路径/to/A" # 检查目标路径是否为Git仓库根目录 if [ -d "$A_REPO/.git" ]; then git -C "$A_REPO" remote show origin else echo "错误:未找到A的Git仓库目录,请检查路径是否正确" fi
若使用相对路径
如果必须使用相对路径,确保路径是从B的仓库目录出发,正确指向A的根目录。例如,若B是A目录下的submodules/B子目录,相对路径应为../..:
#!/bin/sh git -C ../.. remote show origin
内容的提问来源于stack exchange,提问作者HenryHe
相关产品推荐
相关产品推荐

