问题描述
我正在尝试从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 patch),它工作得很好。
请问您一个建议吗?
1楼
您的subprocess.call
调用有几个错误:
-
默认值为
shell=False
,这意味着命令不会传递给shell,但是>
重定向是shell的功能,不是Python内置的。 您可以使用例如subprocess.stdout=subprocess.PIPE
捕获输出,或者可以使用os级例程创建文件并传递文件描述符,或者打开流并传递其fileno
; 或者当然可以设置shell=True
。 -
使用
shell=False
,您应该自己分解参数,例如subprocess.call(["command", "arg1", "arg22"])
或subprocess.call(["command", "arg1", "arg22"])
subprocess.call("command arg1 arg2".split())
。 当然,如果shell=True
则不需要这样做,因为shell会这样做。 (我认为带有单个字符串的表单无论如何都可以在Windows上运行,否则您将遇到其他错误,当然C:...
在Unix / Linux上不能很好地工作,因此也许可以忽略不计。) 通常,字符串文字中的反斜杠是转义符。 您在示例中显示的字符串文字包括一个退格键和两个换页符:
>>> 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]
意思是“显示给定revspec的差异1 ,但仅显示影响给定路径的更改”。 如果要从特定树或提交中提取特定文件(“ blob”),则语法为:
git show revspec:path
(注意文字冒号:
在修订说明符和路径之间)。
1如果指定的修订是普通提交,则这是常规差异,如果指定的修订是合并,则这是组合差异。