簡體   English   中英

git 網站更新攻略 - 如何同步開發和實時存儲庫?

[英]git website update strategy - how to sync dev and live repositories?

以下是我構建 git-powered-website 更新和備份策略的方式:

我有 SSH 訪問托管網站的 Linux VPS。 這是我所做的:

1)在網站服務器 - 在適當的網站文件夾(公共根之前的一級)創建了 git 存儲庫:

cd /path/to/website
git init
git add -A
git commit -m "Website as of today."

2) 在備份服務器上 - 在另一個 VPS 上創建了一個鏡像倉庫,用於備份目的:

git clone --mirror ssh://user@example.com/path/to/website website_backup

請注意,鏡像倉庫也是一個裸倉庫(沒有簽出的工作樹)。

3) 設置 CRONJOBS - 一個在網站服務器上,用於吸收 wesbite 文件系統更改(更改可以通過腳本完成,通過 FTP 等)。 它每天運行以下 bash 腳本:

#!/bin/bash
date=$(date +%d/%m/%Y)
cd /path/to/website
git add -A -v
git commit -m "Changes done at to website at ${date}"
exit 0

這樣,實時網站更改將提交到存儲庫主分支。

在備份服務器上設置了另一個 cronjob。 它每天運行以下腳本,就在上面的另一個之后:

#!/bin/bash
cd /path/to/website_backup
git fetch -u ssh://user@example.com/path/to/website
exit 0

這樣我在備份服務器上有一個每日更新的“備份”,這也是一個 git 存儲庫,如果需要,我可以及時向后移動。 我不需要太害怕因意外覆蓋或刪除而丟失東西......而且這個過程是自動化的!

我每天都會收到來自 cronjobs 的幾封電子郵件。 它允許我檢查網站中的更改,並確認兩個 cronjobs 都在正確運行。 (設置了另一個 cronjob 來執行數據庫備份。)

4)設置開發(本地回購+工作樹) - 我直接從網站上簽出一個副本,然后創建一個名為“dev”的新本地分支:

git clone ssh://user@example.com/path/to/website website_local
git checkout -b dev

現在,我可以玩開發分支,做我的工作了。

從這一點,我想知道:

  • 如何將我的更改推送回實時網站?
  • 如何從網站取回更改並合並到我的開發分支?

簡而言之:如何正確地將實時站點與開發分支同步而不搞砸?

這是我實現的解決方案,以滿足將我的開發工作推向“生產”(實時網站)的需求,並讓我的本地存儲庫與實時網站上發生的更改保持同步......

更新網站只需將我的本地開發分支推送到網站存儲庫...

git push origin dev

...然后,將更改合並到實時網站樹中。 我需要 SSH 登錄網站服務器,在網站文件夾下運行以下命令:

git merge dev

這會將“dev”分支中的推送更改帶到“master”分支(即實時站點當前分支)。

* 改進更新過程 *

為了自動運行合並,無需登錄並從服務器命令行運行合並命令,我在實時網站存儲庫中添加了一個 post-receive 掛鈎。 首先,我創建了掛鈎文件,使其可執行,然后編輯該文件:

touch /path/to/website/.git/hooks/post-receive
chmod a+x /path/to/website/.git/hooks/post-receive
pico /path/to/website/.git/hooks/post-receive

我的接收后掛鈎文件的內容是:

#!/bin/sh
unset GIT_DIR
cd /path/to/website
echo "Merging dev changes to master branch."
git merge --ff-only dev
exit 0

請注意添加到合並命令的--ff-only選項。 為什么會在那里? 它存在是因為,作為一個自動化過程,我不想將合並沖突存儲到我的實時網站文件中。 所以,使用這個選項,我強制合並只有在我有一個干凈的快進上下文時才會發生。 如果這種干凈的合並不能發生,那么我可以登錄服務器,手動解決問題,或者使用其他方法解決問題。

* 避免沖突和同步 *

為避免服務器上的合並沖突,即確保成功的快速向前合並,最好使用遠程存儲庫的最新更改更新本地存儲庫。 換句話說:在推送我們的更改之前,使用最新的實時網站更改(遠程主分支)更新本地開發分支。 這可以這樣做:

git pull origin master

更好的是:讓我們先更新本地主分支,然后將其合並到本地開發分支(聽起來像變基):

git stash save
git checkout master
git pull origin master
git checkout dev
git stash pop
git merge master

這樣,我們的本地 master 分支與遠程直播網站 master 分支保持同步,並且 100% 本地執行合並。

*回到簡單*

我創建了一個別名來方便事情:

git config alias.deploy '!git stash save && git checkout master && git pull origin master && git checkout dev && git stash pop ; git merge master && git push origin dev'

現在,我可以使用“deploy”別名執行實時站點更新,如下所示:

git deploy

它會:

  1. 切換到本地 master 分支
  2. 使用網站最新提交的更改更新本地主分支(同步)
  3. 切換回 dev 分支
  4. 將更改合並到本地開發分支(如果需要,請在此處解決沖突)
  5. 將本地 dev 分支推送到遠程網站 dev 分支
  6. 在服務器上正確設置 post-receive 鈎子后,它將自動快進網站 repo,因此開發更改將發布到生產中!

我有這個設置工作,它滿足了我當前的需求,這很簡單。

You might want to look at http://joemaller.com/990/a-web-focused-git-workflow/ and http://toroid.org/ams/git-website-howto for further information on integrating git and web部署系統。

請記住, git 不是 web 部署系統(盡管使用一些簡單的腳本,它可以為有簡單需求的人工作)。

或者,您可以像Github那樣使用 Git 和 Jekyll

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM