在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
相关产品推荐
相关产品推荐

