我正在设置一个环境,我可以将我的工作站本地完成的更改推送到“Hub”存储库(这是一个远程),然后更新后的挂钩会自动更新我的暂存网站,即“Prime” ”。我正在这样做,这样当我推送到我的远程集线器时,我可以看到我的更改会自动反映在我的暂存站点中。
此设置基于this文章。我的服务器是Windows 2012,我在服务器和工作站上使用MSysGit(Windows 7)。
当我手动完成所有操作时,一切正常工作 - 从我的本地仓库推送到集线器,然后手动获取/合并到素数。我的问题是当我尝试通过更新后的钩子完成获取/合并时。
当我对集线器进行更改时,我得到的输出是:
c:\Code4X\GIT\stage>git push stage master
Counting objects: 11, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 518 bytes, done.
Total 6 (delta 5), reused 0 (delta 0)
remote:
remote: **** Pulling changes into Live [Stage's post-update hook]
remote:
remote: hooks/post-update: line 12: cd: /c/websites/myproject.staging: No
such file or directory
To w:/stage.git
ce1e2ea..93e11f4 master -> master
我的更新后挂钩是:
#!/bin/sh
echo
echo "**** Pulling changes into Live [Stage's post-update hook]"
echo
cd /c/websites/myproject.staging || exit
unset GIT_DIR
git pull stage master
exec git update-server-info
我能够启动一个bash cmd shell并且没有问题地cd到目录,所以我不确定是什么问题。
我也试过了:
希望这是显而易见的事情。关于问题是什么的任何想法?
答案 0 :(得分:1)
我只是在我的一个项目上做了一些类似的事情。看起来你有正确的想法。
尝试使用相对路径。
#!/bin/sh
unset GIT_DIR
cd ..
# You are now in the project root
cd ../project.prime
git pull stage master
我想我会告诉你我在做什么,因为这可能会帮助你。每次更新repo时,此脚本都会强制更新工作副本:
#!/bin/sh
unset GIT_DIR
cd ..
git checkout -f
答案 1 :(得分:0)
您用作参考的文章似乎假设hub和prime位于同一主机上。也许你有那些在不同的主机上,这意味着更新后的挂钩运行的地方确实没有/c/websites/myproject.staging(它在接收推送的遥控器上执行)?
此外,虽然作者建议避免推送到非裸存储库通常是有效的,但以这种方式编写脚本大致相当于这样做,因此可能更改它以将推送链接到集线器上的远程(在更新后?指向素数?这将允许它与hub和prime驻留在不同的主机上一起工作,并且完全不需要导航目录。
答案 2 :(得分:0)
我找到了答案here:在使用“env -i”的后挂钩中运行任何git命令之前。因此:
cd /path/to/other/repo && env -i git pull
正如帖子中详细说明的那样,post-hook命令与GIT_DIR环境变量集一起运行,因此运行的任何git命令都会查看旧的repo,而不是你所在的那个。“env -i“是取消该变量的一种方式。