【问题标题】:Git commands with pexpect: Terminal not fully functional带有 pexpect 的 Git 命令:终端功能不全
【发布时间】:2016-11-24 16:16:41
【问题描述】:

我目前正在开发一个程序,它应该通过 pexpect 控制一个 git 存储库。

git status 这样的简单命令可以正常工作,但像git diff --name-status ... 这样的命令却不能。我收到以下错误消息:WARNING: terminal is not fully functional

我找到的所有解决方案都是在 Windows 或 Mac 上解决问题。

这是我程序中的coden-p:

my_bash = pexpect.spawn('/bin/bash', cwd="/home/xxx/clone_repo/local.repo/")
my_bash.logfile = sys.stdout
my_bash.sendline(git diff --name-status branch1 branch2)

有人知道这个问题的解决方案吗?例如,我可以使用功能更强大的终端运行 pexpect 吗?

你好,约翰尼

【问题讨论】:

    标签: git python-2.7 pexpect


    【解决方案1】:

    我收到以下错误消息:警告:终端功能不完整。

    这是一个警告,而不是错误。

    例如,我可以使用功能更强大的终端运行 pexpect 吗?

    您可以(例如,参见https://github.com/docker/docker/issues/8631;请注意,您提到操作系统和环境等细节至关重要;我只是在这里猜测)——但除非您编写的测试必须像人类在终端,你不应该打扰。要从程序驱动 Git,请使用被设计为程序驱动的 Git 部分。代替git diff,运行git diff-tree,例如:

    my_bash = pexpect.spawn('/bin/bash', cwd="/home/xxx/clone_repo/local.repo/")
    my_bash.logfile = sys.stdout
    my_bash.sendline('git diff --name-status branch1 branch2')
    

    你可以这样做:

    proc = subprocess.Popen(['git', 'diff-tree', '-r',
                             '--name-status', 'branch1', 'branch2'],
                             shell=False, cwd='/home/xxx/clone_repo/local.repo')
    
    out, err = proc.communicate()
    status = proc.wait()
    

    然后处理由此产生的结果。您可以更直接地控制程序,并且通过使用“管道命令”git diff-tree,您可以获得设计为机器可读的输出。见Which are the plumbing and porcelain commands?

    (通过使用shell=False,您还可以防范常见的安全问题。)

    【讨论】:

    • 非常感谢您的回复!我会看看我是否可以通过 diff-tree 获得所需的一切。
    猜你喜欢
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2014-06-12
    • 1970-01-01
    相关资源
    最近更新 更多