使用非裸Git存储库更新服务器文件

时间:2014-02-27 15:55:32

标签: git

我有一台安装了Git的Linux服务器。我正在开发一个Web应用程序,我想在网站路径(/ var / www / apps / myapp)上的服务器上创建一个git存储库,然后将我的本地存储库更改推送到它。

当我在服务器上创建非裸存储库并推送更改时,我收到此错误:

  

拒绝更新签出的分支:refs / heads / master。   默认情况下,拒绝更新非裸存储库中的当前分支,   因为它会使索引和工作树与什么不一致   你推了,并且需要'git reset --hard'来匹配工作树   对HEAD。等

建议使用裸存储库。我可以成功地做到这一点但我的问题是我希望我的服务器在推送更改时自动更新Web应用程序文件夹。据我所知,当我使用裸存储库时,我必须再次克隆服务器中的裸存储库以获取真实文件。这样我就有3个存储库。两个在服务器端(其中一个是裸的)和一个在本地。

我只想要一个只读存储库,我可以在其中推送我的更改,并在服务器端更新Web应用程序文件夹内容。

解决方案是什么?

1 个答案:

答案 0 :(得分:1)

在服务器仓库中,您必须允许推送到当前分支。摘录自git help config

  

receive.denyCurrentBranch

     

如果设置为true或“拒绝”,git-receive-pack将拒绝对非裸存储库的当前>签出分支的ref更新。这样的推送是有潜在危险的,因为它使得HEAD与索引和工作树不同步。如果设置为“警告”,则向stderr打印此类推送的>警告,但允许推进继续。如果设置为false或>“忽略”,则允许此类推送而不显示任何消息。默认为“拒绝”。

所以在服务器git repo:

git config receive.denyCurrentBranch ignore

在服务器上,.git/hooks/post-receive.sample重命名为post-receive并向其添加以下行:

export GIT_DIR=`pwd`
cd ..
export GIT_WORK_TREE=`pwd`
git reset --hard HEAD

这会在您推送时更新网站。