दिलचस्प पोस्ट
Django में, मैं डेटाबेस से 100 यादृच्छिक रिकॉर्ड कैसे चुन सकता हूं? वेरिएबल के नाम से पहले स्टाइल, बजाय टाइप के बाद क्यों? पाठ बॉक्स से फ्लास्क में डेटा भेजें? PHP में टेक्स्ट डिफिफ की गणना करें jquery Event.stopPropagation () काम करने के लिए नहीं लगता है GDB में ब्रेकपॉइंट सेट करना जहां फ़ंक्शन देता है एक दिए गए रेखा के लिए जेएसहंट चेतावनी को दबाने का कोई तरीका क्या है? AngularJs में $ मार्गप्रदाता और $ राज्य प्रदाता के बीच क्या अंतर है यूनिकोडडेकोडएर्रर, अमान्य निरंतरता बाइट PHP: सत्र SUBDOMAIN पर खो गया दृश्य स्टूडियो के साथ जीसीसी? कैसे एंड्रॉइड डिवाइस पर वाईफाई को प्रोग्रामेटिक रूप से बंद करना है? पायथन फ्लास्क कैसे यूआरएल से पैरामीटर प्राप्त करें? सीमकेक में CMAKE_CXX_FLAGS_DEBUG और दोस्तों का डिफ़ॉल्ट मान बदलें सीपीपी मैक्रो में एक नई लाइन कैसे उत्पन्न करें?

पायथन जीआईटी मॉड्यूल अनुभव?

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

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

दूसरी चीजें जो मैं मुख्य रूप से दिलचस्पी रखते हैं, उनमें परिपक्वता और पुस्तकालय की पूर्णता, दोषों की उचित कमी, जारी विकास और दस्तावेज़ों और डेवलपर्स की सहायकता है I

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

Solutions Collecting From Web of "पायथन जीआईटी मॉड्यूल अनुभव?"

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

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 टूल पर आवरण है।

अद्यतन : मैं सिर्फ जीआईटी के लिए sh मॉड्यूल का उपयोग करने के लिए स्विच किया है, लेकिन अजगर में सबसे कमांडलाइन उपयोगिताओं की आवश्यकता है I ऊपर की प्रतिलिपि बनाने के लिए मैं इसे इसके बजाय करना होगा:

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

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

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

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

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

काम से ऊपर तीन मॉड्यूल प्राप्त करने की कोशिश में बिताए हुए (अधिक) कम समय में, मैं उप-प्रोसेस मॉड्यूल के जरिए काम करने वाला जीआईटी कमांड प्राप्त करने में कामयाब रहा हूं, उदा।

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

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

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

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

यह एक बहुत पुराना सवाल है, और जीआईटी पुस्तकालयों की खोज करते समय, मैंने पाया कि इसे इस साल (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() 

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

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

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

बदलते समय को दर्शाते हुए एक अद्यतन उत्तर:

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

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

यह कॉल:

 bash$ git checkout -b new_branch 

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

पीटीबीएनएल का उत्तर मेरे लिए बिल्कुल सही है मैं विंडोज़ प्रयोक्ता के लिए कुछ और बना देता हूं

 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) 

यहां "जीआईटी स्थिति" का वास्तव में त्वरित कार्यान्वयन है:

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

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

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

रिकार्ड के लिए, उपर्युक्त गिट पायथन पुस्तकालयों में से कोई भी एक "जीआईटी स्टेटस" समतुल्य नहीं है, जो वास्तव में केवल एक चीज है जो मैं चाहता हूं कि उपप्रोसेस के माध्यम से बाकी सभी जीआईटी कमांड के साथ काम करना आसान हो।