পাইথন গিট মডিউল অভিজ্ঞতা? [বন্ধ]


172

পাইথনের কোনও গিট মডিউল নিয়ে মানুষের অভিজ্ঞতা কী? (আমি গিপ পাইথন, পাইজিট এবং ডুলউইচ সম্পর্কে জানি - আপনি যদি তাদের সম্পর্কে জানেন তবে নির্দ্বিধায় অন্যের কথা উল্লেখ করুন))

আমি একটি প্রোগ্রাম লিখছি যা গিট সংগ্রহস্থলের সাথে ইন্টারঅ্যাক্ট করতে হবে (যোগ করতে, মুছে ফেলতে, প্রতিশ্রুতিবদ্ধ), তবে গিটের সাথে কোনও অভিজ্ঞতা নেই, তাই আমি যে জিনিসগুলির সন্ধান করছি তার একটি হ'ল গীটের প্রতি শ্রদ্ধা সহ সহজ ব্যবহার।

অন্যান্য জিনিসগুলির মধ্যে যা আমি প্রাথমিকভাবে আগ্রহী সেগুলি হ'ল লাইব্রেরির পরিপক্কতা এবং সম্পূর্ণতা, বাগের যুক্তিসঙ্গত অভাব, অবিচ্ছিন্ন বিকাশ এবং ডকুমেন্টেশন এবং বিকাশকারীদের সহায়তা।

আপনি যদি অন্য কিছু সম্পর্কে ভাবতে চান তবে আমার এটি জানতে / প্রয়োজন হতে পারে তবে দয়া করে এটি নির্দ্বিধায় উল্লেখ করুন।


25
আমরা কি এই প্রশ্নটিকে একটি সম্প্রদায়ের উইকিতে পরিণত করতে পারি? আমি মনে করি সময়ের সাথে উত্তরের উত্তরটি বদলে যাবে।
8:25

4
@ রিলেট: যতক্ষণ না এটি বন্ধ থাকে ততক্ষণ এটি উইকি তৈরি করা যায় না।
পিটিবিএনএল

উত্তর:


119

এই প্রশ্নটি যখন কিছুক্ষণ আগে জিজ্ঞাসা করা হয়েছিল এবং আমি সেই সময়ে গ্রন্থাগারগুলির অবস্থা জানি না, তবুও এটি অনুসন্ধানকারীদের জন্য উল্লেখযোগ্য যে গিটপাইথন কমান্ড লাইন সরঞ্জামগুলি বিমূর্ত করার জন্য একটি ভাল কাজ করে যাতে আপনার ব্যবহারের প্রয়োজন হয় না subprocess। বিমূর্ততাগুলিতে ব্যবহার করা যেতে পারে এমন কয়েকটি দরকারী রয়েছে যা আপনি ব্যবহার করতে পারেন তবে সমস্ত কিছুর জন্য আপনি এই জাতীয় জিনিসগুলি করতে পারেন:

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

গিটপাইথনের অন্য সব কিছুই চলাচল করা সহজ করে তোলে। আমি এই লাইব্রেরিতে মোটামুটিভাবে সন্তুষ্ট এবং প্রশংসা করি যে এটি অন্তর্নিহিত গিট সরঞ্জামগুলির একটি মোড়ক।

আপডেট : আমি কেবল গিট নয়, পাইথনের বেশিরভাগ কমান্ডলাইন ইউটিলিটিগুলির জন্য sh মডিউলটি ব্যবহার করতে শুরু করেছি। উপরের প্রতিলিপি করতে আমি এর পরিবর্তে এটি করব:

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 এ ফিরে যেতে হয় general * সাধারণ ইন্টারফেস, এবং এমনকি এটি সময়ে সময়ে সঠিকভাবে কাজ করে না (যেমন repo.git.branch(b=somebranch)কাজ করে তবে repo.git.branch(D=somebranch)একটি স্থান নিখোঁজ হওয়ার পরে না)। আমার ধারণা আমি নিজে একটি সাবপ্রসেস-ভিত্তিক সাধারণ ফাংশন বাস্তবায়ন করব। আমি দুঃখিত, আমার উচ্চ আশা ছিল high : - /
ক্রিস্টফ

6
আমি এখন sh মডিউলটি ব্যবহার করে স্যুইচ করেছি git = sh.git.bake(_cwd=repopath)। এটি দুর্দান্তভাবে কাজ করে।
underrun

10
sh এর সাথে লিঙ্ক করুন: amoffat.github.io/sh সত্যিই পাইথন স্টাডলিবের অংশ হওয়া উচিত।
g33kz0r

4
সর্বশেষ পাইথন শ ভার্সন উইন্ডোজে কাজ করে না। সম্পূর্ণ সম্পূর্ণ ব্যর্থ।
void.pointer

81

আমি ভেবেছিলাম আমি আমার নিজের প্রশ্নের উত্তর দেব, কারণ আমি উত্তরগুলির পরামর্শের চেয়ে আলাদা পথ নিচ্ছি। যাইহোক, যারা উত্তর দিয়েছেন তাদের জন্য ধন্যবাদ।

প্রথমত, গিপ পাইথন, পাইজিট এবং ডুলভিচের সাথে আমার অভিজ্ঞতার সংক্ষিপ্তসার:

  • গিটপিথন : ডাউনলোড করার পরে, আমি এটি আমদানি করে এবং যথাযথ অবজেক্টটি আরম্ভ করেছি। তবে, টিউটোরিয়ালে যা প্রস্তাবিত হয়েছিল তা করার চেষ্টা করলে ত্রুটি হয়েছিল। আরও নথিপত্রের অভাব, আমি অন্যত্র ঘুরেছি turned
  • পাইগিট : এটি আমদানিও করতে পারে না এবং আমি কোনও ডকুমেন্টেশনও পাইনি।
  • ডুলউইচ : সর্বাধিক প্রতিশ্রুতিবদ্ধ বলে মনে হচ্ছে (কমপক্ষে আমি যা চেয়েছিলাম এবং দেখেছি তার জন্য)। গিটপিথনের চেয়ে আমি এর সাথে কিছুটা অগ্রগতি করেছি, কারণ এর ডিম পাইথনের উত্স নিয়ে আসে। যাইহোক, কিছুক্ষণ পরে, আমি স্থির করেছি যে আমি যা করেছি তা চেষ্টা করা সহজ easier

এছাড়াও, স্টজিটটি আকর্ষণীয় দেখায়, তবে আমার পৃথক মডিউলে সরানো কার্যকারিতাটি প্রয়োজন এবং এখনই এটি হওয়ার জন্য অপেক্ষা করতে চাই না।

উপরের তিনটি মডিউলটি কাজ করার চেষ্টা করার চেয়ে (অনেক বেশি) কম সময়ে আমি উপ-প্রসেস মডিউলটির মাধ্যমে গিট কমান্ডগুলি পেতে সক্ষম হয়েছি, যেমন

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

এটি এখনও আমার প্রোগ্রামে সম্পূর্ণরূপে সংহত হয়নি, তবে আমি সম্ভবত গতি ব্যতীত (যেহেতু আমি কয়েকশো বা এমনকি কয়েক হাজার ফাইলের প্রসেস করবো) বাদে কোনও সমস্যার প্রত্যাশা করছি না।

ডুলউইচ বা গিটপিথনের সাথে জিনিসগুলি নিয়ে যাওয়ার জন্য আমার কেবল ধৈর্য ছিল না। এটি বলেছিল, আমি আশাবাদী মডিউলগুলি আরও বিকাশ লাভ করবে এবং শীঘ্রই আরও কার্যকর হবে।


25
এই উত্তর পুরানো হয়।
অ্যালেক্স চেম্বারলাইন

3
হ্যাঁ, আমি একটি আপডেটে আগ্রহী হব।
জোসেফআসাদ

গিটপিথন খুব ভাল কাজ করে এবং এটি ব্যাপকভাবে নথিভুক্ত।
আর্থার

1
@ আর্থার আমি দ্বিমত পোষণ করছি, যেহেতু আমি গিট পুলের বেসিকগুলি বুঝতে, যুক্ত করতে, প্রতিশ্রুতিবদ্ধ করতে এবং এটি ব্যবহার করে একটি রিমোট রেপোতে ধাক্কা দেওয়ার জন্য স্ট্যাকওভারফ্লো এবং গিটপাইথন ডকুমেন্টেশনে অন্তত 3 ঘন্টা। ডকুমেন্টেশনে কিছু উন্নত ব্যবহারের কেস রয়েছে, তবে খুব মৌলিক অভাব রয়েছে। আমি মূলত ছেড়ে দিচ্ছি এবং পাশাপাশি সাবপ্রসেস ব্যবহার করছি।
ড্যানিয়েল লাভেডনিও ডি লিমা

31

আমি পাইজিট 2 সুপারিশ করব - এটি দুর্দান্ত লিবিগিট 2 বাইন্ডিং ব্যবহার করে


1
এটি গিট নদীর গভীরতানির্ণয়কেও সেরা অ্যাক্সেস দেয়।
পাইলগ্রিজম

pygit2সত্যিই দরকারী লাইব্রেরি, এবং আমি এটি ভবিষ্যতে প্রসারণের অপেক্ষায় রয়েছি!
অ্যালেক্স চেম্বারলাইন

2
এটা এখন হয়, এক ম্যানুয়ালি ডাউনলোড হবে এবং উভয়ের কম্পাইল / সেটআপ আধা স্থিতিশীল সংস্করণ libgitএবং pygit2, GitHub থেকে উৎস গ্রহণ। সমস্যাটি হ'ল, প্রধান শাখাগুলি পরীক্ষাগুলি ভাঙা হয়েছে এবং সর্বশেষ "স্থিতিশীল" ব্যর্থ ইনস্টলেশন ... নির্ভরযোগ্যতা গুরুত্বপূর্ণ হলে আপনাকে উপযুক্ত সমাধান নয় এবং আপনাকে বিভিন্ন পরিবেশে স্থাপন করা প্রয়োজন ... :(
ম্যাক

1
আপনি যদি কখনও সাইগউইন ব্যবহার করে ক্লায়েন্টদের পরিকল্পনা করেন তবে এই সমন্বয় থেকে দূরে থাকুন stay পাইজিট 2 হ'ল লিবিগিত 2-র একটি মোড়ক এবং লিগজিট 2 সমস্ত সাইগউইন সমর্থন বাদ দিয়েছে। দেবের একজনের কাছ থেকে আমি যে মন্তব্য পেয়েছি, "আপনি চেষ্টা করতে পারেন তবে এটি একটি অলৌকিক বিষয় যদি এটি" সুন্দর এপিআই তৈরি করে তবে হ্যাঁ, তবে আমার অর্ধ ক্লায়েন্ট সাইগউইন তাই আমি এটি ব্যবহার করতে পারি না। সম্ভবত গিটপাইথনে যাচ্ছেন।
scphantm

2
মনে রাখবেন যে তারা সাইগউইনকে সমর্থন করে না কারণ তাদের ফোকাসটি এর পরিবর্তে দেশীয় উইন্ডোজ সমর্থনকে কেন্দ্র করে । সুতরাং যখন এটি ঠিক আছে যে সাইবউইনে লিবিজিট 2 সমর্থিত নয়, এর অর্থ এই নয় যে উইন্ডোজ ব্যবহারকারীরা শীতকালে বাদ পড়েছেন।
জিয়াং চিয়ামিয়াভ

19

এটি একটি পুরানো প্রশ্ন, এবং গিট গ্রন্থাগারগুলির সন্ধান করার সময়, আমি একটি পেয়েছি যা এই বছর তৈরি হয়েছিল (2013) গিটল নামে ।

এটি আমার পক্ষে দুর্দান্ত কাজ করেছে (যেখানে আমি চেষ্টা করেছি অন্যেরা ঝাপটায় ছিল) এবং বেশিরভাগ সাধারণ ক্রিয়াকলাপকে coverেকে রাখে বলে মনে হয়।

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
@undrun যোগ করা মঞ্চে ফাইল যুক্ত করা হয়। স্টেজিং ফাইলগুলির সাথে কি এটি একই নয়?
জিমি কেন

ফাইলগুলি যুক্ত করা প্রতিশ্রুতিবদ্ধ হওয়ার জন্য ফাইলগুলি মঞ্চায়ন করছে (এটি তাদের সূচীতে যুক্ত করছে)। অপারেশনটি একই তবে কমান্ড লাইনে আপনি টাইপ করবেন git add other1.txt other2.txtতাই এটি কী প্রত্যাশা করা হবে তা অনুসরণ করে না।
6'14 15-22 এ underrun

1
এই প্যাকেজের শ্রেষ্ঠত্বের সাথে একমত এমনকি এটি স্ট্যাশ ইনস্টল করার পরে পাইথনিস্তা অ্যাপের মধ্যে এটি ব্যবহার করতে সক্ষম হয়েছি যা এটি প্যাকেজযুক্ত ছিল। এছাড়াও, এটি লক্ষণীয় যে আপনার প্রশ্নের উত্তর এই প্রশ্নের উত্তরগুলির মধ্যে সম্প্রতি আপডেট হয়েছে।
ক্রিস রেডফোর্ড

1
আসলে, মনে হচ্ছে এটি পাইথনিস্টায় কেবল আমার জন্য কাজ করবে। পাসওয়ার্ডে এটি পাওয়া আমার ম্যাকের একটি প্রাইভেট বিটবাকেট রেপোর ক্লোনটিকে প্রমাণীকরণ করা একটি দুঃস্বপ্ন যা আমি অবশেষে ছেড়ে দিয়েছি।
ক্রিস রেডফোর্ড

17

হতে পারে এটি সাহায্য করে, তবে বাজার এবং মারকুরিয়াল উভয়ই তাদের গিট আন্তঃব্যবযোগিতার জন্য ডুলউইচ ব্যবহার করছে।

ডুলউইচ সম্ভবত এই দিক থেকে অন্যটির চেয়ে পৃথক যে এটি পাইথনের গিটার পুনর্নির্মাণ। অন্যটি কেবল গিটের কমান্ডগুলির চারপাশে একটি মোড়ক হতে পারে (সুতরাং এটি একটি উচ্চ স্তরের দৃষ্টিকোণ থেকে ব্যবহার করা সহজ হতে পারে: কমিট / অ্যাড / ডিলিট), সম্ভবত এটির অর্থ তাদের এপিআই গিটের কমান্ড লাইনের খুব কাছাকাছি তাই আপনার প্রয়োজন হবে means গিটের সাথে অভিজ্ঞতা অর্জন করা।


খুব দরকারী উত্তর, আমি জানি না যে মার্চুরিয়াল ডুলউইচ ব্যবহার করে, আপনাকে ধন্যবাদ!
কিসিজিরজি


7

পরিবর্তিত সময়গুলি প্রতিফলিত করে একটি আপডেট উত্তর:

গিটপিথন বর্তমানে ব্যবহার করা সবচেয়ে সহজ। এটি অনেকগুলি গিট নদীর গভীরতানির্ণয় কমান্ড মোড়কে সমর্থন করে এবং প্ল্যাগেবল অবজেক্ট ডাটাবেস (ডুলউইচ যার মধ্যে একটি হ'ল) ​​এবং যদি কোনও কমান্ড প্রয়োগ না করা হয় তবে কমান্ড লাইনে শেলিংয়ের জন্য একটি সহজ এপিআই সরবরাহ করে। উদাহরণ স্বরূপ:

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

এটি কল:

bash$ git checkout -b new_branch

ডুলউইচও ভাল তবে অনেকটা নিম্ন স্তরের। এটি ব্যবহারে কিছুটা ব্যথা হওয়ার কারণ এটির জন্য নদীর গভীরতানির্ণয় স্তরের গিট অবজেক্টগুলিতে পরিচালনা করা দরকার এবং এমন সাধারণ চীনামাটির বাসন নেই যা আপনি সাধারণত করতে চান। তবে, আপনি যদি গিটের কোনও অংশ সংশোধন করার পরিকল্পনা করেন, বা গিট-রিসিভ-প্যাক এবং গিট-আপলোড-প্যাক ব্যবহার করেন, আপনার ডুলউইচ ব্যবহার করা দরকার।


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ফাইলের নামগুলি এড়ায় না।
ভোজিসলাভ স্টোজকোভিক

2

পিটিবিএনএলের উত্তর আমার পক্ষে বেশ নিখুঁত। আমি উইন্ডোজ ব্যবহারকারীর জন্য কিছুটা আরও তৈরি করি।

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
আমি কোডের প্রচুর পুনরাবৃত্তিটি দেখতে পাচ্ছি ...: পি
সিয়াস্তো পাইকার্জ

0

StGit এর গিটার ইন্টারঅ্যাকশন লাইব্রেরির অংশটি আসলে বেশ ভাল। তবে এটি আলাদা প্যাকেজ হিসাবে বিচ্ছিন্ন নয় তবে পর্যাপ্ত আগ্রহ থাকলে আমি নিশ্চিত যে এটি স্থির করা যাবে।

কমিট, গাছ ইত্যাদির প্রতিনিধিত্ব করার জন্য এবং নতুন কমিট এবং গাছ তৈরি করার জন্য এটির খুব সুন্দর বিমূর্ততা রয়েছে।


-3

রেকর্ডের জন্য, উল্লিখিত গিট পাইথন লাইব্রেরিতে কোনওটিই "গিট স্ট্যাটাস" সমতুল্য বলে মনে হচ্ছে না, যা সাবপ্রসেসের মাধ্যমে বাকী গিট কমান্ডগুলির সাথে কাজ করা এত সহজ যেহেতু আমি কেবল এটিই চাই।


3
গিটপাইথন সহ: git.Repo (repoDir) .git.status ()
20:43
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.