更新Git Hook后找不到目录

时间:2012-12-18 21:54:42

标签: git msysgit githooks

我正在设置一个环境,我可以将我的工作站本地完成的更改推送到“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到目录,所以我不确定是什么问题。

我也试过了:

  • 在我的路径中包含git \ cmd
  • 用引号(“)
  • 封闭我想要cd的路径
  • 让我的shebang指向#!/ c / progra~1 / git / bin / sh

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

3 个答案:

答案 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“是取消该变量的一种方式。