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.
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.
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?
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
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
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")
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.
Ziemlich einfache Methode ist es, nur die Creds in der URL zu übergeben, kann aber leicht verdächtig sein - mit Vorsicht verwenden.
import os
defgetRepo(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'})
git clone
trotzdem anrufen .Antworten:
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.)
quelle
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.
quelle
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
quelle
os.getcwd()
bevor Sie es ändern,os.chdir(...)
und es anschließend zurücksetzen.git clone <repo_url> <target_path>
. Keine Notwendigkeit zu verwendenchdir
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)
quelle
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())
quelle
Für Python 3
Erstes Installationsmodul:
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
quelle
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.
quelle
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'})
quelle
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('')
quelle
Sie können dload verwenden
import dload dload.git_clone("https://github.com/some_repo.git")
quelle