我正在尝试从git存储库获取该文件的特定版本。在包含repo的本地副本的文件夹中,我正在执行以下命令(使用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 :(得分:0)
您的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 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显示diff 1 ,但仅显示影响给定路径的更改”。如果要从特定树或提交中提取特定文件(“blob”),则语法为:
git show revspec:path
(注意修订说明符和路径之间的字面冒号:
。
1 如果指定的修订是普通提交,则这是常规差异;如果指定的修订是合并,则这是一个组合差异。