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?