2011-12-27 18 views
2

私はpythonを使ってプロジェクトの更新されたすべてのファイルを自動展開するためのうまく機能するpost-receiveフックを書いています。基本的に、「展開」ブランチがプッシュされるたびに、変更されたファイルがFTP経由で自分のサーバーにアップロードされます。PythonのGit Hookを使ってGitリポジトリを更新する

は、ここで私がこれまで持っているものです。

def deploy(old, new): 
     fileList = subprocess.Popen(['git', 'diff', '--name-only', old, new], stdout=subprocess.PIPE) 
     files = fileList.stdout.read().split('\n')[:-1] 

     # Switch to the regular repository and pull to it. 
     os.chdir("/home/git/testrepo") 
     subprocess.Popen(['git', 'pull'], cwd="/home/git/testrepo") 

     for file in files: 
       print file 

for line in sys.stdin.xreadlines(): 
     old, new, ref = line.strip().split(' ') 
     if ref == "refs/heads/deploy": 
       print "Deploying the new commits now." 
       deploy(old, new) 
     else: 
       print "No need to deploy." 

このフックを含むリポジトリが裸のリポジトリです。私は/home/git/testrepo/の下にこのリポジトリのクローンである別のリポジトリを持っています。

このコードでは、作業ディレクトリをそのリポジトリに変更してプルを開始しようとしています。しかし、これは機能しません。代わりに、プッシュしてフックを実行すると、次のメッセージが表示されます。 "致命的:gitリポジトリではない: '。" "

どのようにしてこのリポジトリに正常にプルすることができ、そのファイルを他のサーバーにアップロードすることができますか?私が試したすべての方法が失敗しました。

+0

今のところ私はgitディレクトリに "git-dir"を引数としてgitコマンドを設定しています。しかし、私はまだ私の元の問題に実際の解決策を見つけることに興味があります。 – Serplat

答えて

0

git diff ...は、あなたが裸のレポの内側にいることを認識していないため、失敗しています。

代わりにgit --bare diff ...を試してください。$GIT_DIRを設定してください。

+0

'git diff ...'は実際にうまく動作します。私の作業ディレクトリを通常のリポジトリのディレクトリに変更しようとしていたにもかかわらず、正常に動作していなかったのはプルです。 – Serplat

+1

ああ、フックを実行する前に '$ GIT_DIR'が設定されている可能性があります。そうすれば、 'git pull'は' $ GIT_DIR'の現在の値を使用して間違ってしまうと思います。 'pull 'を実行する前にそれを設定するか、' --git-dir'を使って(あなたが言ったように)それを修正します。私はこれをテストしていないので、再び間違っているかもしれません:-) – m0tive

+0

それは妥当と思えます。あなたはそうかもしれない。 – Serplat

関連する問題