私は 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はおそらく現在チェックアウトされているブランチヘッドを追跡していると推測しており、このアプローチはおそらくそれを混乱させる可能性があります果てしなく。
いくつか質問があります:
これは安全ですか?
ベース リポジトリをテスト サイト リポジトリ (対応する作業ディレクトリを含む) にしてから、そのリポジトリに変更を新しいライブ サイト リポジトリ (ライブ サイト ベースに対応する作業ディレクトリを持つ) にプッシュさせる方がよいでしょうか? これにより、プロダクションを別のサーバーに移動して、展開チェーンをそのまま維持することもできます。
足りないものはありますか?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