Gibt es eine Python-Methode, ohne einen Subprozess zu verwenden, um ein Git-Repository zu klonen? Ich kann beliebige Module verwenden, die Sie empfehlen.
Es gibt GitPython . Habe noch nie zuvor etwas davon gehört, und intern hängt es davon ab, dass die Git-Dateien irgendwo sind. Außerdem könnten sie viele Fehler haben. Aber es könnte einen Versuch wert sein.
Wie klonen :
import git
git.Git("/your/directory/to/clone").clone("git://gitorious.org/git-python/mainline.git")
(Es ist nicht nett und ich weiß nicht, ob es die unterstützte Methode ist, aber es hat funktioniert.)
Mit GitPython erhalten Sie eine gute Python-Schnittstelle zu Git.
Nach der Installation (pip install gitpython
) können Sie beispielsweise zum Klonen eines neuen Repositorys die Funktion clone_from verwenden:
from git import Repo
Repo.clone_from(git_url, repo_dir)
Im GitPython Tutorial finden Sie Beispiele zur Verwendung des Repo-Objekts.
Hinweis: GitPython erfordert, dass git auf dem System installiert ist und über PATH des Systems erreichbar ist.
Meine Lösung ist sehr einfach und unkompliziert. Es ist nicht einmal die manuelle Eingabe von Paraphrase/Passwort erforderlich.
Hier ist mein vollständiger Code: sys importieren import os
path = "/path/to/store/your/cloned/project"
clone = "git clone [email protected]<server_ip>:/your/project/name.git"
os.system("sshpass -p your_password ssh [email protected]_localhost")
os.chdir(path) # Specifying the path where the cloned project needs to be copied
os.system(clone) # Cloning
print "\n CLONED SUCCESSFULLY.! \n"
Mit Dulwich Tipp sollten Sie in der Lage sein:
from dulwich.repo import Repo
Repo("/path/to/source").clone("/path/to/target")
Dies ist immer noch sehr einfach - es kopiert die Objekte und die Referenzen, erstellt jedoch noch nicht den Inhalt der Arbeitsstruktur, wenn Sie ein nicht-bloßes Repository erstellen.
Dies ist der Beispielcode für gitpull und gitpush mit gitpython-Modul.
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('')
Ziemlich einfache Methode ist es, nur die Creds in der URL zu übergeben, kann aber leicht verdächtig sein - mit Vorsicht zu verwenden.
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'})
So drucken Sie den Fortschritt mit 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())
Für Python 3
Erstes Modul installieren:
pip install gitpython
und später, codiere es :)
import os
from git.repo.base import Repo
Repo.clone_from("https://github.com/*****", "folderToSave")
Ich hoffe das hilft dir