【问题标题】:Post-Update Git Hook Not Finding Directory更新后 Git Hook 找不到目录
【发布时间】:2012-12-18 21:54:42
【问题描述】:

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

此设置基于this 文章。我的服务器是 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

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

【问题讨论】:

    标签: git msysgit githooks


    【解决方案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
    

    【讨论】:

    • 我得试一试。我考虑过相对路径,但我从未尝试过。我会让你知道情况如何。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-25
        • 1970-01-01
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 2022-06-03
        • 1970-01-01
        • 2017-01-17
        相关资源
        最近更新 更多