5

私は Git を使用して Web サイトのソース コードと展開を管理しており、現在、テスト サイトとライブ サイトを同じボックスで実行しています。このリソースhttp://toroid.org/ams/git-website-howtoに従って、ライブ サイトへのプッシュとテスト サイトへのプッシュを区別するために、次の post-receive フック スクリプトを考え出しました。

while read ref
do
  #echo "Ref updated:"
  #echo $ref -- would print something like example at top of file
  result=`echo $ref | gawk -F' ' '{ print $3 }'`
  if [ $result != "" ]; then
    echo "Branch found: "
    echo $result
    case $result in
      refs/heads/master )
        git --work-tree=c:/temp/BLAH checkout -f master
        echo "Updated master"
        ;;
      refs/heads/testbranch )
        git --work-tree=c:/temp/BLAH2 checkout -f testbranch
        echo "Updated testbranch"
        ;;
      * )
        echo "No update known for $result"
        ;;
    esac
  fi
done
echo "Post-receive updates complete"

ただし、これが実際に安全であるかどうかは疑問です:)私は決してGitの専門家ではありませんが、Gitはおそらく現在チェックアウトされているブランチヘッドを追跡していると推測しており、このアプローチはおそらくそれを混乱させる可能性があります果てしなく。

いくつか質問があります:

  1. これは安全ですか?

  2. ベース リポジトリをテスト サイト リポジトリ (対応する作業ディレクトリを含む) にしてから、そのリポジトリに変更を新しいライブ サイト リポジトリ (ライブ サイト ベースに対応する作業ディレクトリを持つ) にプッシュさせる方がよいでしょうか? これにより、プロダクションを別のサーバーに移動して、展開チェーンをそのまま維持することもできます。

  3. 足りないものはありますか?Git を使用して Web サイトを管理する場合に、テスト展開と本番展開を区別する別の明確な方法はありますか?

Viの回答に照らして追加のメモとして、ファイルシステムをあまりいじらずに削除を処理する良い方法はありますか?

ありがとう - ウォルト

PS - 複数のリポジトリ用に思いついたスクリプト (よく聞こえない限り使用しています) は次のとおりです。

sitename=`basename \`pwd\``

while read ref
do
  #echo "Ref updated:"
  #echo $ref -- would print something like example at top of file
  result=`echo $ref | gawk -F' ' '{ print $3 }'`
  if [ $result != "" ]; then
    echo "Branch found: "
    echo $result
    case $result in
      refs/heads/master )
        git checkout -q -f master
        if [ $? -eq 0 ]; then
            echo "Test Site checked out properly"
        else
            echo "Failed to checkout test site!"
        fi
        ;;
      refs/heads/live-site )
        git push -q ../Live/$sitename live-site:master
        if [ $? -eq 0 ]; then
            echo "Live Site received updates properly"
        else
            echo "Failed to push updates to Live Site"
        fi
        ;;
      * )
        echo "No update known for $result"
        ;;
    esac
  fi
done
echo "Post-receive updates complete"

そして、../Live/$sitename のリポジトリ (これらは、init の後に作業ツリーが追加された「裸の」リポジトリです) には、基本的な post-receive があります。

git checkout -f
if [ $? -eq 0 ]; then
    echo "Live site `basename \`pwd\`` checked out successfully"
else
    echo "Live site failed to checkout"
fi
4

3 に答える 3

2

両方の方法が機能すると考えてください。

「git archive master | tar -C c:/temp/BLAH -x」および「git archive live-site | ssh live-site 'tar -C /var/www -x'」も使用できます。

別々のリポジトリを保持することは便利かもしれませんが、「プッシュ関連の別のフック内にプッシュする」ことは難しいようで、遅くなると思います。遅くて壊れやすい一種の長いチェーン。

「テスト」バージョンをテストした後、ライブサイトの更新を手動でトリガーする必要がありますか?

于 2010-02-05T18:57:02.317 に答える
1

toroid.orgでも同じガイドに従いましたが、ベアリポジトリから始めたとしても、作業ディレクトリを追加することで、追加の処理が必要になる可能性が高いことに注意してください。次のフックは、動的に変更される可能性のあるコンテンツがあり、使用時にデータを失いたくない場合に便利であることがわかりました。git checkout -f

事前受信

#!/bin/sh
git add -A
git diff --quiet --cached
if [ $? -gt 0 ]; then
    git commit --quiet -m "autocommit"
    echo "Working Directory was out of sync. Pull to receive updated index."
    exit 1
fi

これにより、リモートの作業ディレクトリに変更があった場合にプッシュが停止します。誰か(Webサーバー)が変更を加えているが、コミットするのを忘れていると考えてください。で使用checkoutすると、-fこれらの変更は破棄されます。このフックは、これが発生するのを防ぐのに適した場所ですが、プルの前にリモートサーバーでフックが呼び出され、これらの変更をシームレスに受信できるようにすると便利です。

ポストレシーブ

#!/bin/sh
git checkout -f
echo "Working directory synced."

2つのブランチがあることに関して、最初のソリューションは、複数のリポジトリを処理するよりもエレガントだと思いました。本番サイトを本当に隔離したい場合は、同様のデルタパッチを適用したrsyncをローカルで使用できます。作業ディレクトリとしてテストサイトのみを使用して、リポジトリにテストと安定したブランチを作成します。リリースの準備ができたら、テストを安定したブランチにマージし、プッシュして、安定したブランチへのコミットを探すフックを作成して、rsyncを呼び出します。

于 2010-04-10T01:46:46.020 に答える
1

ベース リポジトリをテスト サイト リポジトリ (対応する作業ディレクトリを含む) にしてから、そのリポジトリに変更を新しいライブ サイト リポジトリ (ライブ サイト ベースに対応する作業ディレクトリがある) にプッシュさせる方がよいでしょうか? これにより、プロダクションを別のサーバーに移動して、展開チェーンをそのまま維持することもできます。

はい、間違いなく。テスト サイトを本番サイトのすぐ隣でホストしたいというケースは非常にまれです。データベースの破損、ウェブサーバーのロックアップなどについては言うまでもなく、ほとんどすべての点で危険で専門的ではありません.

私は通常、テスト目的で VM をセットアップしています。非常にうまく機能し、旅行中にラップトップで持ち歩くことができます。

git を使用して Web サイトを展開することは非常に良いアイデアです。他の多くの人がそうしています (Rob Conery など)。いずれにせよ、ライブ サイトとテスト サイトがある場合は、対応するサーバー リポジトリでリモート トラッキング ブランチとして設定して、リポジトリにそれらのブランチを個別に用意する必要があります。ワークフローは、テスト ブランチでの作業、テストへのプッシュ、テスト、ライブへのマージ、ライブへのプッシュと同じくらい簡単になります。

正直なところ、自分自身を難しくしすぎないでください。

于 2010-02-14T09:44:54.593 に答える