2017-09-02 14 views
1

現在、gitを使用するための独自のモジュールを作成しようとしています。この理由から私はGitPythonの使用を避けたいと思います。次のようにPythonのサブプロセスを使用してgit repoをGitHubにプッシュすると、終了コード128が返されます。

た瞬間にプッシュするための私のコードは次のとおりです。

class Git(object): 
    def __call_git(self,*args): 
     a = [self.path+"git"] + list(args) 
     return subprocess.check_output(a,stdin=subprocess.PIPE) 
    def push(self,username,password,remote="origin",branch="master"): 
     url = self.__call_git("remote","get-url",remote).replace("\n","") 
     url = "".join(["https://",username,":",password,"@",url[8:]]) 
     output = self.__call_git("push","--repo",url,branch) 
     return output 

これはgitのにユーザー名とパスワードを渡すために標準入力で動作することを避けるためにコマンドgit push --repo https://username:[email protected]/repo.gitを実行することにより、gitのにプッシュしようとします。これは、コマンドラインで動作しますが、私はこのコードを実行してみたときに、私は次の出力を得る:

Traceback (most recent call last): 
    File "<pyshell#81>", line 1, in <module> 
    g.push("username","password") 
    File "/home/git.py", line 68, in push 
    output = self.__call_git("push","--repo",url,branch) 
    File "/home/git.py", line 37, in __call_git 
    return subprocess.check_output(a,stdin=subprocess.PIPE) 
    File "/usr/lib/python2.7/subprocess.py", line 574, in check_output 
    raise CalledProcessError(retcode, cmd, output=output) 
CalledProcessError: Command '['git', 'push', '--repo', 'https://username:[email protected]/repo.git', 'master']' returned non-zero exit status 128 

Gitにはpushコマンドが関与している時はいつでもでもgit pushのようなもののために、このように反応するように思われます。 subprocess.Popenのようなものを使用し、stdin=PIPE,stdout=PIPE,stderr=PIPEを設定すると、process.poll()はまだ128を与え、process.stdout.read()は何も与えません。

誰もがこれがなぜ起こっているのか説明し、私の問題に解決策を提供できますか?

--- EDIT --- hereからいくつかのアドバイスに従い

、私はGIT_TRACE=1でのgitコマンドの束を実行しました。私はこれまでにgit pushというコマンドを使用していて、trace: run_command行しか持っていないことを確認しました。

19:57:21.694468 run-command.c:334  trace: run_command: 'git-remote-https' 

これは私が原因で上記のリンクから何か他のものであるのかもしれない疑います。

環境であっても、サブプロセスからgit push origin masterを実行することはできません。私はそれがlfs pre-push hookによって作られた競合状態と関係していると思う。サブプロセス呼び出しgit push,は、lfsまたはlfsがstdout/returnコードを強制終了する前に終了するgit lfsgit pushを呼び出します。 Git pushはコマンドラインで正常に動作するので、モジュールが文字通り同じコマンドをシェル環境に送信するので、suprocessで起動すると同じことが起こると思います。

問題は私のためにlfsにはありませんが、おそらくgit-remote-httpsの呼び出しにありますか?私は私があなたのケースcall.In私のサブプロセス関数にshell=Trueを追加しなければならなかったサブプロセスを使用してgitの実行に問題がありました場合は

+1

128は非常に一般的なエラーコードであり、すべてを意味する可能性があります。プロセスの出力を把握して印刷する必要があります。 @KlausD。 –

+0

私はそれを試して、全く出力を得ていない。 'subprocess.Popen'のようなものを使って' stdin = PIPE、stdout = PIPE、stderr = PIPE'を設定しても、 'process.poll()'は128を返し、 'process.stdout.read()'は何も与えません。この情報を質問に追加します。 –

+0

'subprocess.check_output()'を試してください。 @KlausD。 –

答えて

0

subprocess.check_output(...other args, shell=True)

をあなたが見つかりました。セキュリティ上の考慮事項を読むことをお勧めしますあなたはそれを行う前にサブプロセスのドキュメントで。

+0

これは単にスペースで区切られた引数を作るだけだと思います。リストから文字列に切り替えることができます。 –

+0

あなたは正しいです、そしてリストから文字列に切り替えることは私にとっていくつかの問題を解決しました。しかし、私はサブプロセスに渡されるコマンドを制御する内部ツールを作成していました。確かに、これはあなたにとってうまくいかないかもしれません。申し訳ありませんが、私はもっと助けになることはできませんでした! – rahvin74

関連する問題