簡體   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