How to download single file from a git repository using python

吃可爱长大的小学妹 提交于 2021-02-07 13:30:19

问题


I want to download single file from my git repository using python.

Currently I am using gitpython lib. Git clone is working fine with below code but I don't want to download entire directory.

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")

回答1:


Don't think of a Git repo as a collection of files, but a collection of snapshots. Git doesn't allow you to select what files you download, but allows you to select how many snapshots you download:

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

will download all snapshots for all files, while

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

will only download the latest snapshot of all files. You will still download all files, but at least leave out all of their history.

Of these files you can simply select the one you want, and delete the rest:

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)



回答2:


You can also use subprocess in python:

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)

But your main problem remains still:

Git does not support downloading parts of the repository. You have to download all of it. But you should be able to do this with GitHub. Reference




回答3:


I don't want to flag this as a direct duplicate, since it does not fully reflect the scope of this question, but part of what Lucifer said in his answer seems the way to go, according to this SO post. In short, git does not allow for a partial download, but certain providers (like GitHub) do, via raw content.
That being said, Python does provide quite a number of different libraries to download, with the best-known being urllib.request.




回答4:


You need to request the raw version of the file! You can get it from raw.github.com



来源:https://stackoverflow.com/questions/51239168/how-to-download-single-file-from-a-git-repository-using-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!