Existe-t-il une méthode Python sans utiliser de sous-processus pour cloner un référentiel git? Je suis prêt à utiliser n'importe quel type de modules que vous recommandez.
Il y a GitPython . Nous n’en avons jamais entendu parler auparavant et en interne, il faut que les exécutables git se trouvent quelque part; En outre, ils pourraient avoir beaucoup de bugs. Mais cela pourrait valoir la peine d'essayer.
Comment cloner :
import git
git.Git("/your/directory/to/clone").clone("git://gitorious.org/git-python/mainline.git")
(Ce n’est pas Nice et je ne sais pas s’il s’agit de la méthode recommandée, mais cela a fonctionné.)
Utiliser GitPython vous donnera une bonne interface python avec Git.
Par exemple, après l’avoir installé (pip install gitpython
), vous pouvez utiliser clone_from function pour cloner un nouveau référentiel:
from git import Repo
Repo.clone_from(git_url, repo_dir)
Voir le GitPython Tutorial pour des exemples d'utilisation de l'objet Repo.
Note: GitPython nécessite que git soit installé sur le système et accessible via le chemin PATH du système.
Ma solution est très simple et directe. Il n'a même pas besoin de la saisie manuelle de paraphrase/mot de passe.
Voici mon code complet: système d'importation __ importation 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
print "\n CLONED SUCCESSFULLY.! \n"
Avec le conseil de Dulwich, vous devriez pouvoir faire:
from dulwich.repo import Repo
Repo("/path/to/source").clone("/path/to/target")
Ceci reste très basique - il copie à travers les objets et les références, mais il ne crée pas encore le contenu de l’arbre de travail si vous créez un référentiel non-nu.
C'est l'exemple de code pour gitpull et gitpush utilisant le module gitpython.
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('')
Une méthode assez simple consiste à simplement passer les caractères dans l'URL, mais peut être légèrement suspect - utilisez-le avec prudence.
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'})
Voici un moyen d'imprimer des progrès avec 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())
Pour python 3
Premier module d'installation:
pip install gitpython
et plus tard, le code :)
import os
from git.repo.base import Repo
Repo.clone_from("https://github.com/*****", "folderToSave")
J'espère que ceci vous aide