現在、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 lfs
、git push
を呼び出します。 Git pushはコマンドラインで正常に動作するので、モジュールが文字通り同じコマンドをシェル環境に送信するので、suprocessで起動すると同じことが起こると思います。
問題は私のためにlfsにはありませんが、おそらくgit-remote-https
の呼び出しにありますか?私は私があなたのケースcall.In私のサブプロセス関数にshell=True
を追加しなければならなかったサブプロセスを使用してgitの実行に問題がありました場合は
128は非常に一般的なエラーコードであり、すべてを意味する可能性があります。プロセスの出力を把握して印刷する必要があります。 @KlausD。 –
私はそれを試して、全く出力を得ていない。 'subprocess.Popen'のようなものを使って' stdin = PIPE、stdout = PIPE、stderr = PIPE'を設定しても、 'process.poll()'は128を返し、 'process.stdout.read()'は何も与えません。この情報を質問に追加します。 –
'subprocess.check_output()'を試してください。 @KlausD。 –