【问题标题】:How to download single file from a git repository using python如何使用 python 从 git 存储库中下载单个文件
【发布时间】:2018-12-16 18:16:05
【问题描述】:

我想使用 python 从我的 git 存储库中下载单个文件。

目前我正在使用gitpython lib。 Git clone 在下面的代码中运行良好,但我不想下载整个目录。

import os
from git import Repo
git_url = 'stack@127.0.1.7:/home2/git/stack.git'
repo_dir = '/root/gitrepo/'
if __name__ == "__main__":
    Repo.clone_from(git_url, repo_dir, branch='master', bare=True)
    print("OK")

【问题讨论】:

  • 什么样的文件?哪个操作系统?文件路径?
  • @ShashankSingh:任何 c 或 cpp 源文件,在 Windows 操作系统上,路径:- master/code/repo/

标签: python python-3.x git gitpython


【解决方案1】:

你也可以在python中使用subprocess

import subprocess

args = ['git', 'clone', '--depth=1', 'stack@127.0.1.7:/home2/git/stack.git']
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, _error = res.communicate()

if not _error:
    print(output)
else:
    print(_error)

但是,您的主要问题仍然存在。

Git 不支持下载存储库的部分内容。您必须下载所有内容。但是你应该可以使用 GitHub 来做到这一点。 Reference

【讨论】:

    【解决方案2】:

    不要将 Git 存储库视为文件的集合,而是快照的集合。 Git doesn't allow you to select what files you download,但允许您选择下载的快照数量:

    git clone stack@127.0.1.7:/home2/git/stack.git
    

    将下载所有文件的所有快照,同时

    git clone --depth 1 stack@127.0.1.7:/home2/git/stack.git
    

    只会下载所有文件的最新快照。您仍然会下载所有文件,但至少会忽略它们的所有历史记录。

    在这些文件中,您只需选择您想要的一个,然后删除其余的:

    import os
    import git
    import shutil
    import tempfile
    
    # Create temporary dir
    t = tempfile.mkdtemp()
    # Clone into temporary dir
    git.Repo.clone_from('stack@127.0.1.7:/home2/git/stack.git', t, branch='master', depth=1)
    # Copy desired file from temporary dir
    shutil.move(os.path.join(t, 'setup.py'), '.')
    # Remove temporary dir
    shutil.rmtree(t)
    

    【讨论】:

    • 它是快照的集合,而不是变更集。在某种意义上这无关紧要,但在另一些意义上它确实如此,而且由于 Git 让实现展示(闪耀?)通过,所以在使用 Git 时它很重要。
    • 好的,我改了措辞
    • 有没有什么git命令可以不带脚本下载单个文件?
    • 没有。甚至命令 git archive --remote(在 gitpython 中不可用)也需要解压缩输出。
    • Git 确实不会让你这样做,但 Github 和 Bitbucket 可以。见stackoverflow.com/a/4605068/733092
    【解决方案3】:

    我不想将此标记为直接重复,因为它不能完全反映这个问题的范围,但根据this SO post,路西法在他的回答中所说的部分内容似乎是要走的路。简而言之,git 不允许部分下载,但某些提供者(如 GitHub)允许通过原始内容下载。
    话虽如此,Python 确实提供了许多不同的库可供下载,其中最著名的是 urllib.request

    【讨论】:

      【解决方案4】:

      您需要请求文件的原始版本!你可以从 raw.github.com 获得它

      【讨论】:

      • 我猜,他从来没有说过github。
      • 我不好,我还以为是github
      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2013-11-16
      • 2017-08-17
      • 1970-01-01
      • 2019-02-03
      • 2021-07-20
      • 1970-01-01
      相关资源
      最近更新 更多