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 上?——尽管它确实出现在 shell 中,如果我不要管它,这很奇怪)。

上下文:我正在做一个程序来帮助一次处理多个存储库(https://github.com/fabioz/mu-repo),所以,因为它可以一次为许多存储库执行它,而不是管道它不是一个真正的选项,因为太多的东西看起来是乱码(如果指定了 ssh 访问权限或密码已经通过其他方式设置,那么事情确实有效,但我想有办法告诉用户进程被卡住等待输入而不是仅仅挂在那里——如果有办法执行它,确保在询问密码时 git 会失败,这也足够了)。

4

2 回答 2

0

为用户名和电子邮件设置全局配置。然后 git 不会提示这些。

git config --global user.name "Your Name"
git config --global user.email "your@email.address"
于 2012-07-30T23:57:34.687 回答
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 回答