git show / log bez sekwencji ucieczki powłoki, do użycia z python sh

Używam polecenia Pythona do skryptowania poleceń git. Na przykład robię takie rzeczy

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()

a następnie piszę project_hash, project_branch i project_date do bazy danych itp.

Problem polega na tym, że git czasami dodaje do wyjścia wyjściowe sekwencje powłoki. Na przykład,

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

prowadzi do

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

Pierwsze dwa ciągi nie stanowią problemu, ale ostatni ciąg, data, ma sekwencje specjalne.

Czy jest jakiś sposób, w jaki mogę się ich pozbyć, np. prosząc git, aby nie wyprowadzał żadnych sekwencji ucieczki?

Próbowałem opcji „--no-color” za pomocą polecenia git log. To nie pomogło.

Z przyjemnością rozebrałbym ich w sam python, ale nie wiem jak. Próbowałem s.encode ('ascii'), gdzie s jest łańcuchem daty. To nie miało znaczenia.

Wydrukuj stdout w Pythonie bez sekwencji ucieczki powłoki rozwiązuje ten sam problem. Zaleca się użycie podprocesu Pythona zamiast sh. Np. Mógłbym to zrobić

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

i

print(repr(project_date))

daje

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

Tego właśnie chcę. Jednakże, jeśli to możliwe, wolałbym trzymać się sh, więc chciałbym wiedzieć, czy mogę uniknąć sekwencji ucieczki używając sh.

Jakieś sugestie?

questionAnswers(2)

yourAnswerToTheQuestion