1

以下は、git-powered-website の更新とバックアップの戦略を構築する方法です。

Web サイトがホストされている Linux VPS に SSH アクセスできます。これが私がしたことです:

1) ウェブサイト サーバーで - 適切なウェブサイト フォルダー (パブリック ルートの 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 のセットアップ - Web サイト サーバーに 1 つ。Web サイト ファイル システムの変更を吸収します (変更は、スクリプト、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

このようにして、ライブ Web サイトの変更がリポジトリ マスター ブランチにコミットされます。

別の cron ジョブがバックアップ サーバーにセットアップされます。上記のスクリプトの直後に、次のスクリプトを毎日実行します。

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

このようにして、バックアップサーバーに毎日更新される「バックアップ」があり、これは git リポジトリでもあり、必要に応じて時間をさかのぼることができます。誤って上書きしたり削除したりしてデータを失うことを恐れる必要はありません...そしてプロセスは自動化されています!

cronjobs から毎日数通の電子メールを受け取ります。Web サイトで何が変更されたかを確認し、両方の cron ジョブが正しく実行されていることを確認できます。(データベースのバックアップを実行するために、別の cron ジョブが設定されます。)

4) 開発のセットアップ (ローカル レポ + ワーキング ツリー) - Web サイトからコピーを直接チェックアウトし、「dev」という名前の新しいローカル ブランチを作成しました。

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

これで、開発ブランチで遊んで仕事をすることができます。

この点から、私は知りたいです:

  • 変更をライブ Web サイトにプッシュする方法は?
  • Web サイトから変更を元に戻し、開発ブランチにマージするにはどうすればよいですか?

要するに、物事を台無しにすることなく、ライブサイトを開発ブランチと適切に同期する方法は?

4

3 に答える 3

4

これは、開発作業を「本番」(ライブWebサイト)にプッシュし、ライブWebサイトで発生する変更に合わせてローカルリポジトリを最新に保つというニーズを満たすために達成したソリューションです...

ウェブサイトを更新するには、ローカルの開発ブランチをウェブサイトのリポジトリにプッシュするだけです...

git push origin dev

...そして、変更をライブ Web サイト ツリーにマージします。Web サイト サーバーに SSH ログインし、Web サイト フォルダーで次のコマンドを実行する必要があります。

git merge dev

これにより、「dev」ブランチでプッシュされた変更が「master」ブランチ (ライブ サイトの現在のブランチ) にもたらされます。

* 更新プロセスの改善 *

ログインしてサーバー コマンド ラインからマージ コマンドを実行しなくても自動的にマージを実行するために、ライブ Web サイト リポジトリに 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

merge コマンドに追加された--ff-onlyオプションに注意してください。なぜそこにあるのですか?自動化されたプロセスであるため、マージの競合をライブ Web サイト ファイルに保存したくないためです。したがって、このオプションを使用して、クリーンな早送りコンテキストがある場合にのみマージが発生するように強制します。この完全なマージができない場合は、サーバーにログインして、手動でケースを解決するか、別のアプローチを使用して問題を解決します。

*競合の回避と同期*

サーバーでのマージの競合を回避するには、つまり、そこでの早送りマージを確実に成功させるには、リモート リポジトリからの最新の変更でローカル リポジトリを更新することをお勧めします。つまり、変更をプッシュする前に、最新のライブ Web サイトの変更 (リモート マスター ブランチ) でローカル開発ブランチを更新します。これは次のように実行できます。

git pull origin master

いっそのこと: 最初にローカルの master ブランチを更新してから、それをローカルの開発ブランチにマージしましょう (リベースのように聞こえます):

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

このようにして、ローカル マスター ブランチはリモートのライブ Web サイト マスター ブランチと同期され、マージは 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'

これで、次のように「デプロイ」エイリアスを使用してライブ サイトの更新を実行できます。

git deploy

そうなる:

  1. ローカル マスター ブランチに切り替える
  2. Web サイトの最新のコミットされた変更 (同期) でローカル マスター ブランチを更新します。
  3. dev ブランチに戻る
  4. 変更をローカル dev ブランチにマージします (必要に応じてここで競合を解決します)。
  5. ローカル dev ブランチをリモート ウェブサイト dev ブランチにプッシュする
  6. post-receive フックがサーバーに適切に設定されていると、Web サイトのリポジトリが自動的に早送りされるため、開発の変更が本番環境に公開されます。

私はこのセットアップを機能させており、シンプルな現在のニーズを満たしています。

于 2011-05-25T08:19:18.350 に答える
2

git と Web の統合に関する詳細については、http ://joemaller.com/990/a-web-focused-git-workflow/およびhttp://toroid.org/ams/git-website-howto参照してください。展開システム。

git は Web デプロイメント システムではないことを覚えておいてください(ただし、いくつかの単純なスクリプトを使用すると、単純なニーズを持つ人にはそのように機能します)。

于 2011-05-24T15:59:13.413 に答える
-1

または、 Githubのように Git と Jekyll を使用することもできます。

于 2011-05-24T16:07:28.163 に答える