1

我正在设置一个环境,我可以将在我的工作站上本地完成的更改推送到“Hub”存储库(这是一个远程),然后更新后挂钩将自动更新我的登台网站,即“Prime”。我这样做是为了在我推送到远程集线器时可以看到我的更改会自动反映在我的暂存站点中。

此设置基于本文。我的服务器是 Windows 2012,我在服务器和我的工作站(Windows 7)上都使用 MSysGit。

当我手动执行所有操作时,一切正常 - 从我的本地存储库推送到集线器,然后手动获取/合并到素数。我的问题是当我尝试通过更新后挂钩完成获取/合并时。

当我对集线器进行更改时,我得到的输出是:

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 到目录,所以我不确定问题是什么。

我也试过:

  • 在我的 PATH 中包括 git\cmd
  • 将我试图 cd 到的路径括在引号 (") 中
  • 让我的 shebang 指向 #!/c/progra~1/git/bin/sh

希望这是显而易见的。关于问题是什么的任何想法?

4

3 回答 3

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
于 2012-12-19T00:57:04.510 回答
0

您用作参考的文章似乎假设集线器和主服务器位于同一主机上。也许您在不同的主机上拥有这些,因此意味着更新后挂钩在真正没有 /c/websites/myproject.staging 的地方运行(它在接收推送的远程执行)?

此外,虽然作者避免推送到非裸存储库的建议通常是有效的,但以这种方式编写拉取脚本大致相当于这样做,因此可能将其更改为将推送链接到集线器上的远程(指向主要) 在更新后?这将允许它与位于不同主机上的集线器和主服务器一起使用,并完全消除挂钩中导航目录的需要。

于 2012-12-18T23:00:11.740 回答
0

我在这里找到了答案:在钩子后运行的任何 git 命令之前使用“env -i”。因此:

cd /path/to/other/repo && env -i git pull

如帖子中所述,原因是 post-hook 命令使用 GIT_DIR 环境变量集运行,因此运行的任何 git 命令都会查看您的旧仓库,而不是您所在的仓库。“env -i”是取消设置该变量的一种方法。

于 2013-01-08T13:51:00.093 回答