2

私は Git リポジトリで Gitolite を実行しており、そこに Python で書かれた post-receive フックがあります。git リポジトリ ディレクトリで「git」コマンドを実行する必要があります。数行のコードがあります。

proc = subprocess.Popen(['git', 'log', '-n1'], cwd='/home/git/repos/testing.git' stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc.communicate()

新しいコミットを作成してリポジトリにプッシュした後、スクリプトが実行され、

fatal: Not a git repository: '.'

私が走れば

proc = subprocess.Popen(['pwd'], cwd='/home/git/repos/testing.git' stdout=subprocess.PIPE, stderr=subprocess.PIPE)

予想通り、gitリポジトリへの正しいパス(/home/git/repos/testing.git)が表示されます

このスクリプトを bash から手動で実行すると、正しく動作し、「git log」の正しい出力が表示されます。私が間違っていることは何ですか?

4

2 に答える 2

4

コマンドライン スイッチを使用して git リポジトリの設定を試みることができます。

proc = subprocess.Popen(['git', '--git-dir', '/home/git/repos/testing.git', 'log', '-n1'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

--git-dir.git実際の git ディレクトリ (作業ツリー内)を指す必要があります。一部のコマンドでは、オプションも設定する必要があることに注意してください。--work-tree

ディレクトリを設定する別の方法は、GIT_DIR環境変数を使用することです。

import os
env = os.environ.copy()
env['GIT_DIR'] = '/home/git/repos/testing.git'
proc = subprocess.Popen((['git', 'log', '-n1', stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)

どうやらフックはすでに設定されていますGIT_DIRが、明らかにこれはあなたのケースでは正しくありません(相対的である可能性があります)。上記のコードは、完全な明示的なパスに設定します。

gitマンページを参照してください。

編集:明らかに、cwd を指定してGIT_DIRvarをオーバーライドする場合にのみ、OP に対してのみ機能します。

import os
repo = '/home/git/repos/testing.git'
env = os.environ.copy()
env['GIT_DIR'] = repo
proc = subprocess.Popen((['git', 'log', '-n1', stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, cwd=repo)
于 2012-06-07T16:38:38.090 に答える
0

cwd 引数の後にカンマがありません:

proc = subprocess.Popen(['git', 'log', '-n1'], cwd='/home/git/repos/testing.git', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
于 2012-06-07T16:37:26.553 に答える