[英]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.