git hook在Linux和Windows之间不一致

时间:2019-03-29 23:18:33

标签: git raspberry-pi hook git-post-receive

设置本地GIT服务器后,我尝试设置一个接收后挂钩,以便在每次推送后部署我的代码。在我的Windows 10计算机上像微风一样工作,但是在我的linux服务器上却没有。为了进一步解决此问题,我安装了一个raspberry pi来检查它是否与linux有关,并且遇到了相同的行为;

#!/bin/bash
TARGET="C:/GIT/repoPROJECT/Test"
GIT_DIR="C:/GIT/repoGIT/Test"
BRANCH="master"

while read oldrev newrev ref
do
    # only checking out the master (or whatever branch you would like to deploy)
    if [ "$ref" = "refs/heads/$BRANCH" ];
    then
        echo "Ref $ref received. Deploying ${BRANCH} branch to production..."
        git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH
    else
        echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server."
    fi
done

(repoGIT / Test是一个裸露的git repo,另一个是一个克隆。我将其推到裸露的位置并将钩子放在那里)

具有相同的配置和授权,这在我的linux(树莓)上不起作用,但是在我的Windows计算机上可以完美地工作。我检查了我的钩子是否被触发(创建了一个文件夹)。

最后,这个成功了:

#!/bin/bash
unset $(git rev-parse --local-env-vars)

TARGET="/home/pi/GIT/repoPROJECT/Test"
GIT_DIR="/home/pi/GIT/repoGIT/Test"
BRANCH="origin"

cd $TARGET
git pull

但是我不确定为什么必须使用其他脚本,为什么当我以完全相同的方式设置项目时(尝试使用顶部脚本时)必须从主脚本切换到原始脚本。

我认为它与操作系统有关,但我想了解一下,以便将来可以处理此类问题。

(我记不清我遇到的所有错误,但有时它不是git存储库,而有时脚本会陷入循环。 请注意,我尝试在顶级脚本上取消设置var,但仍然无法正常工作

1 个答案:

答案 0 :(得分:1)

我不完全了解我在这种情况下的结局,但是我发现了什么:

首先;我正在使用GIT进行实验,关于应该如何使用它可能不知道,这是我遇到几个问题并且不确定是什么原因引起的主要原因。

我试图设置本地GIT服务器,以便可以在计算机上工作,将代码推送到Linux服务器上,然后相应地更新已部署的项目。

我首先尝试的是创建一个裸仓库,将代码从IDE推送到那里,并为该仓库添加一个接收后挂钩,以便我部署的仓库可以从我推送的更改中受益。

我认为我要通过已挂载的文件夹这一事实是问题的一部分,因为此设置可以在本地使用一些测试设备和文件。

现在创建的问题是,我的代码确实将被推送到裸仓库,将触发后接收挂钩,但是由于某种原因,脚本中使用的变量ref等将为空。尝试解决此问题时,我的远程/分支将使用计算机上下文而不是服务器上下文,因此也得到了一些时髦的结果。

无论如何,这没有用。我设法用自己的电脑和树莓派重现了这种行为:不同的装备,相同的设置。钩子将被触发,但脚本将被卡住,变量保持为空。 (这是我到目前为止还不了解的部分,因为远程路径很好,一切似乎都很好,推入将起作用,拉入等)。

现在,最终解决该问题的方法是采用另一种方式进行设置:

1)创建裸仓库,空的(服务器端) 2)创建一个空仓库的副本,仍然在服务器上(可能没关系)。 3)将我的代码放入该新仓库中,并将其推入裸仓库中,以便它是最新的。 4)为裸仓库创建一个新的克隆(针对我部署的项目) 5)将钩子添加到裸仓库中,接收后,目标是已部署的仓库,git dir是裸仓库。 (该文件上的+ chmod 777和+ x)

(从那里开始,更改任何内容并从第一个克隆中推送都应该触发钩子并正确部署已部署的repo签出)

6)然后,我回到我的IDE,克隆了裸仓库,尝试推送新内容,然后事情终于按预期进行了。

我只能在设置项目时在创​​建安装程序不同部分之间的正确链接的情况下假设克隆存储库,这意味着我第一次做的方式缺少某些东西,因此无法正常工作。

如果对此事有更多经验的人可以提供更详细的解释,我将不胜感激。同时我的问题解决了。