Git deposunu klonlamanın Python yolu


88

Git deposunu klonlamak için alt işlem kullanmadan bir Python yolu var mı? Tavsiye ettiğiniz her türlü modülü kullanmaya hazırım.


3
gitpy, sanırım çağrılacaktı
SilentGhost

@SilentGhost: Bu gitpy mi demek istiyorsun ? github.com/vmalloc/gitpy , ryaari.com/blog/?p=9
VonC

Görünüşe göre bir klon yöntemi olmadığını düşündüğüm GitPython ( pypi.python.org/pypi/GitPython , gitorious.org/git-python ) var, ama bahse girerim bir tane ekleyebilirsin ... dahili olarak git cloneyine de aramak zorunda .
Cascabel

1
[Dulwich] [1], Git'in hiç çatallanmayan saf bir Python uygulamasıdır. Hala geliştirme aşamasında olduğunun farkında olun, bu yüzden hatalı olabilir. [1]: samba.org/~jelmer/dulwich
Mark Lodato

Yanıtlar:


60

Orada GitPython . Bunu daha önce ve dahili olarak duymadım, git yürütülebilir dosyalarının bir yerde bulunmasına dayanıyor; ayrıca bol miktarda böcekleri olabilir. Ama denemeye değer olabilir.

Nasıl klonlanır :

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

(Bu hoş değil ve bunu yapmanın desteklenen bir yolu olup olmadığını bilmiyorum ama işe yaradı.)


Öyle. Ama biraz kıvrımlı.
Debilski

1
Oh, benim hatam, bu olasılığı kaçırdım. Mike, şunu unutma, dahili olarak bu zaten sadece git yürütülebilir dosyasını çağırıyor; sadece sizin için biraz idare ediyor.
Cascabel

Gitorious'a baktım .. sadece klon seçeneğini göz ardı ettim çünkü hiç belgelenmedi .. ama alıştığım her şeyi bir çeşit işlem komutuna bekliyordum .. bu çalışıyor teşekkürler!
Mike

Bu modül çok yardımcı oldu, teşekkürler. Bu modülü kullanarak zaten klonlanmış
deponun

1
Otomatik bir şekilde çalışması gerekiyorsa kimlik doğrulama nasıl yapılır?
SunilS

136

GitPython'u kullanmak size Git için iyi bir python arayüzü sağlayacaktır.

Örneğin, ( pip install gitpython) yükledikten sonra , yeni bir depoyu klonlamak için clone_from işlevini kullanabilirsiniz :

from git import Repo

Repo.clone_from(git_url, repo_dir)

Repo nesnesini kullanma örnekleri için GitPython Eğitimine bakın .

Not: GitPython, git'in sisteme yüklenmesini ve sistemin PATH aracılığıyla erişilebilir olmasını gerektirir.


Otomatik bir şekilde çalışması gerekiyorsa kimlik doğrulama nasıl yapılır?
SunilS

Doğrulamayı git_url'de sağlayabilirsiniz, depoyu nereden klonladığınıza bağlı olarak, oraya kullanıcı adı ve şifre / pat girmeniz gerekebilir. Github
LemurPwned

20

Benim çözümüm çok basit ve anlaşılır. Parola / parolanın manuel olarak girilmesine bile gerek yoktur.

İşte tam kodum:

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

1
Harika çalışıyor, ancak projenizde diğer göreceli yolları kullanırsanız, os.getcwd()ile değiştirmeden önce gerçek çalışma dizinini hatırlamak ve os.chdir(...)daha sonra yeniden sıfırlamak isteyebilirsiniz .
Maximosaic

@Maximosaic kullanılarak bu önlenebilir git clone <repo_url> <target_path>. chdir
Kullanmaya

sadece linux ve mac üzerinde çalışın. Windows üzerinde çalışmıyor
matan h

9

Github en libgit2 bağlama, pygit2 uzak dizin klonlama tek kılıfı sağlamaktadır:

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

8

GitPython ile bir depoyu klonlarken ilerlemeyi yazdırmanın bir yolu

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

1
İşte nasıl iyi bir cevap yazabilirim? . Verilen bu cevap doğru olabilir, ancak bir açıklamadan faydalanabilir. Yalnızca kod yanıtları "iyi" yanıtlar olarak kabul edilmez. Gönderen inceleme .
Trenton McKinney

6

Python 3 için

İlk yükleme modülü:

pip3 install gitpython

ve daha sonra kodlayın :)

import os
from git.repo.base import Repo
Repo.clone_from("https://github.com/*****", "folderToSave")

umarım bu sana yardımcı olur


4

Dulwich ipucu ile şunları yapabilmeniz gerekir:

from dulwich.repo import Repo
Repo("/path/to/source").clone("/path/to/target")

Bu hala çok basit - nesneler ve referanslar arasında kopyalar, ancak çıplak olmayan bir depo oluşturursanız henüz çalışma ağacının içeriğini oluşturmaz.


3

Oldukça basit bir yöntem, kredileri url'de iletmektir, yine de biraz şüpheli olabilir - dikkatli kullanın.

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'})

1

Bu, gitpython modülünü kullanan gitpull ve gitpush için örnek koddur.

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('')

1

Dload kullanabilirsiniz

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

pip install dload
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.