Dieses Codefragment funktioniert auf den meisten Unix-Versionen, auf die ich Zugriff habe (Linux, Solaris, AIX) sowie auf Windows 7 / Server 2008 R2 und höher, mit denen ich die Ausgabe von git log abgerufen habe:
from subprocess import Popen, PIPE
import platform
cmd = ["git", "--no-pager"]
if platform.system() == "Windows":
cmd.append("--work-tree=/path/to/working/copy")
cmd.extend(["log", "--pretty=format:"%cd %h"", "--date=short", "--", "/path/to/working/copy/filename/to/check"])
proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
proc.wait()
f = proc.stdout
some_stuff = f.read()
f.close()
Bei Windows XP mit msysgit bekomme ich jedoch keinen Wert für die some_stuff - Variable, was seltsam ist, da der generierte Befehl in der Befehlszeile unter Windows ausgeführt wird.
Irgendwelche Tipps, was soll ich hier machen?
Antworten:
0 für die Antwort № 1Nach einigen Nachforschungen habe ich Folgendes gefunden:
- Unter Windows empfiehlt msysgit die Verwendung des Wrapper-Skripts
git.cmd
anstatt direkt zu spezifizierengit.exe
. - msysgit ist besonders empfindlich für normalisierte Pfaddateinamen, insbesondere muss der Laufwerksbuchstabe in Großbuchstaben angegeben werden, und die Groß- / Kleinschreibung der Dateinamen muss mit dem der Dateinamen übereinstimmen GetLongPathName würde ausgeben.
- Die Verwendung von Vorwärts- und Rückwärtsschritten als Pfadtrennzeichen scheint immer noch zu funktionieren.
Durch das Testen der oben genannten scheint es so
- Es ist nicht nötig, das genau anzugeben
--work-tree
Option mehr - Pfadnamen "normalisieren" durch Übergeben an
os.path.normpath()
funktioniert nicht, da die Groß- / Kleinschreibung nicht berücksichtigt wird und der Laufwerkbuchstabe in Kleinbuchstaben geändert wird. - Verwenden Sie den kurzen Pfadnamen (die Ausgabe von GetShortPathName) wird nicht funktionieren.