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.
git clone
trotzdem anrufen .
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.
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.)
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.
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
os.getcwd()
bevor Sie es ändern, os.chdir(...)
und es anschließend zurücksetzen.
git clone <repo_url> <target_path>
. Keine Notwendigkeit zu verwendenchdir
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())
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
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.
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'})
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 "git@github.com: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('')
Sie können dload verwenden
import dload
dload.git_clone("https://github.com/some_repo.git")
pip install dload