2

git fetch を実行しているときに出力を取得しようとしていますが、ユーザー名の要求が停止しており、それを検出できません。

すなわち:私がやっているPythonスクリプトで:

cmd = 'git fetch origin master'.split()
import subprocess
p = subprocess.Popen(cmd, cwd='.',stderr=subprocess.PIPE)
while p.poll() is None:
    r = p.stderr.read(1)
    print(r)

そして、何も印刷せずに停止します。stderr をパイプせずに実行すると、ユーザー名を要求するメッセージが表示されます (したがって、書き込み中ですが、stderr.read は何も検出しません)。

[16:41:45 X:\]python test.py
Username for 'my.domain.com.br': 

stderr.fileno() を直接処理し、Popen bufsize を変更し、process.stdin に書き込み、stdin を閉じたり、さまざまなことを試してみましたが、役に立ちませんでした。それを機能させる方法を知っている人はいますか?(私の感覚では、msysgit は、フラッシュしたり、新しい行を書いたりせずに、ユーザー名を要求するように書いているだけで、Python はそれを適切に処理できません。その場合、msysgit でのみ修正される可能性があります? --パイプしないでください。これは奇妙です)。

コンテキスト: 複数のリポジトリを一度に処理するのに役立つプログラムを実行しています (https://github.com/fabioz/mu-repo)。これは、多くのリポジトリに対して一度に実行できるため、パイプする必要はありません。あまりにも多くのものが文字化けしているように見えるため、実際にはオプションではありません(sshアクセスが指定されているか、パスワードが他の方法で既に設定されている場合は機能しますが、プロセスが待機していることをユーザーに伝える方法が必要ですそこにぶら下がるのではなく入力します-パスワードが要求された場合にgitが失敗することを確認して実行する方法があれば、それで十分です)。

4

2 に答える 2

0

サブプロセスにも同様の問題がありました。自分の環境 (Windows 7、git にパスワードは不要) でコードを複数回実行すると、すべてではなく一部の出力が得られ、実行するたびに異なる量の出力が得られます。これを回避するために、コマンドを実行して出力を一時ファイルに保存し、ファイルを読み戻して、毎回すべての出力を取得しました。次のようなものです。

#!/bin/python
import os
import subprocess

cmd = "git fetch origin master"
filename = "temp.txt"

if os.name == "posix":
    p=subprocess.Popen(['sh', '-c', cmd+' >> '+filename])
elif os.name == "nt":
    p=subprocess.Popen(['cmd.exe', '/c '+cmd+' >> '+filename])
while not os.path.isfile(filename):
    pass
fd = open(filename, 'r')
return_value = None
out = ""
while return_value == None:
    text = fd.readline()
    if text:
        out += text
    return_value = p.poll()
while text:
    text = fd.readline()
    if text:
        out += text
fd.close()
于 2015-01-08T23:58:07.137 に答える
0

ユーザー名と電子メールのグローバル構成をセットアップします。その後、git はこれらのプロンプトを表示しません。

git config --global user.name "Your Name"
git config --global user.email "your@email.address"
于 2012-07-30T23:57:34.687 に答える