如何设置一个Git钩子,然后推到ssh://peter@foo.com/~/bar.com.git,它会去〜/ bar.com并做一个git pull?

我被build议在远程服务器上设置

foo.com/~/bar.com # live webpage content foo.com/~/bar.com.git # a bare repo 

所以,从我的本地机器上,我可以做一个

 git push 

并将它推送到远程机器上的foo.com/~/bar.com.git (完整path是ssh://peter@www.foo.com/~/bar.com.git

如何添加一个钩子 ,以便推后,远程服务器将cd ~/bar.com并做一个git pull以便所有的内容被更新(本地机一样)? (不需要像Mercurial那样运行git update ?)

(这是相关的不能git克隆服务器上的文件夹,然后编辑和git推?现在我可以ssh到foo.comcd ~/bar.com然后在那里等着做一个git pull本地机器,但自动完成会很高兴)

更新 :如果您知道具体细节并且怎么做,请只发布一个答案。 如果你谷歌和发布第一或第二谷歌的结果在这里,它不会帮助。

更新2 :我去了~/bar.com.git/hooks并添加一个新的文件post-receive的内容:

 #!/bin/bash cd ~/bar.com git pull ../bar.com.git master 

还有chmod 755 post-receive ,如果我在本地机器上编辑一个文件,然后git com -m "ok"git push ,它不会把这个改变放到远程机器的文件夹~/bar.com

你可以添加一个post-receive钩子到这个~/bar.com.git 。 要做到这一点,添加到~/bar.com.git/hooks/目录的一个可执行文件post-receive与内容:

 #!/bin/sh unset $(git rev-parse --local-env-vars) cd ~/bar.com git pull 

确保 post-receive文件具有可执行位(例如755)。

现在,无论什么东西推到~/bar.com.git回购, ~/bar.com回购是自动更新。

也可以看看

  • 得到“致命的:不是一个混帐存储库:'。'”当使用后更新钩执行'git拉'在另一个回购
  • Git – 后接收钩与git拉“无法find一个有效的git目录”

了解为什么取消设置一些环境variables是必要的。

我使用下面post-update脚本(请确保您设置可执行位):

 #!/bin/sh rm -rf ~/public_html/xxx git-archive --format=tar --prefix=xxx master | tar x -C ~/public_html 

它做的事情,但有一个简短的窗口,当网站不可用。 直接在你的~/bar.comgit pull会暴露git的.git目录,所以要确保你在http服务器上阻止它,或者把.git保留在目录层次结构中更高的地方。 就像是:

 ~ \ - repo \ - .git - bar.com \ - your content