2017-07-24 6 views
1

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.

+0

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

Antwort

0

Ich vermute, das Problem ist in "--env-filter \\\n". Ich denke, dass der Befehl nur

self.git.repo.git.filter_branch("-f", "--env-filter", cmd) 
+0

Ich bekomme Fortschritte dabei. Jetzt sehe ich '' fi ': Befehl nicht gefunden' Fehler. Irgendwelche Ideen? – alexandernst

+0

Ich habe eine zweite Antwort hinzugefügt. – phd

0

sein sollte, denke ich auch subprocess (tief in GitPython verwendet), um diese

tpl = """ 
    if test $GIT_COMMIT = "%s"; then 
     export GIT_AUTHOR_DATE="%s" 
     export GIT_COMMITTER_DATE="%s" 
    fi 
""" 

eine Zeile machen. So müssen Sie bash Syntax für den Fall gibt es keine Zeilenumbrüche korrigieren:

tpl = """ 
    if test $GIT_COMMIT = "%s"; then 
     export GIT_AUTHOR_DATE="%s"; 
     export GIT_COMMITTER_DATE="%s"; 
    fi 
""" 

(fügen ; anstelle von Zeilenumbrüchen).

+0

Ich bekomme immer noch 'fi: command not found'. Mein Bauchgefühl sagt mir, dass da eine falsche Bash-Syntax (oder was auch immer der Interpreter 'Subprozess' benutzt) drin ist, aber ich kann es nicht erkennen. – alexandernst

+0

Bitte überprüfen Sie meine Bearbeitung. – alexandernst

1

Ich konnte dies in meinem eigenen Projekt mit subprocess und die Bash-Syntax, die Sie in Ihrem Update haben (mit Semikolons und eckigen Klammern) lösen.

Vielleicht ist es nur die .strip() auf meiner mehrzeiligen Zeichenfolge, die es behoben? Hier

ist der Roh-Code:

from subprocess import Popen, PIPE 

def set_commit_date(repo_dir: str, commit: str, new_date: str): 
    command = [ 
     '/usr/bin/git', 'filter-branch', '--env-filter', 
     f""" 
     if [ $GIT_COMMIT = {commit} ]; 
     then 
      export GIT_AUTHOR_DATE="{new_date}"; 
      export GIT_COMMITTER_DATE="{new_date}"; 
     fi 
     """.strip() 
    ] 
    process = Popen(command, cwd=repo_dir, stdout=PIPE, stderr=PIPE) 

    result, error = process.communicate() 
    if error: 
     raise Exception(error.decode()) 

    print(result.decode()) 
    print(repo_dir) 
    print(commit) 
    print(new_date) 

Als ich dies gegen eine Dummy-Repo in meinen Unit-Tests laufen bekomme ich folgende Ausgabe (Erfolg) aus den folgenden argumenten:

Rewrite 1f05fc01ffc790f5a32a918a0149f5096b5edaac (1/1) (0 seconds passed, remaining 0 predicted)  
Ref 'refs/heads/master' was rewritten 

/tmp/tmp7zzep_dz/testrepo 

1f05fc01ffc790f5a32a918a0149f5096b5edaac 

Sun, 03 Sep 2017 00:00:00 -0400