web-dev-qa-db-de.com

Python-Methode zum Klonen eines Git-Repositorys

Gibt es eine Python-Methode, ohne einen Subprozess zu verwenden, um ein Git-Repository zu klonen? Ich kann beliebige Module verwenden, die Sie empfehlen. 

52
Mike

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

33
Debilski

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.

88
Amir Ali Akbari

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

Die libgit2 - Bindung von Github, pygit2 , bietet einen Einzeiler, der ein entferntes Verzeichnis klont: 

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

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.

1
jelmer

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

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

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

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

0