虽然这是相当古老的,但非常不鼓励将其推送到工作树。
https://git.wiki.kernel.org/index.php/GitFaq#Unexpected_behavior
更好的方法是创建一个镜像网站工作树的裸仓库。
所有的裸仓库都是一个没有工作树或者更确切地说没有签出文件的仓库。层次结构存在所有考虑的事物并且可以被检出。
换句话说,它仅充当更改的主机。
在不知道您正在使用的网络目录层次结构的情况下,我将假设它是使用 chrooted 主页的标准网站布局
例如:/home/user/www
在使用 ssh 并安装了 git 的服务器上:
创建当前站点的工作树
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 个挂钩,以便在您推送到它或您授予访问权的其他人推送到它时立即更改您的 Web 远程仓库。由于 git config receive.denyCurrentBranch ignore 从长远来看会导致麻烦
在远程服务器上启用部署后更新
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
现在我们设置您的网络工作树,以便在提交内容时推送其更改以进行部署。
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
如果需要,您仍然可以选择检查您的网络工作树。
当您推送本地系统的主服务器时,这将允许您将更改从部署拉到您的网络工作树。
您可以在不影响 Web 工作树的情况下进行分支、变基、还原等操作,而无需担心冲突标记,而只需使用裸部署存储库。
如果您需要对提交的内容进行更多控制,您可以使用 post-receive 代替 post-update 或与 post-update 结合使用。
希望这可以帮助其他希望做与 OP 相同的人。