Pythonサブプロセスを使用せずにgitリポジトリのクローンを作成する方法はありますか?推奨する任意の種類のモジュールを使用できます。
GitPython を使用すると、優れたpython Gitへのインターフェースが得られます。
たとえば、インストール後(pip install gitpython
)、新しいリポジトリのクローンを作成するには、 clone_from 関数を使用できます。
from git import Repo
Repo.clone_from(git_url, repo_dir)
Repoオブジェクトの使用例については、 GitPythonチュートリアル をご覧ください。
注:GitPythonには、システムにgitをインストールし、システムのPATHからアクセスできることが必要です。
私のソリューションは非常にシンプルで簡単です。パスフレーズ/パスワードを手動で入力する必要もありません。
完全なコードは次のとおりです。
import sys
import os
path = "/path/to/store/your/cloned/project"
clone = "git clone gitolite@<server_ip>:/your/project/name.git"
os.system("sshpass -p your_password ssh user_name@your_localhost")
os.chdir(path) # Specifying the path where the cloned project needs to be copied
os.system(clone) # Cloning
python 3
最初のインストールモジュール:
pip install gitpython
以降、コーディングしてください:)
import os
from git.repo.base import Repo
Repo.clone_from("https://github.com/*****", "folderToSave")
これがあなたのお役に立てば幸いです
Dulwichのヒントを使用すると、次のことができるはずです。
from dulwich.repo import Repo
Repo("/path/to/source").clone("/path/to/target")
これはまだ非常に基本的なものです-オブジェクトとref全体にコピーしますが、非ベアリポジトリを作成した場合、作業ツリーのコンテンツはまだ作成されません。
これは、gitpythonモジュールを使用したgitpullおよびgitpushのサンプルコードです。
import os.path
from git import *
import git, os, shutil
# create local Repo/Folder
UPLOAD_FOLDER = "LocalPath/Folder"
if not os.path.exists(UPLOAD_FOLDER):
os.makedirs(UPLOAD_FOLDER)
print(UPLOAD_FOLDER)
new_path = os.path.join(UPLOADFOLDER)
DIR_NAME = new_path
REMOTE_URL = "GitURL" # if you already connected with server you dont need to give
any credential
# REMOTE_URL looks "[email protected]:path of Repo"
# code for clone
class git_operation_clone():
try:
def __init__(self):
self.DIR_NAME = DIR_NAME
self.REMOTE_URL = REMOTE_URL
def git_clone(self):
if os.path.isdir(DIR_NAME):
shutil.rmtree(DIR_NAME)
os.mkdir(DIR_NAME)
repo = git.Repo.init(DIR_NAME)
Origin = repo.create_remote('Origin', REMOTE_URL)
Origin.fetch()
Origin.pull(Origin.refs[0].remote_head)
except Exception as e:
print(str(e))
# code for Push
class git_operation_Push():
def git_Push_file(self):
try:
repo = Repo(DIR_NAME)
commit_message = 'work in progress'
# repo.index.add(u=True)
repo.git.add('--all')
repo.index.commit(commit_message)
Origin = repo.remote('Origin')
Origin.Push('master')
repo.git.add(update=True)
print("repo Push succesfully")
except Exception as e:
print(str(e))
if __== '__main__':
a = git_operation_Push()
git_operation_Push.git_Push_file('')
git_operation_clone()
git_operation_clone.git_clone('')
非常に簡単な方法は、URLで資格情報を渡すだけです。
import os
def getRepo(repo_url, login_object):
'''
Clones the passed repo to my staging dir
'''
path_append = r"stage\repo" # Can set this as an arg
os.chdir(path_append)
repo_moddedURL = 'https://' + login_object['username'] + ':' + login_object['password'] + '@github.com/UserName/RepoName.git'
os.system('git clone '+ repo_moddedURL)
print('Cloned!')
if __== '__main__':
getRepo('https://github.com/UserName/RepoYouWant.git', {'username': 'userName', 'password': 'passWord'})
GitPython で進捗状況を出力する方法を次に示します
import time
import git
from git import RemoteProgress
class CustomProgress(RemoteProgress):
def update(self, op_code, cur_count, max_count=None, message=''):
if message:
print(message)
print('Cloning into %s' % git_root)
git.Repo.clone_from('https://github.com/your-repo', '/your/repo/dir',
branch='master', progress=CloneProgress())