繁体   English   中英

没有 shell 转义序列的 git show/log,用于 python sh

[英]git show/log without shell escape sequences, for use with python sh

我正在使用 python 的 sh 来编写 git 命令。 例如,我做这样的事情

import sh
git = sh.git.bake(_cwd='/some/dir/')

project_hash = git('rev-parse', 'HEAD').stdout.strip()
project_branch = git('rev-parse', '--abbrev-ref', 'HEAD').stdout.strip()
project_date = git('log', '-1', '--pretty=format:%ci').stdout.strip()

然后我将 project_hash、project_branch 和 project_date 写入数据库等。

问题是 git 有时会在其输出中添加 shell 转义序列。 例如,

print(repr(project_hash))
print(repr(project_branch))
print(repr(project_date))

造成

'e55595222076bd90b29e184b6ff6ad66ec8c3a03'
'master'
'\x1b[?1h\x1b=\r2012-03-26 01:07:40 -0500\x1b[m\r\n\r\x1b[K\x1b[?1l\x1b>'

前两个字符串没有问题,但最后一个,日期,有转义序列。

有什么办法可以摆脱这些,例如要求 git 不要输出任何转义序列?

我已经用 git log 命令尝试了“--no-color”选项。 那没有帮助。

我也很乐意在 python 中将它们剥离出来,但我不知道如何。 我试过 s.encode('ascii') 其中 s 是日期字符串。 这并没有什么不同。

在没有 shell 转义序列的 Python 中打印标准输出解决了同样的问题。 那里的建议是使用 python 的子进程而不是 sh。 例如,我可以做

project_date = subprocess.check_output(["git", "log", "-1", "--pretty=format:%ci"], cwd='/some/dir/')

print(repr(project_date))

'2012-03-26 01:07:40 -0500'

这当然是我想要的。 但是,如果可能的话,我更愿意坚持使用 sh,因此想知道我是否可以使用 sh 避免转义序列。

有什么建议?

这些不是颜色序列,它们看起来像终端初始化序列。 具体来说:

ESC [ ? 1 h ESC =

是打开功能键模式的顺序和

ESC [ ? 1 l ESC >

是再次关闭它的顺序。 这表明git log正在通过您的寻呼机运行内容。 我不太确定为什么; 通常,当输出是管道时,git 会禁止使用寻呼机subprocess.Popen()至少与subprocess.Popen() ,我会考虑使用sh ,尽管我没有使用sh模块)。

(暂停以查阅文档...)

啊哈! 根据sh module docs ,默认情况下, sh -module-run 命令的输出通过伪 tty。 这是在欺骗 git 运行你的寻呼机。

作为一个稍微肮脏的解决方法,您可以运行git --no-pager log ...来禁止使用寻呼机,即使在使用sh运行时也是如此。 或者,您可以尝试使用_tty_out=False参数(同样,我还没有使用sh模块,您将不得不尝试一下)。 有趣的是,sh 模块文档底部的示例之一是 git!

似乎 sh 做了正确的事情。 在python 2.7中,这个:

import sh
git = sh.git.bake(_cwd='/tmp/gittest/')

project_hash = git('rev-parse', 'HEAD')
project_branch = git('rev-parse', '--abbrev-ref', 'HEAD')
project_date = git('log', '-1', '--pretty=format:%ci')

print(repr(project_hash).strip())
print(repr(project_branch).strip())
print(repr(project_date).strip())

给我:

500ddad67203badced9a67170b42228ffa269f53
master
2013-11-22 00:05:59 +1100

如果你真的想去掉转义,使用 python 提供的解码器工具( 在 Python 中处理字符串中的转义序列

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM