如何使用python从git存储库下载单个文件

时间:2018-07-09 06:12:28

标签: python python-3.x git gitpython

我想使用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")

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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 :(得分:0)

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

答案 3 :(得分:-2)

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

获取它