【问题标题】:git pull/fetch/checkout in git hook is unable to locate correct repository directorygit hook 中的 git pull/fetch/checkout 无法找到正确的存储库目录
【发布时间】:2021-09-10 16:51:51
【问题描述】:

我正在试验 git 钩子,并试图让我用来托管我的代码的 git 服务器在每次推送提交后执行构建。我已经从我托管的服务器存储库中克隆了一个本地(在服务器上)git 存储库。 server-repository 和服务器的 repo 本地实例都在同一台机器上,即服务器。我使用这个本地实例化来执行构建。

目前我正在使用 post-update 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
git checkout -f $branch
git pull origin $branch

make

echo "Build Done"

我能够运行 git 钩子,它实际上构建了一切正常。但是,git checkout 和 pull 命令失败,并给出以下异常:

fatal: not a git repository: '.'

我不确定为什么会这样,因为我之前 cd 进入了 git 目录的命令。在服务器上的终端中运行相同的脚本运行良好,git 会像往常一样执行操作。我通过在钩子中输入 pwdls -la 进行了检查,shell 位于正确的文件夹中,并且其中有一个 .git 存储库项,这意味着 git 应该有在此文件夹中执行没有问题。

git hooks 是否有什么特别的东西会阻止 git 签出和拉取刚从另一个设备推送的这些 repos?我不这么认为,但我不明白为什么 git 似乎找不到 git 存储库,并且似乎只在看 '。'

在 git hook 中进行 git checkout/pull 的正确方法是什么?

【问题讨论】:

标签: git githooks


【解决方案1】:

当您对钩子进行操作时,某些环境变量(例如GIT_DIR 和可能的GIT_WORK_TREE)会在存储库中设置,以便钩子正常工作。如果您在不同的存储库中工作,则需要取消设置这些变量,因为它们将不再反映正确的存储库。

因此,例如,您可以这样做:

#!/bin/sh

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

echo performing a build on branch:   $branch

(
    unset $(env | sed -ne 's/^\(GIT_.*\)=.*/\1/p')
    cd /path/to/server/local/repodir
    git checkout -f $branch
    git pull origin $branch

    make
)

echo "Build Done"

注意unset 命令和子shell。

【讨论】:

    猜你喜欢
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2021-09-23
    • 2018-02-15
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多