当前位置: 代码迷 >> python >> 无法使用Python从git存储库获取特定文件版本
  详细解决方案

无法使用Python从git存储库获取特定文件版本

热度:15   发布时间:2023-06-16 10:08:51.0

我正在尝试从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),它工作得很好。

请问您一个建议吗?

您的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如果指定的修订是普通提交,则这是常规差异,如果指定的修订是合并,则这是组合差异。