git 저장소를 복제하는 Python 방법


88

하위 프로세스를 사용하지 않고 git 저장소를 복제하지 않는 Python 방법이 있습니까? 나는 당신이 추천하는 모든 종류의 모듈을 사용하고 있습니다.


3
gitpy, 나는 그것이 호출 될 것이라고 생각한다
— SilentGhost

@SilentGhost : 이 gitpy 를 의미 합니까? ryaari.com/blog/?p=9 의 github.com/vmalloc/gitpy
— VonC

이 GitPython (의 외모처럼 pypi.python.org/pypi/GitPython , gitorious.org/git-python 내가 복제 방법이 있다고 생각하지 않습니다)하지만 내부적으로는거야 ... 당신이 하나를 추가 할 수 겠지 git clone어쨌든 전화해야합니다 .
— Cascabel

1
[Dulwich] [1]은 전혀 포크하지 않는 Git의 순수 Python 구현입니다. 아직 개발 중이므로 버그가있을 수 있습니다. [1] : samba.org/~jelmer/dulwich
— Mark Lodato

답변:


60

이 GitPython은 . 이전과 내부적으로 들어 보지 못했지만 어딘가에 git 실행 파일을 가지고 있어야합니다. 또한 많은 버그가있을 수 있습니다. 그러나 시도해 볼 가치가 있습니다.

복제 방법 :

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

(좋지 않고 지원되는 방법인지 모르겠지만 작동했습니다.)


그렇습니다. 그러나 그것은 약간 복잡합니다.
— Debilski

1
오, 안타깝 네요. 그 가능성을 놓쳤습니다. Mike, 기억하세요. 내부적으로 이것은 어쨌든 git 실행 파일을 호출하는 것입니다. 그것은 당신을 위해 그것을 조금 관리하는 것입니다.
— Cascabel

나는 엄청난 것을 보았다 .. 그것은 전혀 문서화되지 않았기 때문에 복제 옵션을 간과했다. 그러나 나는 내가 어떤 종류의 프로세스 명령에 익숙했던 것을 기대했다 .. 이것은 감사한다!
— Mike

이 모듈은 정말 도움이되었습니다. 감사합니다. 어떻게이 모듈을 사용하여 이미 복제의 repo의 마스터 분기를 당겨하는 데 도움이 수
— GR8 Adakron을

1
자동화 된 방식으로 실행해야하는 경우 인증을 처리하는 방법은 무엇입니까?
— SunilS

136

GitPython 을 사용하면 Git에 대한 좋은 파이썬 인터페이스를 얻을 수 있습니다.

예를 들어 설치 후 ( pip install gitpython) 새 저장소를 복제하려면 clone_from 함수를 사용할 수 있습니다 .

from git import Repo

Repo.clone_from(git_url, repo_dir)

Repo 객체 사용에 대한 예제 는 GitPython 자습서 를 참조하십시오 .

참고 : GitPython은 시스템에 git이 설치되어 있어야하며 시스템의 PATH를 통해 액세스 할 수 있어야합니다.


자동화 된 방식으로 실행해야하는 경우 인증을 처리하는 방법은 무엇입니까?
— SunilS

저장소를 복제하는 위치에 따라 git_url에 인증을 제공 할 수 있습니다. 여기에 사용자 이름과 비밀번호 / pat를 입력해야 할 수도 있습니다. 여기에 대한 참조 Github에서
— LemurPwned

20

내 솔루션은 매우 간단하고 간단합니다. 암호 / 암호를 수동으로 입력 할 필요조차 없습니다.

내 완전한 코드는 다음과 같습니다.

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
훌륭하게 작동하지만 프로젝트에서 다른 상대 경로를 사용하는 경우 os.getcwd()변경하기 전에 실제 작업 디렉토리를 기억하고 os.chdir(...)나중에 다시 재설정하는 것이 좋습니다.
— Maximosaic

@Maximosaic을 사용하여 피할 수 있습니다 git clone <repo_url> <target_path>. 사용할 필요가 없습니다chdir
— Lahiru Chandima

Linux 및 Mac에서만 작동합니다. 창문에서 작동하지 않음
— matan h dec

9

Github의 libgit2 바인딩 인 pygit2 는 원격 디렉토리를 한 줄로 복제하는 기능을 제공합니다.

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

8

GitPython 으로 리포지토리 를 복제하는 동안 진행 상황을 인쇄하는 방법은 다음과 같습니다.

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
다음은 좋은 답변을 작성하는 방법에 대한 몇 가지 지침입니다 . . 이 답변은 정확할 수 있지만 설명을 통해 도움이 될 수 있습니다. 코드 전용 답변은 "좋은"답변으로 간주되지 않습니다. 에서 검토 .
— Trenton McKinney

6

Python 3의 경우

첫 번째 설치 모듈 :

pip3 install gitpython

나중에 코딩하십시오 :)

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

도움이 되었기를 바랍니다.


4

덜 리치 팁을 사용하면 다음을 수행 할 수 있습니다.

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

이것은 여전히 ​​매우 기본적입니다. 객체와 참조를 통해 복사하지만 베어가 아닌 저장소를 생성하는 경우 작업 트리의 내용을 아직 생성하지 않습니다.


3

아주 간단한 방법은 url에 creds를 전달하는 것입니다.하지만 약간 의심 스러울 수 있습니다.주의해서 사용하세요.

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

gitpython 모듈을 사용하는 gitpull 및 gitpush의 샘플 코드입니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.