我正在努力建立一个简单的"具有本地版本,暂存版本和生产版本的Wordpress安装的git工作流程。我想要做的就是在本地进行更改,从本地推送到暂存,从本地推送到生产。起初我认为这将是一项简单的任务。我已经能够初始化存储库,添加两个遥控器" staging"和"生产",初始化遥控器上的git,并通常使用命令将更改从我的本地版本推送到登台和生产服务器:
git add .
git commit -m "some changes"
git push staging master
git push production master
然而,在我工作期间的某些时候发生了一些变化,虽然我仍然可以推送到Staging,但现在我无法在没有收到错误的情况下推送到Production服务器:
! [remote rejected] master -> master (Working directory has unstaged changes)
当我做" git status"它说:
On branch master
nothing to commit, working tree clean
在阅读Stack Overflow上几个类似但不同的问题的答案后,我尝试了以下内容:
git pull staging master
git pull staging master --rebase
git pull production master
git pull production master --rebase
我也尝试在远程服务器上执行此命令
git config --local receive.denyCurrentBranch updateInstead
我已经完全重新创建了几次服务器和存储库,只是为了从头开始重新安装git,但是这个问题在一段时间后仍然会发生,此时Git实际上是在破坏我的工作流而不是帮助它。如果有人对我的错误有任何见解,我将不胜感激!
答案 0 :(得分:4)
我遇到了类似的问题,将其推送到一个非裸露的远程仓库中,我希望立即检查工作副本文件。我的遥控器配置了receive.denyCurrentBranch updateInstead
,但它仍然在无法预测的时间拒绝接受推送。
Git 2.4添加了一个push-to-checkout钩子,该钩子可以覆盖此类推送失败。我根据githooks documentation中的示例编写了一个简短的脚本。
#!/bin/sh
set -ex
git read-tree --reset -u HEAD "$1"
我将此脚本安装在远程仓库中的.git/hooks/push-to-checkout
中。请注意,此脚本将覆盖远程服务器中的工作副本-它不会尝试将对这些文件的任何更改合并。那是因为我希望工作副本仅反映存储库中的文件。
答案 1 :(得分:1)
制作一个git bare repo是最好的做法 你可以推送到一个非裸机...但只有当你从源端推送文件时你没有修改目标端的文件。请参阅push-to-deploy。
但最佳做法仍然是添加一个后接收挂钩(as in my other answer),以便在实际文件夹中签出您收到的所有文件。