ウェブサイトで git バージョン管理をテストしています。現在のセットアップでは、ネットワーク共有ドライブ /g/ に 2 つのベア リポジトリがあります (1 つはイントラネット用、もう 1 つはインターネット用)。このリポジトリにプッシュするときに、サイトを /x/ の Web サーバーに自動的にチェックアウトしたいと考えています。ここでのいくつかのブログと質問の提案に従って、次のように post-receive フックを設定しました。
#!/bin/sh
GIT_WORK_TREE=/x/intranet checkout -f
これは、各リポジトリのマスター ブランチをデプロイするのにうまく機能しました。各展開にはおそらく 5 ~ 10 秒かかりました。ただし、/y/ の開発サーバーに自動的にチェックアウトされる開発ブランチも必要です。私の改訂されたフックは次のようになりました:
#!/bin/sh
GIT_WORK_TREE=/x/intranet checkout -f master
GIT_WORK_TREE=/y/intranet checkout -f dev
これは非常に問題がありました。現在プッシュすると約 15 分かかるからです。問題は、変更されたファイルを更新するだけでなく、各ブランチの作業ディレクトリ全体が書き直されたことにあるようです。どのブランチがプッシュされたかをチェックして、そのブランチだけをチェックアウトする条件を追加しても、以前にプッシュされたブランチ以外のブランチをプッシュすると、プッシュに 10 分ほどかかります。明らかにこれは受け入れられません。
私の現在の試みでは、各サーバーに 2 つのリポジトリ (1 つのイントラネットと 1 つのインターネット) があります。現在実行中のフックは次のようになります。
#!/bin/bash
while read oldrev newrev ref
do
branch=`echo $ref | cut -d/ -f3`
if [ "master" == "$branch" ]; then
cd /x/intranet
unset GIT_DIR
git pull --verbose origin master
echo "Changes pushed to production server."
fi
if [ "dev" == "$branch" ]; then
cd /y/intranet
unset GIT_DIR
git pull --verbose origin dev
echo "Changes pushed to dev server."
fi
done
このフックは、実行する必要があると感じるよりもまだ時間がかかります (レポの 1 つで自分でプルを実行するのに約 4 秒かかるのに比べて、約 2 分かかります)。私の実装のいずれかに問題はありますか? または、問題を解決する別の方法はありますか?
編集:マウントされたドライブを git bash シェルで使用することが問題なのだろうかと思っていましたか?