2

現在、git を使用してプロジェクトを本番環境にデプロイgit push production masterし、次の post-receive フックを使用してリポジトリを使用しています。

#!/bin/bash
GIT_WORK_TREE=/home/username/www.example.com/myproject/ git checkout -f

production経由で追加されたリモートgit remote add production ssh://server/home/username/projects/myproject.gitです。

しかし、サーバー上の別のパスに別のブランチをデプロイする必要があります。解決策は思いつきましたが、もっと良い方法があると思います。

私がしたことは、サーバー上に新しいリポジトリを作成することmyproject-alternate.gitでし/myproject/た. これで、 を使用して代替パスにデプロイできます。/myproject-alternate/git remote add alternate ssh://server/home/username/projects/myproject-alternate.gitgit push alternate branchname:master

これは機能しますが、いくつかの問題があります。

  1. 代替サーバーにデプロイするコマンドは、私が期待していたものではありません。最後に を何度も忘れて:masterしまい、サーバーのリポジトリが新しいブランチを受け取り、post-receive フックがトリガーされませんでした。
  2. サーバー上に新しいリポジトリを作成することが最善の解決策であったかどうかはわかりません。また、より大きなプロジェクトではどうなるのだろうかと思います。

上記の問題なしでこの展開フローを達成する他の方法はありますか? 受信したブランチ名を使用して正しいパスにデプロイする、より良い受信後のフックでしょうか? (これは可能ですか?)

4

2 に答える 2

2

Web サイトをステージング サーバーとライブ サーバーにデプロイするために使用するセットアップについて、ブログ記事を書きました。同様のことができます。.git/config重要なのは、次のように、ローカル リポジトリのファイルにプッシュするブランチを構成することです。

[remote "alternate"]
    url = ssh://server/home/username/projects/myproject-alternate.git
    fetch = +refs/heads/master:refs/remotes/alternate/master
    pushurl = ssh://server/home/username/projects/myproject-alternate.git
    push = refs/heads/branchname:refs/heads/master
[remote "production"]
    url = ssh://server/home/username/projects/myproject.git
    fetch = +refs/heads/master:refs/remotes/production/master
    pushurl = ssh://server/home/username/projects/myproject.git
    push = refs/heads/master:refs/heads/master

これにより、入力するたびに

git push alternate

ローカル ブランチを代替リポジトリbranchnameのリモートブランチに自動的にプッシュします。master

ただし、代替ワーク ツリーと本番ワーク ツリーは同じコンピューター上にあるため、1 つのリポジトリを作成し、それを 2 つの異なる場所にチェックアウトするだけで済む可能性があります。これを行うには、前の段落を無視して、代わりに次のようなものを post-receive フックに入れます。

#!/bin/bash
checkout_alt=
checkout_prod=
while read oldrev newrev refname; do
    case "$refname" in
        ( "refs/heads/branchname" )
            export checkout_alt=1 ;;
        ( "refs/heads/master" )
            export checkout_prod=1 ;;
    esac
done
test -n "$checkout_alt" && GIT_WORK_TREE=/home/diazona/tmp/gittest/alt/ git checkout -f branchname
test -n "$checkout_prod" && GIT_WORK_TREE=/home/diazona/tmp/gittest/prod/ git checkout -f master

(明らかに、ステートメントを使用する必要はありません) 。ifこれを行う場合は、簡単にするために、リポジトリを裸にして、独自の作業コピーを保存しないようにすることをお勧めします。このように、必要なリモートは 1 つだけで、ブランチをプッシュするたびmasterにプロダクション ワーク ツリーが更新され、branchnameブランチをプッシュするたびに代替ワーク ツリーが更新されます。

免責事項: 私はこれを実際にテストしていないので、最初にテスト フォルダーで試してください。エラーが見つかったら、戻って編集します。

于 2011-09-22T02:10:36.823 に答える