2011-06-21 4 views
1

gitをデプロイメントツールとして使用しようとしているので、プロダクションブランチへのプッシュがあったときに、それに応じてリモートサーバを更新したいと思います。しかし、私が2番目のコマンド(プル)を実行すると、エラーが返ってきますOperation must be run in a work tree.誰かが正しい方向に私を向けることができますか?gitをデプロイメントツールとして使用する

ここにはbashスクリプトの一部のサンプルがあります。

echo -e "Thank you for pushing your changes to ${project}. \nHold on while I update the required directories..." 
GIT_WORK_TREE=/home/www/${project} git checkout -f 
echo "Local directory updated!" 

for ref in [email protected]; do 
    echo $ref 
    if [ "$ref" = "refs/heads/production" ]; then 
     # Before we could set the GIT directory strictly from the local environment 
     # but the case might not be the same remotely. Need absolute paths. 
     ssh [email protected] GIT_DIR=/home/www/${project}/.git GIT_WORK_TREE=/home/www/${project} git checkout -f production 
     ssh [email protected] GIT_DIR=/home/www/${project}/.git GIT_WORK_TREE=/home/www/${project} git pull -f production 
     echo "Production push completed" 
    fi 
done 

EDIT:あなたは、 "展開" を検討レポは裸のリポジトリであるようですね

remote: fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.

+1

独自の展開スクリプトを使用する代わりに、[Capistrano](https://github.com/capistrano/capistrano)を調べる必要があります。 – meagar

+2

Gitはデプロイメントツールではありませんが、十分なスクリプティングであれば、ちょっとしたことができます。 http://toroid.org/ams/git-website-howtoを参照してください。しかし、はい、maegarは正しいです。それは非裸である必要があります(通常、プライマリアップストリームサーバーのコピーではなく、具体的にはプッシュするレポです) 。 –

答えて

3

@ imagarは、リモートサーバー上のクローンされたリポジトリが--bareオプションでクローンされたようだと言っています。ローカルに持っているように、このオプションを使わずにもう一度クローンして、通常の "作業ディレクトリ"のコピーを取得してください。

は、だから、今持っている必要があります。

  • ローカルリポジトリ
  • サーバーの塗装されていないリポジトリ
  • (裸のものからクローン化された)サーバー上の通常の1

これを念頭に置いて、何かが裸のリポジトリにプッシュされたときに実行されるポスト受信フックを作成できるようになりました。フックは裸のレポのフックフォルダに(サーバー上に)住んでいます(そこにはさまざまなケースでサンプルがあります)。

#!/bin/bash 
while read oldrev newrev refname 
do 
    if [ "$refname" == "refs/heads/master" ]; then 
     WORKDIR=/path/to/checked/out/repository 
     export GIT_DIR=$WORKDIR/.git 
     pushd $WORKDIR >/dev/null 
     git pull --quiet >/dev/null 
     # run some scripts in the checked out repository 
     popd >/dev/null 
    fi 
done 

このスクリプトは、特にmasterブランチへのプッシュを探しますが、これは簡単に別のブランチに変更するか、完全に削除することができます。次に、チェックアウトしたリポジトリの作業ディレクトリに切り替え、プルを行います。プルが完了したら、他の有用なbashコマンドを実行できます。

+0

Ghickman - 私はこれをリモートでやっていますが、SSHコールでこれらのコマンドをすべて1行に追加すればいいですか? – hwrdprkns

+0

@hwrdprkns - これは/hooks/post-receiveにありません(実行権限があることを確認してください)。私が答えて言ったように、ポスト受信フックはローカルチェックアウトからそのベアリポジトリにプッシュすると自動的に実行されるので、プッシュするたびにサーバーのチェックアウトされたコピーが更新されます。 – ghickman

+0

私は正しく私を理解しているとは思わない - ワークフローの例:ローカルにコミットする - >裸のレポにプッシュ - >ポスト受信フックの更新リモート(キーワード)プロダクションサーバーのレポ。あなたのスクリプトは、ローカルサーバー上のリポジトリを更新するように見えます(warer.bare-repo)。 – hwrdprkns

1

ここでは、コピー貼り付けエラーです。レシピ--bareなしで複製して、もう一度試してください。

関連する問題