web-dev-qa-db-fra.com

Manière Python de cloner un dépôt git

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. 

52
Mike

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é.)

33
Debilski

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.

88
Amir Ali Akbari

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"
9
Manje

Le fichier libgit2 binding de Github, pygit2 fournit un one-liner clonant un répertoire distant: 

clone_repository(url, path, 
    bare=False, repository=None, remote=None, checkout_branch=None, callbacks=None)
6
chiffa

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.

1
jelmer

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('')
0
v.k

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'})
0
haku-kiro

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())
0
crizCraig

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

0