3

次の状況を考慮してください。

JavaScript プロジェクトのコードを含む git リポジトリ foo.git があります。このリポジトリには、からコードをフェッチする Web サーバーによって提供されるコードの状態を含むブランチプロダクション/var/www/fooがあります。このリポジトリは、プロジェクトのマスター リポジトリです。誰もがそれを押したり引いたりします。

誰かがその特定のブランチにプッシュするたびに、プロダクション/var/www/fooのチェックアウトを更新することは可能ですか? git デーモン (または、すべての人が SSH 経由で接続するためにログインするユーザーであるユーザー git) は、上記のディレクトリに書き込む資格があると想定できます。

4

3 に答える 3

2

サーバー上に。を使用してベアリポジトリを作成する必要がありますgit init --bare。次に、post-receiveフックを使用してデプロイをトリガーします。どのように展開するかはあなた次第です。

私の展開戦略

私は通常deploy、論理的な場所にディレクターを配置します。次に、チェックアウトするたびに、最新のブランチを解凍して、最新のプッシュのハッシュがdeploy/COMMIT_IDどこにあるかを確認します。COMMIT_IDチェックアウトが完了すると、シンボリックリンクを最新のデプロイメントディレクトリに再ポイントできます。

私の通常のディレクトリ構造:

deploy.git/
deploy/
    a7922231/
    b2f0a2af/
    latest -> b2f0a2af 

アップデートの解凍

を使用するのではなく、git-checkout通常git-archive、ブランチをディレクトリに解凍するために使用します。

# Assuming current directory is deploy.git
HEAD=`cat refs/heads/master`
mkdir -p ../deploy/${HEAD}
git archive master | tar -x -C ../deploy/${HEAD}

あなたのウェブサーバーは指すことができますdeploy/latest、更新は多かれ少なかれアトミックになります。

私はこれを本番環境で頻繁に使用しますが、同じディレクトリで解凍するよりもいくつかの利点があります。

  1. ロールバックは簡単です
  2. 現在のデプロイメントを中断することなく、依存関係のコンパイルやインストールなどの解凍後の手順を実行できます

チップ

  1. 更新のたびに、更新がいつ発生したか、およびそれらのハッシュIDが何であるかを示す展開ログに追加します。これにより、ロールバックがはるかに簡単になります。
于 2013-02-03T07:11:21.890 に答える
1

(上記の私のコメントに基づいて)post-receiveという名前のファイルを作成する必要があります。/git/foo.git/hooks directoryこのようなもの(いくつかのデバッグログ付き):

#!/bin/sh

echo 'Hook called'
pullneeded=false

while read oldrev newrev refname
do
    echo "OLDREV $oldrev NEWREV $newrev REFNAME $refname"
    if [ "$refname" == "refs/heads/production" ]; then
        echo 'Pull needed'
        pullneeded=true
    fi
done

if [ $pullneeded ]; then
    echo 'Pull'
    cd /var/www/foo
    git --git-dir=/var/www/foo/.git pull
fi

echo 'Hook done'

他のリポジトリのプロダクションブランチ/var/www/fooを追跡するには、git リポジトリを にセットアップする必要があります。そこでoriginと呼ばれる場合、それは次のとおりです。

git branch --set-upstream production origin/production

もちろん、本番/var/www/fooブランチはリポジトリでチェックアウトする必要があります。

更新しました

フックの方が適切かもしれませんpost-update(サンプルはこちらからhttps://stackoverflow.com/a/6597728/299788 ):

#!/bin/bash    

case " $* " in
*' refs/heads/production '*)
    cd /var/www/foo
    git --git-dir=/var/www/foo/.git pull
    ;;
esac
于 2013-02-03T04:18:45.547 に答える
0

次のコマンドを使用して、git リポジトリfoo.gitをディレクトリにチェックアウトできます。dir

git archive | tar x dir
于 2013-02-03T13:40:11.420 に答える