WordPress: 3-сторонняя разработка с Git без стороннего программного обеспечения - PullRequest
1 голос
/ 11 апреля 2019

Возможно, этот вопрос слишком широкий (я надеюсь, что нет), но в настоящее время я не знаю, как решить мою WordPress Git Branching Model проблему.

Я планировал создать такую ​​модель ветвления без использования BitBucket Server или Jenkins :

enter image description here

Итак, я начал делать git init в папке wp-content моей PROD (на данный момент только установка WP) системы.

После того, как я закончил с этим, я клонировал всю страницу PROD и создал поддомен staging. После завершения клонирования я удалил папку wp-content в системе staging и набрал git clone <prod-path>/.git.

Это прекрасно работало, и после внесения некоторых изменений (в целях тестирования) в промежуточную версию я смог вернуть их обратно к PROD. До сих пор все логично и нормально и работало очень хорошо.

Подумав некоторое время, у меня появилась отличная (может быть, глупая) идея сделать то же самое с локальным клоном DEV на моем ПК. Итак, я делал то же самое, что и в промежуточной версии, но на этот раз я клонировал промежуточный wp-content клон (PROD клон) в мою локальную DEV версию.

На первый взгляд, все выглядело нормально, но после попытки что-то перенести в систему Staging, я получил 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 (я думаю).

Итак, мой вопрос к вам:

У вас есть идея, как я могу сохранить этот вид Workflow без какого-либо стороннего программного обеспечения, но с двумя клонами, с которыми я могу работать на DEV, тестировать на Staging и запускать на PROD?

Чтобы сказать это с помощью команд:

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

Обновление

Это содержимое моей папки «голые крючки» (пост-полученных сообщений нет, что мне делать?):

/wp-content/.bare/hooks$ ls -la
total 56
drwxr-xr-x 2 wp_ftp psacln 4096 Apr 11 13:09 .
drwxr-xr-x 7 wp_ftp psacln 4096 Apr 11 13:20 ..
-rwxr-xr-x 1 wp_ftp psacln  478 Apr 11 13:09 applypatch-msg.sample
-rwxr-xr-x 1 wp_ftp psacln  896 Apr 11 13:09 commit-msg.sample
-rwxr-xr-x 1 wp_ftp psacln 3327 Apr 11 13:09 fsmonitor-watchman.sample
-rwxr-xr-x 1 wp_ftp psacln  189 Apr 11 13:09 post-update.sample
-rwxr-xr-x 1 wp_ftp psacln  424 Apr 11 13:09 pre-applypatch.sample
-rwxr-xr-x 1 wp_ftp psacln 1642 Apr 11 13:09 pre-commit.sample
-rwxr-xr-x 1 wp_ftp psacln 1492 Apr 11 13:09 prepare-commit-msg.sample
-rwxr-xr-x 1 wp_ftp psacln 1348 Apr 11 13:09 pre-push.sample
-rwxr-xr-x 1 wp_ftp psacln 4898 Apr 11 13:09 pre-rebase.sample
-rwxr-xr-x 1 wp_ftp psacln  544 Apr 11 13:09 pre-receive.sample
-rwxr-xr-x 1 wp_ftp psacln 3610 Apr 11 13:09 update.sample

1 Ответ

1 голос
/ 11 апреля 2019

, но после попытки отправить что-то в систему Staging, я получил отклонение от целевой подготовки 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"

Таким образом, вы, как обычно, извлекаете из репозитория Staging, но переходите к голому вложенному репозиторию Staging, и ловушка обновит указанное содержание Staging.

...