虽然这篇文章比较旧,但是强烈不建议向工作树中推送内容。
https://git.wiki.kernel.org/index.php/GitFaq#Unexpected_behavior
更好的方法是创建一个裸仓库来镜像网站的工作树。
所谓裸仓库,就是一个没有工作树或者说没有文件被检出的仓库。总之,目录结构存在,可以被检出。
换句话说,它只是用于托管变更的主机。
如果不知道你的Web所使用的目录层次结构,我会假设它是使用chrooted home的标准网站布局
例如:/home/user/www
在安装了Git的服务器上使用ssh:
创建当前站点的工作树
cd /home/user/public_html
git init
git add .
git commit -m "Initial Commit"
创建一个裸仓库,用于从本地系统推送到远程仓库。
mkdir /home/user/deploy.git
cd /home/user/deploy.git
git init --bare
将您的工作树存储库和裸部署存储库链接起来
cd /home/user/public_html
git remote add deploy /home/user/deploy.git
git remote show deploy
* remote deploy
URL: /home/user/deploy.git
git push deploy master
现在在您的本地系统上设置一个新的仓库。
git clone ssh://user@example.com/home/user/deploy.git
git branch -a
*master
remotes/origin/HEAD
remotes/origin/master
现在我们设置了2个钩子,可以在你推送到远程仓库或者其他有访问权限的人推送到远程仓库时立即对其进行更改。由于git config receive.denyCurrentBranch ignore会带来长期麻烦,在远程服务器上启用post-update以进行部署。
cd /home/user/deploy.git/hooks
mv post-update.sample post-update
vi post-update
将您的帖子更新钩子更改为以下内容并保存。
#!/bin/sh
echo "Pulling changes into public_html [deploy post-update]"
cd /home/user/public_html || exit
unset GIT_DIR
git pull deploy master
exec git update-server-info
现在我们设置您的Web工作树,以便在提交更改时将其推送到部署。
cd /home/user/public_html/.git/hooks
mv post-commit.sample post-commit
vi post-commit
然后将 post-commit 钩子更改为以下内容。
#!/bin/sh
echo "Pushing changes to deploy [public_html post-commit]"
git push deploy
你仍然可以选择检出你的网站工作树,如果需要的话。这将使你在推送本地系统的主分支时,从部署中拉取你的更改到网站的工作树中。你可以分支、变基、还原等,而不影响你的网站工作树,也不必担心冲突标记,只需使用裸的部署存储库即可。如果你需要更多对提交内容的控制,你可以使用 post-receive 而不是或与 post-update 结合使用。希望这能帮助其他想要做与 OP 相同事情的人。