我试图从python脚本运行git log命令,以查找一个分支与另一个分支有多少分离(即多少提交)。我正在使用的git命令是:
git log HEAD ^master --no-merges --oneline | wc -l
据我所知,我应该可以使用子进程在python中运行它,如下所示:
import subprocess;
print subprocess.check_output('git log HEAD ^master --no-merges --oneline | wc -l', shell=True)
但是,我始终从这两段代码中得到不同的结果。
为了测试这个,我从master创建了一个新分支,修改了一个文件并提交了它。然后我运行了两个命令:
$ git log HEAD ^master --no-merges --oneline | wc -l
1
$ python -c "import subprocess; print subprocess.check_output('git log HEAD ^master --no-merges --oneline | wc -l', shell=True)"
1334
知道为什么会这样吗?我只是疯了吗?
更新
我已经能够通过使用子流程文档中提到的策略来解决这个问题:
command = ['git', 'log', 'HEAD', '^master', '--no-merges', '--oneline']
p1 = subprocess.Popen(command, stdout=subprocess.PIPE)
p2 = subprocess.Popen(['wc', '-l'], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()
commit_count = int(p2.communicate()[0])
我仍然很好奇,为什么shell = True策略会产生如此不同的结果......
答案 0 :(得分:1)
两个调用可以有不同的环境吗?就像,目前不同的目标?
在没有| wc -l
和/或使用诊断标志的情况下尝试此操作,以便更好地了解要完成的操作。