Python-Methode zum Klonen eines Git-Repositorys

86

Gibt es eine Python-Methode, ohne einen Unterprozess zum Klonen eines Git-Repositorys zu verwenden? Ich bin bereit, alle von Ihnen empfohlenen Module zu verwenden.

Mike
quelle
3
gitpy, ich denke, es würde heißen
SilentGhost
@ SilentGhost: Du meinst diesen Trottel? github.com/vmalloc/gitpy von ryaari.com/blog/?p=9
VonC
Es sieht so aus, als gäbe es GitPython ( pypi.python.org/pypi/GitPython , gitorious.org/git-python ), von dem ich glaube, dass es keine Klonmethode gibt , aber ich wette, Sie könnten eine hinzufügen ... intern wird es so sein muss aber git clonetrotzdem anrufen .
Cascabel
1
[Dulwich] [1] ist eine reine Python-Implementierung von Git, die sich überhaupt nicht verzweigt. Beachten Sie, dass es sich noch in der Entwicklung befindet, sodass es möglicherweise fehlerhaft ist. [1]: samba.org/~jelmer/dulwich
Mark Lodato

Antworten:

57

Es gibt GitPython . Ich habe noch nie davon gehört und intern hängt es davon ab, dass die ausführbaren Git-Dateien irgendwo vorhanden sind. Außerdem könnten sie viele Fehler haben. Aber es könnte einen Versuch wert sein.

So klonen Sie :

import git
git.Git("/your/directory/to/clone").clone("git://gitorious.org/git-python/mainline.git")

(Es ist nicht schön und ich weiß nicht, ob es die unterstützte Methode ist, aber es hat funktioniert.)

Debilski
quelle
Es tut. Aber es ist ein bisschen verworren.
Debilski
1
Oh mein Gott, ich habe diese Möglichkeit verpasst. Mike, denk dran, intern ruft das sowieso nur die ausführbare Git-Datei auf. es schafft es nur ein wenig für dich.
Cascabel
Ich sah herrisch aus .. habe nur die Klonoption übersehen, da sie überhaupt nicht dokumentiert ist .. aber ich habe erwartet, was auch immer ich an eine Art Prozessbefehl gewöhnt bin .. das funktioniert danke!
Mike
Dieses Modul war wirklich hilfreich, danke. Können Sie mir helfen, wie ich mit diesem Modul den Hauptzweig des bereits geklonten
Repos ziehen kann
1
Wie gehe ich mit der Authentifizierung um, wenn sie automatisiert ausgeführt werden muss?
SunilS
133

Mit GitPython erhalten Sie eine gute Python-Oberfläche für Git.

Zum Beispiel können Sie nach der Installation von it ( pip install gitpython) zum Klonen eines neuen Repositorys die Funktion clone_from verwenden:

from git import Repo

Repo.clone_from(git_url, repo_dir)

Beispiele zur Verwendung des Repo-Objekts finden Sie im GitPython-Lernprogramm .

Hinweis: Für GitPython muss git auf dem System installiert sein und über den PATH des Systems zugänglich sein.

Amir Ali Akbari
quelle
Wie gehe ich mit der Authentifizierung um, wenn sie automatisiert ausgeführt werden muss?
SunilS
Sie können die Authentifizierung in der git_url bereitstellen. Je nachdem, von wo aus Sie das Repo klonen, müssen Sie möglicherweise den Benutzernamen und das Kennwort / pat dort eingeben. Siehe hier für Github
LemurPwned
20

Meine Lösung ist sehr einfach und unkompliziert. Es muss nicht einmal die Passphrase / das Passwort manuell eingegeben werden.

Hier ist mein vollständiger Code:

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
Manje
quelle
1
Funktioniert hervorragend. Wenn Sie jedoch andere relative Pfade in Ihrem Projekt verwenden, möchten Sie sich möglicherweise das wahre Arbeitsverzeichnis merken, os.getcwd()bevor Sie es ändern, os.chdir(...)und es anschließend zurücksetzen.
Maximosaic
@Maximosaic dies kann durch Verwendung vermieden werden git clone <repo_url> <target_path>. Keine Notwendigkeit zu verwendenchdir
Lahiru Chandima
9

Pygit2 , die libgit2- Bindung von Github , bietet einen Einzeiler , der ein Remote-Verzeichnis klont :

clone_repository(url, path, 
    bare=False, repository=None, remote=None, checkout_branch=None, callbacks=None)
Chiffa
quelle
7

Hier ist eine Möglichkeit, den Fortschritt beim Klonen eines Repos mit GitPython zu drucken

import time
import git
from git import RemoteProgress

class CloneProgress(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())
crizCraig
quelle
1
Hier sind einige Richtlinien für Wie schreibe ich eine gute Antwort? . Diese Antwort mag richtig sein, könnte aber von einer Erklärung profitieren. Nur-Code-Antworten gelten nicht als "gute" Antworten. Aus der Überprüfung .
Trenton McKinney
5

Für Python 3

Erstes Installationsmodul:

pip3 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

Mike Brian Olivera
quelle
3

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 über die Objekte und die Refs, aber es erstellt noch nicht den Inhalt des Arbeitsbaums, wenn Sie ein nicht nacktes Repository erstellen.

jelmer
quelle
3

Ziemlich einfache Methode ist es, nur die Creds in der URL zu übergeben, kann aber leicht verdächtig sein - mit Vorsicht 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 __name__ == '__main__':
    getRepo('https://github.com/UserName/RepoYouWant.git', {'username': 'userName', 'password': 'passWord'})
Haku-Kiro
quelle
1

Dies ist der Beispielcode für gitpull und gitpush mit dem 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 __name__ == '__main__':
   a = git_operation_push()
   git_operation_push.git_push_file('')
   git_operation_clone()
   git_operation_clone.git_clone('')
vk
quelle
1

Sie können dload verwenden

import dload
dload.git_clone("https://github.com/some_repo.git")

pip install dload
Pedro Lobito
quelle