基本上,我有一台带有 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