ich git-Python in einem meiner Projekte bin mit, und zur Zeit habe ich diesen Code:Kann nicht roh git filter-branch laufen
tpl = """
if test $GIT_COMMIT = "%s"; then
export GIT_AUTHOR_DATE="%s"
export GIT_COMMITTER_DATE="%s"
fi
"""
s = ""
for commit in filter(lambda x: x["newdatetime"] is not None, self.commit_datetime):
s += tpl % (
commit["hash"],
commit["newdatetime"].replace(tzinfo = None),
commit["newdatetime"].replace(tzinfo = None)
)
cmd = "'%s'" % s
cmd = re.compile("(?<=')\s+(?=\S)").sub("", cmd)
cmd = re.compile("(?<=\S)\s+(?=')").sub("", cmd)
self.git.repo.git.filter_branch("-f", "--env-filter \\\n", cmd)
Aus Gründen dieser Frage akzeptieren, dass das Ergebnis der Lambda-Funktion ist ein Array aus einem einzigen Element mit den folgenden Daten:
{
"hash": "random git hash",
"newdatetime": "datetime string parseable by git filter branch"
}
die 2 re
Befehle hinteren und vorderen Leerstellen vor und nach dem ersten/letzten '
Charakter abzustreifen verwendet.
Das Endergebnis ist:
git.exc.GitCommandError: Cmd('git') failed due to: exit code(1)
cmdline: git filter-branch -f --env-filter \
'if test $GIT_COMMIT = "64436207f36dd78e128936bbdec16b8741ff418c"; then
export GIT_AUTHOR_DATE="2017-07-24 18:56:26"
export GIT_COMMITTER_DATE="2017-07-24 18:56:26"
fi'
stderr: 'usage: git filter-branch [--env-filter <command>] [--tree-filter <command>]
[--index-filter <command>] [--parent-filter <command>]
[--msg-filter <command>] [--commit-filter <command>]
[--tag-name-filter <command>] [--subdirectory-filter <directory>]
[--original <namespace>] [-d <directory>] [-f | --force]
[<rev-list options>...]'
Der Befehl in Ordnung zu sein scheint, und es in einer Shell funktioniert wie erwartet, nur gut laufen. Entweder macht Git-Python etwas Funky oder ich vermisse einen (wahrscheinlich) sehr einfachen Fehler. Welches ist es?
EDIT:
ich den Code aktualisiert, sieht so jetzt ist es wie:
tpl = """
if [ "$GIT_COMMIT" == "%s" ]; then
export GIT_AUTHOR_DATE="%s";
export GIT_COMMITTER_DATE="%s";
fi
"""
...
...
self.repo.git.filter_branch("-f", "--env-filter", cmd)
Und ich bekomme jetzt:
Traceback (most recent call last):
File "/Users/alexandernst/Proyectos/git-rewrite-date/git_rewrite_date.py", line 135, in rewrite
self.mygit.rewrite_dates(commits)
File "/Users/alexandernst/Proyectos/git-rewrite-date/my_git.py", line 38, in rewrite_dates
self.repo.git.filter_branch("-f", "--env-filter", cmd)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/git/cmd.py", line 425, in <lambda>
return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/git/cmd.py", line 877, in _call_process
return self.execute(call, **exec_kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/git/cmd.py", line 688, in execute
raise GitCommandError(command, status, stderr_value, stdout_value)
git.exc.GitCommandError: Cmd('git') failed due to: exit code(1)
cmdline: git filter-branch -f --env-filter 'if [ "$GIT_COMMIT" == "0694755bb844e5b5a569b56ee5154232265ccfe6" ]; then
export GIT_AUTHOR_DATE="2017-07-24 22:43:54";
export GIT_COMMITTER_DATE="2017-07-24 22:43:54";
fi'
Rewrite 8cbb2c9143ed58722d001b5c4f0e801636dbd079 (1/25) (0 seconds passed, remaining 0 predicted) '
stderr: '/Applications/Xcode.app/Contents/Developer/usr/libexec/git-core/git-filter-branch: line 354: if [ "$GIT_COMMIT" == "0694755bb844e5b5a569b56ee5154232265ccfe6" ]; then
export GIT_AUTHOR_DATE="2017-07-24 22:43:54";
export GIT_COMMITTER_DATE="2017-07-24 22:43:54";
fi: command not found
env filter failed: 'if [ "$GIT_COMMIT" == "0694755bb844e5b5a569b56ee5154232265ccfe6" ]; then
export GIT_AUTHOR_DATE="2017-07-24 22:43:54";
export GIT_COMMITTER_DATE="2017-07-24 22:43:54";
fi''
Bitte beachte, dass ich einige Fortschritte bei der es zu tun bekommen, wo es heißt "Schreibe 8cbb2 .... (1/25)". Das bedeutet, dass der Befehl tatsächlich ausgeführt wird, aber dann aus irgendeinem Grund fehlschlägt.
Side Kommentar : Es ist nicht notwendig, 're.compile' direkt aufzurufen; Alle Operationen an einem kompilierten Ausdruck können in einer Zeichenkette aufgerufen werden, z. B. 're' (Muster, Wiederholung, Zeichenkette, Anzahl = 0, Kennzeichen = 0). – torek