私はそれを正しい方法で計画していますか?
カスケードリポジトリは非常に複雑に聞こえ、正常ではありません。
コミットしているベアgitリポジトリのクライアント/サテライト/子のチェックアウトを検討してください。ステージングと本番インストールは、特定のブランチの読み取り専用チェックアウトである必要があります。おそらく、git-flowに精通している可能性があります(ほとんどすべてのgit質問がそれにリンクしているためです。この質問も例外ではありません)。ブランチを設定して、適切にチェックアウトします。
Gitサーバーのセットアップ
このチュートリアルは、おそらくあなたが従う必要がある唯一のチュートリアルです。
/home/git
にホームを持つgitユーザーをセットアップし、そこにリポジトリを作成する/home/git/project.git
場合、絶対パスは必要ないことに注意してください。つまり
(server) $ cd /home/git
(server) $ mkdir project.git
(server) $ cd project.git
(server) $ git --bare init
次に、必要な場所で:
(home) $ git clone git@server:project.git
もちろん、gitリポジトリを好きな場所に配置し、gitユーザーのホームディレクトリ(in /etc/passwd
)を変更して同じことを実現することもできます。
プッシュで更新
リポジトリにプッシュするたびにチェックアウトを更新する場合は、受信後のフックが必要です。まず、自分自身を正しく設定します。
(server) $ cd /var/www/app.com/web/
(server) $ git clone -b production-branch /home/git/project.git . # it's local - use a file path
(server) $ cd /var/www/test.com/web/app.com/
(server) $ git clone -b staging-branch /home/git/project.git .
次に、/ home / git / project.git / hooks/post-updateを作成します。
cd /var/www/test.com/web/app.com
git --git-dir /var/www/test.com/web/app.com/.git pull #> /dev/null 2>&1 & #uncomment after testing
確認しておいて:
- フックファイルは実行可能であり、gitが所有しています
- Gitは(また)チェックアウトされたファイルの所有者と同じグループに属します。そうでない場合、プッシュするとパーミッションエラーが発生します
上記のように、コマンドの出力はプッシュするたびに送信されます。これにより、プッシュが遅くなります。正しく機能することが確実な場合は、バックグラウンドで実行できます。ステージングチェックアウトがすべてのプッシュをプルしていることは問題ではありません-それが指しているブランチに変更がない場合、それは何もしません。
ライブサイトを自動的に更新することはおそらく良い考えではありません。その代わり
(home) $ git checkout production-branch
(home) $ git merge staging-branch
(home) $ git push # updating production-branch
(home) $ git checkout feature/i-was-working-on-this
(home) $ ssh server 'cd /var/www/app.com/web/; git pull'
# Manual Post update checks
これを自動的に行い、たとえば更新によって本番サイトが使用できない状態になった場合は、わからない可能性があります(「本番サイトがオフラインです」というpingdomアラートが表示されるまで)。かなりのテストカバレッジと自動展開プロセスがある場合は、ライブサイトの更新を自動化しても安全ですが、実行する前に歩いてください:)。
ダイレクトプッシュ
あなたが設定した場合、あなたが本当に裸ではないチェックアウトにプッシュしたい場合はできます
[receive]
denyCurrentBranch = ignore
プロジェクトの.git/configファイルで、作業コピー(iirc)も更新する必要のあるローカル変更がない場合。