Git 预期命令:终端功能不全

Git commands with pexpect: Terminal not fully functional

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

git status 等简单命令有效,但 git diff --name-status ... 等命令无效。我收到以下错误消息:WARNING: terminal is not fully functional.

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

这是我程序中的代码片段:

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)

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

问候约翰尼

I get the following error message: WARNING: terminal is not fully functional.

这是警告,不是错误。

Can i run pexpect with a more functional terminal for example?

你可以(参见,例如,https://github.com/docker/docker/issues/8631;请注意,提及 OS 和环境等细节很重要;我只是在这里猜测)——但除非你编写的测试必须表现得像一个人在终端上交互,你不应该打扰。要从程序驱动 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,即 "plumbing command",您可以获得设计为机器可读的输出。参见

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