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