You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在git hook中执行git pull/fetch/checkout无法定位正确仓库目录如何解决

问题原因

Git 钩子运行时会自动设置GIT_DIR环境变量,默认值为触发钩子的服务端仓库的.git目录路径。这个环境变量的优先级高于Git对当前工作目录的自动检测逻辑,哪怕你通过cd命令切换到了另一个本地仓库目录,Git 依然会优先读取GIT_DIR指向的路径,不会自动识别当前目录下的.git文件夹,因此抛出找不到Git仓库的错误。
你在服务器终端直接运行脚本时没有该预设环境变量,Git会自动从当前目录向上查找.git文件夹,因此可以正常执行操作。

解决方法

两种方案任选其一即可:

方案1:执行目标仓库Git操作前取消GIT_DIR环境变量

在切换到目标仓库目录的语句后新增一行unset GIT_DIR即可清除预设的环境变量,后续Git命令会按正常逻辑识别当前目录的仓库,修改后的脚本参考如下:

#!/bin/sh

#get the branch name that was pushed
branch=$(git rev-parse --symbolic --abbrev-ref $1)

echo performing a build on branch:   $branch

cd /path/to/server/local/repodir
unset GIT_DIR
git checkout -f $branch
git pull origin $branch

make

echo "Build Done"

该方案改动手脚少,代码可读性高,优先推荐使用。

方案2:给Git命令显式指定仓库和工作目录路径

无需修改环境变量,直接给每个操作目标仓库的Git命令添加--git-dir和--work-tree参数明确指定路径即可:

git --git-dir=/path/to/server/local/repodir/.git --work-tree=/path/to/server/local/repodir checkout -f $branch
git --git-dir=/path/to/server/local/repodir/.git --work-tree=/path/to/server/local/repodir pull origin $branch

内容的提问来源于stack exchange,提问作者stillQuestioning

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:51:01