पायथन गिट मॉड्यूल के अनुभव? [बन्द है]


172

पायथन के लिए किसी भी Git मॉड्यूल के साथ लोगों के अनुभव क्या हैं? (मैं GitPython, PyGit और Dulwich के बारे में जानता हूं - यदि आप उनके बारे में जानते हैं तो दूसरों का उल्लेख करने के लिए स्वतंत्र महसूस करें।)

मैं एक प्रोग्राम लिख रहा हूं जिसमें Git रिपॉजिटरी के साथ बातचीत (ऐड, डिलीट, कमिट) करनी होगी, लेकिन Git के साथ कोई अनुभव नहीं है, इसलिए जिन चीजों को मैं देख रहा हूं उनमें से एक Git के संबंध में उपयोग / समझ में आसानी है।

अन्य चीजें जिनमें मुझे मुख्य रूप से दिलचस्पी है, वे हैं पुस्तकालय की परिपक्वता और पूर्णता, बग की एक उचित कमी, निरंतर विकास, और प्रलेखन और डेवलपर्स की सहायता।

यदि आप कुछ और सोचते हैं तो मैं जानना चाहता / चाहती हूँ, कृपया इसका उल्लेख करने में संकोच न करें।


25
क्या हम इस प्रश्न को एक सामुदायिक विकि में बदल सकते हैं? मुझे लगता है कि समय के साथ सबसे अच्छा जवाब बदल जाएगा।
13

4
@relet: जब तक यह बंद है इसे विकी नहीं बनाया जा सकता।
पीटीबीएनएल

जवाबों:


119

जबकि यह सवाल कुछ समय पहले पूछा गया था और मुझे उस समय पुस्तकालयों की स्थिति का पता नहीं है, यह खोजकर्ताओं के लिए ध्यान देने योग्य है कि GitPython कमांड लाइन टूल को सार करने का अच्छा काम करता है ताकि आपको उपयोग करने की आवश्यकता न हो उपप्रक्रिया। वहाँ कुछ उपयोगी हैं जो अमूर्त में निर्मित होते हैं जिनका आप उपयोग कर सकते हैं, लेकिन बाकी सभी चीज़ों के लिए आप निम्न कार्य कर सकते हैं:

import git
repo = git.Repo( '/home/me/repodir' )
print repo.git.status()
# checkout and track a remote branch
print repo.git.checkout( 'origin/somebranch', b='somebranch' )
# add a file
print repo.git.add( 'somefile' )
# commit
print repo.git.commit( m='my commit message' )
# now we are one commit ahead
print repo.git.status()

GitPython में बाकी सब कुछ बस नेविगेट करना आसान बनाता है। मैं इस पुस्तकालय से काफी संतुष्ट हूँ और इसकी सराहना करता हूँ कि यह अंतर्निहित गिट टूल्स पर एक आवरण है।

अद्यतन : मैं सिर्फ git के लिए नहीं, लेकिन सबसे अधिक कमांड उपयोगिताओं के लिए मुझे मॉड्यूल का उपयोग करने के लिए स्विच किया है जो मुझे अजगर में चाहिए। ऊपर दोहराने के लिए मैं इसके बजाय यह करूंगा:

import sh
git = sh.git.bake(_cwd='/home/me/repodir')
print git.status()
# checkout and track a remote branch
print git.checkout('-b', 'somebranch')
# add a file
print git.add('somefile')
# commit
print git.commit(m='my commit message')
# now we are one commit ahead
print git.status()

2
उत्कृष्ट लेगिट टूल GitPython का उपयोग करता है: github.com/kennethreitz/legit/blob/develop/legit/scm.py
forivall

9
इस जवाब के आधार पर, मैंने सिर्फ गिट-पाइथन के साथ अपनी किस्मत आजमाई। मुझे एपीआई से निपटने के लिए अजीब लगता है। अधिकांश समय आपको रिपॉजिट के लिए वापस आना पड़ता है। * सामान्य इंटरफ़ेस, और यहां तक ​​कि कई बार ठीक से काम नहीं करता है (जैसे repo.git.branch(b=somebranch)काम करता है लेकिन repo.git.branch(D=somebranch)तब से नहीं है जब कोई स्थान गायब है)। मुझे लगता है कि मैं खुद एक सबप्रोसेस-आधारित सामान्य फ़ंक्शन लागू करूँगा। मैं दुखी हूं, मुझे उच्च उम्मीदें थीं। : - /
क्रिस्टोफ

6
मैं अब के साथ sh मॉड्यूल का उपयोग करने के लिए बंद कर दिया है git = sh.git.bake(_cwd=repopath)। यह अजीब काम करता है।
underrun

10
sh से लिंक: amoffat.github.io/sh वास्तव में अजगर stdlib का हिस्सा होना चाहिए।
g33kz0r

4
नवीनतम अजगर श संस्करण विंडोज पर काम नहीं करता है। पूर्ण उच्चारण विफल।
void.pointer

81

मुझे लगा कि मैं अपने प्रश्न का उत्तर दूंगा, क्योंकि मैं उत्तर में सुझाए गए रास्ते से अलग हूं। बहरहाल, जवाब देने वालों का शुक्रिया।

सबसे पहले, GitPython, PyGit और Dulwich के साथ मेरे अनुभवों का संक्षिप्त सारांश:

  • GitPython : डाउनलोड करने के बाद, मुझे यह आयातित और उपयुक्त ऑब्जेक्ट इनिशियलाइज़ हो गया। हालांकि, ट्यूटोरियल में जो सुझाव दिया गया था, उसे करने की कोशिश करने से त्रुटियां हुईं। अधिक दस्तावेज़ीकरण खोने, मैं कहीं और बदल गया।
  • PyGit : यह आयात भी नहीं करेगा, और मुझे कोई दस्तावेज नहीं मिला।
  • डुलविच : सबसे होनहार लगता है (कम से कम जो मैं चाहता था और देखा के लिए)। मैंने इसके साथ कुछ प्रगति की, GitPython से अधिक, क्योंकि इसका अंडा पायथन स्रोत के साथ आता है। हालांकि, थोड़ी देर बाद, मैंने फैसला किया कि मैंने जो किया उसकी कोशिश करना आसान हो सकता है।

इसके अलावा, StGit दिलचस्प लग रहा है, लेकिन मुझे एक अलग मॉड्यूल में निकाले गए कार्यक्षमता की आवश्यकता होगी और इसके लिए अभी इंतजार नहीं करना होगा।

(मॉड्यूल) काम करने के लिए ऊपर दिए गए तीन मॉड्यूलों को प्राप्त करने में जितना समय मैंने खर्च किया उससे कम समय में, मैं सबप्रोडक्ट मॉड्यूल के माध्यम से काम करने के लिए git कमांड प्राप्त करने में कामयाब रहा, जैसे।

def gitAdd(fileName, repoDir):
    cmd = ['git', 'add', fileName]
    p = subprocess.Popen(cmd, cwd=repoDir)
    p.wait()

gitAdd('exampleFile.txt', '/usr/local/example_git_repo_dir')

यह पूरी तरह से मेरे कार्यक्रम में अभी तक शामिल नहीं है, लेकिन मैं एक समस्या की आशंका नहीं कर रहा हूं, शायद गति के अलावा (क्योंकि मैं सैकड़ों या हजारों फाइलों को कभी-कभी संसाधित करता हूं)।

हो सकता है कि मेरे पास सिर्फ ड्यूलविच या GitPython के साथ जाने के लिए धैर्य नहीं था। उस ने कहा, मुझे उम्मीद है कि मॉड्यूल अधिक विकास प्राप्त करेंगे और जल्द ही अधिक उपयोगी होंगे।


25
यह उत्तर पुराना हो रहा है।
एलेक्स चैम्बरलेन

3
हां, मुझे अपडेट में दिलचस्पी होगी।
जोसेफसैड

GitPython बहुत अच्छी तरह से काम करता है और बड़े पैमाने पर प्रलेखित है।
आर्थर

1
@ आर्थर मैं असहमत हूं, क्योंकि मैं स्टैकऑवरफ्लो और GitPython डॉक्यूमेंट में कम से कम 3 घंटे का समय लगा रहा हूं। इसका उपयोग करने के लिए एक रिमोट रेपो में जिट पुल, ऐड, कमिटमेंट और पुश की मूल बातें समझने के लिए। प्रलेखन में कुछ उन्नत उपयोग के मामले हैं, लेकिन बहुत बुनियादी कमी है। मैं मूल रूप से दे रहा हूं और उपप्रकार अस्वेल का उपयोग कर रहा हूं।
डैनियल लावेदीनियो डी लीमा

31

मैं pygit2 की सिफारिश करूँगा - यह उत्कृष्ट libgit2 बाइंडिंग का उपयोग करता है


1
यह गिट पाइपलाइन के लिए भी सबसे अच्छा उपयोग देता है।
पिलग्रिज्म

pygit2वास्तव में उपयोगी पुस्तकालय है, और मैं भविष्य में इसका विस्तार करने के लिए तत्पर हूं!
एलेक्स चैम्बरलेन

2
जैसा कि यह अब है, एक को मैन्युअल रूप से डाउनलोड करना होगा और दोनों के अर्ध-स्थिर संस्करणों को संकलित / संकलित करना होगा libgitऔर pygit2, GitHub से स्रोत लेना होगा। समस्या यह है कि, सिर की शाखाओं ने परीक्षण तोड़ दिए हैं, और नवीनतम "स्थिर" विफल स्थापना है ... विश्वसनीयता के लिए महत्वपूर्ण नहीं है और एक उपयुक्त समाधान नहीं है, तो आपको विभिन्न प्रकार के वातावरण में तैनात करने की आवश्यकता है ...:
मैक

1
यदि आप कभी भी ग्राहकों के साथ साइबरविन का उपयोग करने की योजना बनाते हैं तो इस संयोजन से दूर रहें। pygit2 libgit2 के लिए एक आवरण है और libgit2 ने सभी साइबर समर्थन को गिरा दिया है। देव की एक टिप्पणी मुझे मिली, "आप कोशिश कर सकते हैं, लेकिन यह एक चमत्कार हो सकता है अगर यह" सुंदर एपीआई का निर्माण करता है, हां, लेकिन मेरे आधे ग्राहक साइबर हैं इसलिए मैं इसका उपयोग नहीं कर सकता। शायद GitPython में जा रहे हैं।
स्कैडम

2
ध्यान दें कि वे साइबरविन का समर्थन नहीं करते हैं क्योंकि उनका ध्यान इसके बजाय देशी विंडोज समर्थन पर है । जब तक यह सही है कि libgit2 को cygwin पर समर्थित नहीं किया जाता है, इसका मतलब यह नहीं है कि Windows उपयोगकर्ताओं को ठंड में छोड़ दिया गया है।
Xiong Chiamiov

19

यह एक बहुत पुराना प्रश्न है, और गिट पुस्तकालयों की तलाश करते समय, मैंने पाया कि इस वर्ष (2013) में इसे गेटल कहा गया था

इसने मेरे लिए बहुत अच्छा काम किया (जहाँ मैंने दूसरों की कोशिश की थी कि वे परतदार थे), और अधिकांश सामान्य कार्यों को कवर करने के लिए लगता है।

README के ​​कुछ उदाहरण:

from gittle import Gittle

# Clone a repository
repo_path = '/tmp/gittle_bare'
repo_url = 'git://github.com/FriendCode/gittle.git'
repo = Gittle.clone(repo_url, repo_path)

# Stage multiple files
repo.stage(['other1.txt', 'other2.txt'])

# Do the commit
repo.commit(name="Samy Pesse", email="samy@friendco.de", message="This is a commit")

# Authentication with RSA private key
key_file = open('/Users/Me/keys/rsa/private_rsa')
repo.auth(pkey=key_file)

# Do push
repo.push()

2
मुझे यह पसंद नहीं है कि आप उन्हें सूचकांक में "जोड़ने" के बजाय "चरण" फाइल करें। आम / महत्वपूर्ण संचालन के नाम बदलने से ऐसा लगता है कि यह भ्रमित करने वाला होगा।
underrun

3
@underrun जोड़ने से चरण में फ़ाइलें जुड़ रही हैं। फाइल के मंचन के साथ भी ऐसा ही नहीं है?
जिमी केन

फ़ाइलों को जोड़ने के लिए फ़ाइलों को प्रतिबद्ध किया जा रहा है (यह उन्हें सूचकांक में जोड़ रहा है)। ऑपरेशन समान है, लेकिन कमांड लाइन पर आप टाइप करेंगे git add other1.txt other2.txtताकि यह अपेक्षा के अनुरूप न हो।
underrun

1
इस पैकेज की श्रेष्ठता पर सहमत हुए। मैं भी StaSh स्थापित करने के बाद Pythonista ऐप के भीतर इसका उपयोग करने में सक्षम हूं, जिसे इसके साथ पैक किया गया था। इसके अलावा, यह ध्यान देने योग्य है कि आपका उत्तर इस प्रश्न के उत्तर से हाल ही में अपडेट किया गया है।
क्रिस रेडफोर्ड

1
वास्तव में, यह मेरे लिए केवल पायथोनिस्टा पर काम करने लगता है । यह मेरे मैक पर एक निजी बिटबकैट रेपो के एक क्लोन को प्रमाणित करने के लिए पासवर्ड प्राप्त करना एक बुरा सपना था जिसे मैंने आखिरकार छोड़ दिया।
क्रिस रेडफोर्ड

17

शायद यह मदद करता है, लेकिन बाज़ार और मर्क्यूरियल दोनों अपने Git इंटरऑपरेबिलिटी के लिए डलविच का उपयोग कर रहे हैं।

ड्यूलविच शायद इस अर्थ में दूसरे से अलग है कि यह अजगर में गिट के पुन: कार्यान्वयन है। अन्य सिर्फ गिट के आदेशों के आसपास एक आवरण हो सकता है (इसलिए यह उच्च स्तर के दृष्टिकोण से उपयोग करने के लिए सरल हो सकता है: प्रतिबद्ध / जोड़ / हटाएं), इसका मतलब है कि शायद उनका एपीआई गिट की कमांड लाइन के बहुत करीब है, इसलिए आपको आवश्यकता होगी Git के साथ अनुभव प्राप्त करने के लिए।


बहुत उपयोगी उत्तर, मुझे नहीं पता था कि मर्क्यूरियल डुलविच का उपयोग करता है, धन्यवाद!
kissgyorgy

7

संपूर्णता की खातिर, http://github.com/alex/pyvcs/ सभी DVcs's के लिए एक अमूर्त परत है। यह ड्यूलविच का उपयोग करता है, लेकिन अन्य डीवीक्स के साथ इंटरोप प्रदान करता है।


7

परिवर्तित समय को दर्शाते हुए एक अद्यतन उत्तर:

GitPython वर्तमान में उपयोग करने में सबसे आसान है। यह कई git प्लंबिंग कमांड के रैपिंग का समर्थन करता है और इसमें प्लग करने योग्य ऑब्जेक्ट डेटाबेस (उनमें से एक होने के लिए ड्यूलविच) होता है, और यदि कोई कमांड लागू नहीं होता है, तो कमांड लाइन के लिए बाहर जाने के लिए एक आसान एपीआई प्रदान करता है। उदाहरण के लिए:

repo = Repo('.')
repo.checkout(b='new_branch')

यह कॉल करता है:

bash$ git checkout -b new_branch

डलविच भी अच्छा है लेकिन बहुत निचले स्तर पर है। इसका उपयोग करने के लिए कुछ हद तक दर्द होता है क्योंकि इसे नलसाजी स्तर पर गिट वस्तुओं पर काम करने की आवश्यकता होती है और इसमें अच्छा चीनी मिट्टी का बरतन नहीं होता है जिसे आप सामान्य रूप से करना चाहते हैं। हालाँकि, यदि आप git के किसी भी भाग को संशोधित करने की योजना बनाते हैं, या git-Rece-pack और git-upload-pack का उपयोग करते हैं, तो आपको dulwich का उपयोग करने की आवश्यकता है।


2

यहां "गिट स्थिति" का वास्तव में त्वरित कार्यान्वयन है:

import os
import string
from subprocess import *

repoDir = '/Users/foo/project'

def command(x):
    return str(Popen(x.split(' '), stdout=PIPE).communicate()[0])

def rm_empty(L): return [l for l in L if (l and l!="")]

def getUntracked():
    os.chdir(repoDir)
    status = command("git status")
    if "# Untracked files:" in status:
        untf = status.split("# Untracked files:")[1][1:].split("\n")
        return rm_empty([x[2:] for x in untf if string.strip(x) != "#" and x.startswith("#\t")])
    else:
        return []

def getNew():
    os.chdir(repoDir)
    status = command("git status").split("\n")
    return [x[14:] for x in status if x.startswith("#\tnew file:   ")]

def getModified():
    os.chdir(repoDir)
    status = command("git status").split("\n")
    return [x[14:] for x in status if x.startswith("#\tmodified:   ")]

print("Untracked:")
print( getUntracked() )
print("New:")
print( getNew() )
print("Modified:")
print( getModified() )

5
मैं पार्सिंग की सिफारिश नहीं git status
करूंगा

1
पार्स git status --shortकरना आसान होगा, और मुझे लगता है कि --shortआउटपुट में बदलाव की संभावना कम है।
बेन पेज

2
इसके लिए उपयोग git status --porcelainकरें--porcelain: Give the output in a stable, easy-to-parse format for scripts...
एस्टानी

या इससे भी बेहतर, के --zबजाय का उपयोग करें --porcelain। इसके विपरीत --porcelain, --zफ़ाइल नाम से बच नहीं जाता है।
वोजिस्लाव स्टोजकोविक 20

2

PTBNL का जवाब मेरे लिए काफी सही है। मैं विंडोज उपयोगकर्ता के लिए थोड़ा अधिक बनाता हूं।

import time
import subprocess
def gitAdd(fileName, repoDir):
    cmd = 'git add ' + fileName
    pipe = subprocess.Popen(cmd, shell=True, cwd=repoDir,stdout = subprocess.PIPE,stderr = subprocess.PIPE )
    (out, error) = pipe.communicate()
    print out,error
    pipe.wait()
    return 

def gitCommit(commitMessage, repoDir):
    cmd = 'git commit -am "%s"'%commitMessage
    pipe = subprocess.Popen(cmd, shell=True, cwd=repoDir,stdout = subprocess.PIPE,stderr = subprocess.PIPE )
    (out, error) = pipe.communicate()
    print out,error
    pipe.wait()
    return 
def gitPush(repoDir):
    cmd = 'git push '
    pipe = subprocess.Popen(cmd, shell=True, cwd=repoDir,stdout = subprocess.PIPE,stderr = subprocess.PIPE )
    (out, error) = pipe.communicate()
    pipe.wait()
    return 

temp=time.localtime(time.time())
uploaddate= str(temp[0])+'_'+str(temp[1])+'_'+str(temp[2])+'_'+str(temp[3])+'_'+str(temp[4])

repoDir='d:\\c_Billy\\vfat\\Programming\\Projector\\billyccm' # your git repository , windows your need to use double backslash for right directory.
gitAdd('.',repoDir )
gitCommit(uploaddate, repoDir)
gitPush(repoDir)

4
मुझे बहुत सारे कोड दोहराए गए हैं ...: p
Ciasto piekarz

0

StGit का git इंटरैक्शन लाइब्रेरी हिस्सा वास्तव में बहुत अच्छा है। हालाँकि, यह एक अलग पैकेज के रूप में नहीं टूटा है, लेकिन यदि पर्याप्त रुचि है, तो मुझे यकीन है कि इसे ठीक किया जा सकता है।

इसमें कमिट्स, ट्री आदि का प्रतिनिधित्व करने के लिए और नए कमिट और पेड़ बनाने के लिए बहुत अच्छा सार है।


-3

रिकॉर्ड के लिए, पूर्वोक्त Git Python पुस्तकालयों में से किसी में भी "git स्टेटस" समतुल्य नहीं है, जो कि वास्तव में केवल एक चीज है जो मैं चाहता हूँ कि उपप्रकार के माध्यम से बाकी git कमांड से निपटना इतना आसान है।


3
GitPython साथ: git.Repo (repoDir) .git.status ()
underrun
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.