2015-10-24 93 views
2

我想從git倉庫獲取該文件的特定版本。在包含(使用Python腳本)我執行以下命令回購的本地副本的文件夾:無法從git倉庫使用Python獲取特定文件版本

subprocess.call("C:\Program Files\Git\bin\git.exe show 34f97c9 folder\file.py > D:\file.py") 

可悲的是我得到的是:

fatal: >: no such path in the working tree. 
Use 'git <command> -- <path>...' to specify paths that do not exist locally. 

當我直接嘗試gitbash相同的命令(顯然沒有git補丁)它工作得很好。

請問您有什麼建議嗎?

回答

0

subprocess.call調用有幾個誤區:

  • 默認爲shell=False,這意味着該命令沒有傳遞到外殼,但>重定向是一個shell功能,而不是內置到Python。例如,您可以使用subprocess.stdout=subprocess.PIPE捕獲輸出,或者您可以使用os級別的例程創建文件並傳遞文件描述符,或者打開流並通過其fileno;或者當然你可以設置shell=True
  • 使用shell=False,您應該自行分解參數,例如subprocess.call(["command", "arg1", "arg22"])subprocess.call("command arg1 arg2".split())。當然,shell=True不需要這個,因爲shell會這樣做。 (我認爲用單個字符串的形式無論如何都適用於Windows,否則你會得到不同的錯誤,並且當然在Unix/Linux上C:...不能很好地工作,所以也許這可以忽略。)
  • 通常,字符串文字中的反斜槓是轉義字符。在這裏,你在你的例子顯示的字符串文字包括退格鍵和兩個形提要:

    >>> print("C:\Program Files\Git\bin\git.exe show 34f97c9 folder\file.py > D:\file.py"") 
    C:\Program Files\Giin\git.exe show 34f97c9 folder 
                   ile.py > D: 
                      ile.py 
    >>> 
    

    你可能想在這裏原始字符串,或者你可以雙擊你所有的反斜線。

同時,你的git命令是有效的,但可能並不意味着什麼,你想要它的意思是:

git show revspec path1 [... pathN] 

意味着「顯示DIFF 對於給定的revspec,但只顯示修改影響給定路徑「。如果你想提取特定的樹中的特定文件(「BLOB」)或承諾,語法是:

git show revspec:path 

(筆記的版本說明符和路徑之間的字面結腸:)。


這是一個常規的diff如果指定的修訂是一個普通的提交,或組合的差異,如果指定的修訂是合併。

+0

非常感謝!修復blackslashes並將shell參數設置爲True幫助:) – Arxas