尝试创建一个 git repo,每次有人更新 origin 时都会自动进行签出

尝试创建一个 git repo,每次有人更新 origin 时都会自动进行签出

基本上,我有一台带有 git repo 'origin' 的服务器。每当有人向其推送代码时,我都会尝试让另一个 repo 自动从 origin 拉取。我一直在使用 origin 中的钩子,特别是 post-receive。到目前为止,我的 post-receive 看起来像这样:

#!/bin/sh
GIT_DIR=/home/<user>/<test_repo>
git pull origin master

但是当我从另一台计算机推送到原点时,出现错误:

remote: fatal: Not a git repository: '/home/<user>/<test_repo>'

但是,test_repo 肯定是一个 git repo。我可以通过 cd 进入它并运行“git pull origin master”,它运行正常。

有没有更简单的方法可以完成我想做的事情?如果没有,我使用这种方法有什么问题?提前致谢。

编辑,澄清一下:repo 是一个正在开发的网站,我希望随时提供最新版本。

答案1

我正在使用类似的钩子,但 GIT_DIR 必须指向 .git 子目录。

#!/bin/sh
cd /home/<user>/<test_repo>
GIT_DIR=.git git pull origin master

答案2

当您设置环境变量时,它仅在该 shell 中可用 - 因此当您启动另一个程序(例如 git)时,局部变量不会被传递。假设我们有test.sh

#!/usr/bin/bash
echo "GIT_DIR=$GIT_DIR"

现在让我们看看以下例子

$ GIT_DIR=LOOK_MY_GIT_DIR_IS_SET
$ ./test.sh
GIT_DIR=

这是因为环境变量没有得到出口已启动程序。

$ export GIT_DIR=LOOK_MY_GIT_DIR_IS_SET
$ ./test.sh
GIT_DIR=LOOK_MY_GIT_DIR_IS_SET

在 ScottZ 的示例中,启动程序时设置环境变量会导致其仅为该命令导出。

$ GIT_DIR=LOOK_MY_GIT_DIR_IS_SET ./test.sh
GIT_DIR=LOOK_MY_GIT_DIR_IS_SET

希望这可以帮助!

答案3

您确定正确设置了 GIT_DIR 吗?

我假设你是从一个非裸仓库中提取的,在这种情况下你的 GIT_DIR 应该是

GIT_DIR=/home/user/test_repo/.git

要测试这一点,请在命令行上运行以下命令:

GIT_DIR=/home/user/test_repo/.git git status

相关内容