WordPress:在没有第3方软件的情况下使用Git进行三项开发

时间:2019-04-10 21:08:16

标签: wordpress git version-control versioning

也许这个问题太广泛了(我希望不是),但是我目前不知道如何解决我的 WordPress Git分支模型问题。

我的计划是创建这样的分支模型,而不使用 BitBucket Server Jenkins

enter image description here

因此,我已经开始在git init(目前仅安装WP)系统的wp-content文件夹中制作一个PROD

完成此操作后,我克隆了整个PROD页并创建了staging子域。克隆完成后,我已经删除了wp-content系统上的staging文件夹,并键入了git clone <prod-path>/.git

这很好用,并且在登台版本进行了一些更改(出于测试目的)后,我能够将它们推回到PROD。到目前为止,一切都是逻辑正常的,并且运行良好。

经过一段时间的思考,我有了一个很好的主意(也许是愚蠢的),可以对PC上的本地DEV进行克隆。因此,我之前的操作与暂存版本相同,但是这次,我已将暂存wp-content克隆(PROD克隆)克隆到本地DEV版本。

对于第一个视图,一切看起来都不错,但是在尝试将某些东西推送到暂存系统后,我从目标暂存rejected中得到了Git

remote: error: refusing to update checked out branch: refs/heads/development        
remote: error: By default, updating the current branch in a non-bare repository   

所以我首先想到,这很愚蠢,因为该阶段也是HEAD上没有PROD的克隆(我认为)。

我对你的问题:

您有一个主意,如何在没有任何第三方软件的情况下保持这种工作流程,但要拥有两个可以在DEV上运行,在Staging上测试并可以在{ {1}}?

使用命令说:

PROD

更新

这是我的裸钩文件夹的内容(没有收到邮件,该怎么办?):

1. git push <to the staging>
2. git push <to the prod>
3. git merge <dev to master>

1 个答案:

答案 0 :(得分:1)

  

但是在尝试将某些东西推送到暂存系统后,我被目标暂存Git拒绝了

这取决于什么是“已拒绝”消息。
如果是

remote: error: refusing to update checked out branch: refs/heads/development        
remote: error: By default, updating the current branch in a non-bare repository   

这意味着您需要在分阶段存储库中包含一个“裸露”子文件夹:

cd staging
git init --bare . bare
echo /bare/>>.gitignore
git add .gitignore
git commit -m "Ignore nested bare repo /bare/"
git remote add bare bare
git config remote.bare.fetch '+refs/heads/*:refs/remotes/bare/*'

cd bare
git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

然后修改bare/hooks/post-receive文件以使其:

  • 成为可执行文件
  • 包括以下内容

post-receive钩在bare嵌套的裸仓库中:

#!/bin/bash
unset GIT_DIR
cd ..
git --work-tree=. --git-dir=.git fetch bare
git --work-tree=. --git-dir=.git fetch --tags bare

if ! git --work-tree=. --git-dir=.git merge-base --is-ancestor master origin/master; then
  echo "Reset non-bare master to bare master (forced update)"
  git  --work-tree=. --git-dir=.git reset --hard origin/master
else
  echo "Update non-bare master with merge from origin/master"
  git --work-tree=. --git-dir=.git pull --no-rebase origin master
fi

最后,在您的开发者克隆存储库上:

cd dev
git config --unset-all remote.origin.pushurl
git config --add remote.origin.pushurl "/path/to/staging/bare"

那样,您将照常从暂存库中获取数据,但是将推送到裸露的嵌套暂存库中,并且该挂钩将更新所述暂存内容。