更新后Git钩子找不到目录

更新后Git钩子找不到目录,git,msysgit,githooks,Git,Msysgit,Githooks,我正在设置一个环境,在这里我可以将在工作站上本地完成的更改推送到“中心”存储库(远程),然后更新后挂钩将自动更新我的登台网站,即“主”。我这样做是为了在推送到远程集线器时,可以看到我的更改自动反映在我的临时站点中 此设置基于文章。我的服务器是Windows 2012,我在服务器和工作站(Windows 7)上都使用MSysGit 当我手动执行所有操作时,一切都正常工作——从本地回购推送到集线器,然后手动获取/合并到主回购。我的问题是,当我试图让获取/合并由更新后挂钩完成时 当我向我的中心提交更改

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

此设置基于文章。我的服务器是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启动到目录中,因此我不确定问题出在哪里

我也试过:

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

希望这是显而易见的。你有没有想过问题出在哪里?

你作为参考使用的文章似乎假设hub和prime位于同一台主机上。也许你的hub和prime位于不同的主机上,这意味着更新后的钩子在没有/c/websites/myproject.staging的情况下运行(它在接收推送的远程设备上执行)


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

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

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

我刚刚在我的一个项目上完成了一些类似的操作。看起来你的想法是对的

尝试使用相对路径

#!/bin/sh
unset GIT_DIR
cd ..
# You are now in the project root
cd ../project.prime
git pull stage master
我想我应该让你知道我在做什么,因为这可能会帮助你。此脚本将在每次更新回购协议时强制更新工作副本:

#!/bin/sh
unset GIT_DIR
cd ..
git checkout -f
我刚刚在我的一个项目中完成了一些类似的工作。看来你的想法是对的

尝试使用相对路径

#!/bin/sh
unset GIT_DIR
cd ..
# You are now in the project root
cd ../project.prime
git pull stage master
我想我应该让你知道我在做什么,因为这可能会帮助你。此脚本将在每次更新回购协议时强制更新工作副本:

#!/bin/sh
unset GIT_DIR
cd ..
git checkout -f
我找到了答案:在post钩子中运行的任何git命令前面加上“env-I”

正如文章中所详述的,原因是post hook命令使用GIT_DIR环境变量集运行,因此运行的任何GIT命令都会查看您的旧repo,而不是您所在的repo。“env-i”是解除该变量的一种方法。

我找到了答案:在post hook中运行的任何GIT命令之前使用“env-i”。因此:


正如文章中所详细说明的,原因是post hook命令是使用GIT_DIR环境变量集运行的,因此运行的任何GIT命令都会查看旧的repo,而不是您所在的repo“是使变量不稳定的一种方法。

我必须试一试。我考虑过相对路径,但从未尝试过。我会让你知道它是如何运行的。谢谢!我必须试一试。我考虑过相对路径,但从未尝试过。我会让你知道它是如何运行的。谢谢!