web-dev-qa-db-ja.com

python)を使用してgitリポジトリから単一のファイルをダウンロードする方法

Pythonを使用してgitリポジトリから単一のファイルをダウンロードしたい。

現在、私はgitpythonlibを使用しています。 Gitクローンは以下のコードで正常に動作していますが、ディレクトリ全体をダウンロードしたくありません。

import os
from git import Repo
git_url = '[email protected]:/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
Ravi Ranjan

Pythonでsubprocessを使用することもできます。

import subprocess

args = ['git', 'clone', '--depth=1', '[email protected]:/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を使用してこれを実行できるはずです。 参照

2
Benyamin Jafari

Gitリポジトリをファイルのコレクションではなく、スナップショットのコレクションと考えてください。 Gitではダウンロードするファイルを選択できません ただし、ダウンロードするスナップショットの数は選択できます。

git clone [email protected]:/home2/git/stack.git

すべてのファイルのすべてのスナップショットをダウンロードしますが、

git clone --depth 1 [email protected]:/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('[email protected]:/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
Nils Werner

この質問の範囲を完全に反映していないため、これを直接の重複としてフラグを立てたくありませんが、 this SO post 。要するに、gitは部分的なダウンロードを許可していませんが、特定のプロバイダー(GitHubなど)は許可しています、生のコンテンツを介して。
そうは言っても、Pythonはダウンロードできるさまざまなライブラリを提供しますが、最もよく知られているのは rllib.request です。

0
dennlinger