अजगर एक क्लोन रिपॉजिटरी को क्लोन करने का तरीका


88

क्या गीथ भंडार को क्लोन करने के लिए एक उपप्रकार का उपयोग किए बिना एक पायथन तरीका है? मैं आपके द्वारा सुझाए गए किसी भी प्रकार के मॉड्यूल का उपयोग करने के लिए तैयार हूं।


3
gitpy, मुझे लगता है कि इसे बुलाया जाएगा
साइलेंटगॉस्ट

@SilentGhost: आप इस gitpy मतलब है ? github.com/vmalloc/gitpy से ryaari.com/blog/?p=9
VonC

ऐसा लगता है कि GitPython ( pypi.python.org/pypi/GitPython , gitorious.org/git-python ) है, जो मुझे नहीं लगता कि क्लोन विधि है, लेकिन मैं शर्त लगा सकता हूं कि आप एक ... आंतरिक रूप से यह करने जा रहे हैं git cloneवैसे भी कॉल करना है।
कैस्केबेल

1
[डुलविच] [1] गिट का शुद्ध-पायथन कार्यान्वयन है जो बिल्कुल भी कांटा नहीं करता है। ध्यान रखें कि यह अभी भी विकास के अधीन है, इसलिए यह छोटी गाड़ी हो सकती है। [1]: samba.org/~jelmer/dulwich
मार्क Lodato

जवाबों:


60

नहीं है GitPython । इसके बारे में पहले और आंतरिक रूप से नहीं सुना गया था, यह कहीं न कहीं जीआईटी निष्पादन योग्य होने पर निर्भर करता है; इसके अतिरिक्त, उनके पास बहुत सारे कीड़े हो सकते हैं। लेकिन यह एक कोशिश के काबिल हो सकता है।

क्लोन कैसे करें :

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

(यह अच्छा नहीं है और मुझे नहीं पता कि यह करने का समर्थन तरीका है, लेकिन यह काम किया।)


ऐसा होता है। लेकिन यह थोड़ा जटिल है।
देबिल्स्की

1
ओह, मेरा बुरा, मैं उस संभावना को याद किया। माइक, बस याद है, आंतरिक रूप से यह सिर्फ वैसे भी निष्पादन योग्य बुला रहा है; यह सिर्फ आपके लिए इसे थोड़ा प्रबंधित कर रहा है।
Cascabel

मैंने गौर से देखा .. बस क्लोन विकल्प को नजरअंदाज कर दिया क्योंकि इसके बिल्कुल भी दस्तावेज नहीं थे .. लेकिन मुझे उम्मीद थी कि जो भी मैं किसी प्रकार की प्रक्रिया कमांड का उपयोग करता था .. यह धन्यवाद काम करता है!
माइक

यह मॉड्यूल वास्तव में उपयोगी था, धन्यवाद। क्या आप इस मॉड्यूल का उपयोग करके पहले से क्लोन किए गए रेपो की मास्टर ब्रांच को खींचने में मेरी मदद कर सकते हैं
Gr8 Adakron

1
यदि स्वचालित तरीके से चलना है तो प्रमाणीकरण को कैसे संभालना है?
सुनीलएस

136

GitPython का उपयोग करने से आपको Git को एक अच्छा अजगर इंटरफ़ेस मिलेगा।

उदाहरण के लिए, इसे स्थापित करने के बाद ( pip install gitpython), एक नए रिपॉजिटरी को क्लोन करने के लिए आप clone_from फ़ंक्शन का उपयोग कर सकते हैं :

from git import Repo

Repo.clone_from(git_url, repo_dir)

रेपो ऑब्जेक्ट का उपयोग करने के उदाहरणों के लिए GitPython ट्यूटोरियल देखें ।

नोट: GitPython को सिस्टम पर स्थापित किया जा रहा है, और सिस्टम के PATH के माध्यम से पहुंच योग्य होना चाहिए।


यदि स्वचालित तरीके से चलना है तो प्रमाणीकरण को कैसे संभालना है?
सुनील्स

आप git_url में प्रमाणीकरण प्रदान कर सकते हैं, जहां से आप रेपो को क्लोन करते हैं, इसके आधार पर आपको उपयोगकर्ता नाम और पासवर्ड / पैट डालना पड़ सकता है। यहाँ देखें 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 इसका उपयोग करके बचा जा सकता है git clone <repo_url> <target_path>। उपयोग करने की आवश्यकता नहीं हैchdir
लाहिरु चंदिमा

केवल लिनक्स और मैक पर काम करते हैं। विंडोज़ पर काम नहीं कर रहा है
matan h

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
यहाँ मैं कैसे एक अच्छा जवाब लिखने के लिए कुछ दिशानिर्देश हैं ? । यह प्रदान किया गया उत्तर सही हो सकता है, लेकिन यह एक स्पष्टीकरण से लाभान्वित हो सकता है। कोड केवल उत्तरों को "अच्छा" उत्तर नहीं माना जाता है। से समीक्षा
ट्रेंटन मैककिनी

6

अजगर 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

सुंदर सरल विधि सिर्फ उर में क्रेडिट पास करना है, हालांकि थोड़ा संदेह हो सकता है - सावधानी के साथ उपयोग करें।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.