gitリポジトリを複製するPythonの方法


83

サブプロセスを使用せずにgitリポジトリのクローンを作成するPythonの方法はありますか?私はあなたが推薦するあらゆる種類のモジュールを使用するつもりです。


3
gitpy、私はそれが呼ばれると思います
SilentGhost 2010年

@SilentGhost:あなたはこのgitpyを意味ますか?github.com/vmalloc/gitpyからryaari.com/blog/?p=9
VonC

GitPython(ありますように見えますpypi.python.org/pypi/GitPythongitorious.org/git-python内部でそれが起こっている...私はcloneメソッドを持っているとは思わないが、私はあなたが1を追加することができます賭けます)git cloneとにかく電話する必要があります。
カスカベル2010年

1
[Dulwich] [1]は、Gitの純粋なPython実装であり、フォークはまったくありません。まだ開発中であるため、バグがある可能性があることに注意してください。[1]:samba.org/~jelmer/dulwich
Mark Lodato 2010年

回答:


57

GitPythonがあります。これまでも内部的にも聞いたことがないので、どこかにgit実行可能ファイルがあることに依存しています。さらに、彼らはたくさんのバグを持っているかもしれません。しかし、試してみる価値はあります。

クローン作成する方法:

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

(それは良くありません、そしてそれがそれをするためにサポートされた方法であるかどうか私は知りません、しかしそれは働きました。)


します。しかし、それは少し複雑です。
debilski 2010年

1
ああ、私の悪い、私はその可能性を逃した。マイク、覚えておいてください。内部的には、これはとにかくgit実行可能ファイルを呼び出すだけです。それはあなたのためにそれを少し管理しているだけです。
カスカベル2010年

私はgitoriousを見ました..クローンオプションがまったく文書化されていないので見落としていました..しかし、ある種のプロセスコマンドに慣れているものは何でも期待していました..これはおかげで動作します!
マイク

このモジュールは本当に役に立ちました、ありがとう。このモジュールを使用して、すでに複製されたリポジトリのマスターブランチをプルする方法を教えてください
Gr8Adakron19年

1
自動化された方法で実行する必要がある場合、認証を処理する方法は?
SunilS

130

GitPythonを使用すると、Gitへの優れたPythonインターフェイスが提供されます。

たとえば、インストール後(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

18

私の解決策は非常にシンプルで簡単です。パスフレーズ/パスワードを手動で入力する必要もありません。

これが私の完全なコードです:

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 2018年

9

Githubのlibgit2バインディングであるpygit2は、リモートディレクトリのクローンを作成するワンライナーを提供します。

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

7

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
ここではいくつかのためのガイドラインです、私は良い答えを書くにはどうすればよいですか?。この提供された答えは正しいかもしれませんが、それは説明から利益を得るかもしれません。コードのみの回答は「良い」回答とは見なされません。レビューから。
トレントンマッキニー

5

Python3の場合

最初のインストールモジュール:

pip3 install gitpython

そして後で、それをコーディングします:)

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

これがお役に立てば幸いです


3

Dulwichチップを使用すると、次のことができるようになります。

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

これはまだ非常に基本的です。オブジェクトと参照をコピーしますが、ベア以外のリポジトリを作成した場合、作業ツリーのコンテンツはまだ作成されません。


3

非常に簡単な方法は、URLにクレジットを渡すことですが、少し疑わしい場合があります。注意して使用してください。

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.