کار با GitPython

گردآوری و تالیف : ارسطو عباسی
تاریخ انتشار : 05 آبان 1397
دسته بندی ها : پایتون

GitPython نام یک کتابخانه پایتون است که به صورت برنامه‌ریزی شده می‌تواند محتویات داخل مخازن مربوط به سورس کنترل گیت را بخواند و در آن نیز بنویسد. 

در این مطلب قصد داریم به شما شیوه نصب کردن و استفاده صحیح از این کتابخانه را به صورت سریع یاد بدهیم. 

ابزارهای ما

برای این آموزش می توانید از پایتون نسخه ۲ و یا ۳ استفاده کنید، اما پیشنهاد ما این است که سراغ نسخه ۳ آن بروید. من در این آموزش از پایتون نسخه ۳.۶ استفاده می‌کنم. جدای از پایتون در این آموزش از سه ابزار دیگر نیز استفاده می‌شود که در زیر می‌توانید آن‌ها را مشاهده نمایید:

  • Git, a source (version) control implementation, version 2.15.1
  • GitPython version 2.1.7
  • pip and virtualenv

تمام کدهای گفته شده در این مطلب را می‌توانید براساس لایسنس MIT در گیت‌هاب دریافت کنید.

نصب GitPython

کارمان را با ساخت یک Virtual Environment شروع می‌کنیم. من یک Virtualenv را با نام gitpy ایجاد می‌کنم. البته این نام کاملا اختیاری است و می‌توان از هر نامه دیگری استفاده کرد.

python3 -m venv gitpy

حال با استفاده از دستور زیر Virtualenv را فعال کنید:

source gitpy/bin/activate

بعد از اینکار حال باید نام Virtualenv را در قسمت خط فرمان مشاهده کنید:

حال بعد از آنکه virtualenv را فعال کردیم نیاز است که با استفاده از دستور pip بسته GitPython را اجرا کنیم.

pip install gitpython==2.1.7

دستور pip را اجرا کرده و بعد از آن می‌توانید پیامی مبنی بر موفقیت آمیز بودن این پکیج را دریافت کنید:

(gitpy) $ pip install gitpython==2.1.7

Collecting gitpython==2.1.7

  Downloading GitPython-2.1.7-py2.py3-none-any.whl (446kB)

    100% |████████████████████████████████| 450kB 651kB/s 

Collecting gitdb2>=2.0.0 (from gitpython==2.1.7)

  Downloading gitdb2-2.0.3-py2.py3-none-any.whl (63kB)

    100% |████████████████████████████████| 71kB 947kB/s 

Collecting smmap2>=2.0.0 (from gitdb2>=2.0.0->gitpython==2.1.7)

  Downloading smmap2-2.0.3-py2.py3-none-any.whl

Installing collected packages: smmap2, gitdb2, gitpython

Successfully installed gitdb2-2.0.3 gitpython-2.1.7 smmap2-2.0.3

حال می‌توانیم به صورت برنامه‌نویسی شده با مخازن گیت ارتباط برقرار کنیم. این کار را از طریق یک اپلیکیشن پایتونی انجام می‌دهیم.

کلون کردن مخزن

GitPython می‌تواند با مخازن ریموت به خوبی کار بکند اما برای اینکه این مطلب را ساده‌تر نگه داریم، یک کلون از مخزن مورد نظرمان را وارد سیستم خودمان می کنیم. 

می‌توانید از هر پروژه‌ای که دوست دارید کلون بگیرید. اگر یک مورد منحصر به فرد را به یاد ندارید می‌توانید از پروژه open source Full Stack Python Git repository کلون بگیرید:

git clone git@github.com:mattmakai/fullstackpython.com fsp

مکانی که پروژه را در آن کلون می‌کنید به خاطر بسپارید، به این دلیل که در زمان کار با GitPython به آن نیاز داریم. حال به دایرکتوری جدید fsp بروید تا بتوانید با گیت تعامل داشته باشید. برای اینکه ببینید در چه مسیری قرار گرفته‌اید دستور pwd را انتخاب کنید. 

cd fsp

pwd

مسیری که در خروجی به شما می‌دهد مسیری اصلی برای مخزن گیت‌تان است:

export GIT_REPO_PATH='/Users/matt/devel/py/fsp' # make sure this your own path

حال با نوشتن دستور بالا ما اجازه آن را پیدا کردیم که بتوانیم کدهای پایتونی‌مان را با استفاده از GitPython برای دسترسی به گیت بنویسیم. 

خواندن مخزن و کامیت کردن

یک فایل جدید پایتونی با نام read_repo.py ایجاد کنید و آن را در کد ادیتوری که دوست دارید باز کنید.

کد زیر را در آن قرار دهید:

import os

from git import Repo

COMMITS_TO_PRINT = ۵

ماژول os قابلیت خواندن متغیرهای محیطی یا همان environment variable را به ما می‌دهد، هچنین می‌توانیم کارهایی را مانند ساخت دایرکتوری و... را در محیط سیستم عامل انجام دهیم. From git import Repo به اپلیکیشن‌من قابلیت دسترسی به GitPython را می‌دهد. وقتی بخواهیم شئ Repo خود را بسازیم این موضوع بسیار کاربردی خواهد بود برای‌مان. COMMITS_TO_PRINT یک ثابت است که تعداد خط‌های خروجی را براساس کامیت‌های مربوط به اسکریپت محدود می‌کند. Full Stack Python بیشتر از ۲۲۵۰ کامیت را شامل می‌شود که اگر بخواهیم خروجی را بررسی بکنیم باید تعداد بسیار زیادی کامیت را چاپ کنیم. به همین دلیل باید آن را محدود کنیم.

در داخل فایل read_repo.py یک تابع را ایجاد کرده و هر کدام از کامیت‌ها را به صورت جداگانه چاپ کنید:

def print_commit(commit):

    print('----')

    print(str(commit.hexsha))

    print("\"{}\" by {} ({})".format(commit.summary,

                                     commit.author.name,

                                     commit.author.email))

    print(str(commit.authored_datetime))

    print(str("count: {} and size: {}".format(commit.count(),

                                              commit.size)))

تابع print_commit یک شئ commit را از GitPython دریافت کرده و ابتدا هش SHA ۴۰ کاراکتری را چاپ می‌کند. بعد از آن سراغ چاپ کردن اطلاعات زیر می‌رود:

  1. the commit summary
  2. author name
  3. author email
  4. commit date and time
  5. count and update size

در زیر تابع print_commit یک تابع دیگر را با نام print_repository برای نمایش اطلاعات مربوط به شئ Repo ایجاد کنید:

def print_repository(repo):

    print('Repo description: {}'.format(repo.description))

    print('Repo active branch is {}'.format(repo.active_branch))

    for remote in repo.remotes:

        print('Remote named "{}" with URL "{}"'.format(remote, remote.url))

    print('Last commit for repo is {}.'.format(str(repo.head.commit.hexsha)))

print_repository کاری تقریبا مشابه با print_commit را انجام می‌هد، اما بجای پرینت کردن اطلاعات مربوط به مخزن، برنچ و تمام URLهای پیکربندی شده برای گیت ریموت شده را نمایش می‌دهد. 

در نهایت ما برای فراخوانی کردن اسکریپت از طریق ترمینال به یک تابع main نیاز داریم.

if __name__ == "__main__":

    repo_path = os.getenv('GIT_REPO_PATH')

    # Repo object used to programmatically interact with Git repositories

    repo = Repo(repo_path)

    # check that the repository loaded correctly

    if not repo.bare:

        print('Repo at {} successfully loaded.'.format(repo_path))

        print_repository(repo)

        # create list of commits then print some of them to stdout

        commits = list(repo.iter_commits('master'))[:COMMITS_TO_PRINT]

        for commit in commits:

            print_commit(commit)

            pass

    else:

        print('Could not load repository at {} :('.format(repo_path))

تابع main دریافت متغیر محیطی GIT_REPO_PATH را مدیریت می‌کند و بعد از آن براساس path در صورت امکان یک شئ Repo ایجاد می‌کند. 

اگر مخزن شما خالی نباشد بنابراین می‌تواند یک مخزن را پیدا کند و توابع را به درستی اجرا نماید.

اگر شما می‌خواهید که کدهای بالا را به صورت یکجا داشته باشید می‌توانید به این لینک از گیت‌هاب مراجعه نمایید. 

حال زمان آن است که پروژه‌مان را تست کنیم. برای اینکار کافی‌ست اسکریپت read_repo.py را اجرا نمایید:

python read_repo.py

اگر virtualenv به خوبی فعال شده باشد و متغیر محیطی GIT_REPO_PAH نیز به درستی ست شده باشد، در نهایت شما می‌توانید خروجی زیر را مشاهده کنید:

Repo at ~/devel/py/fsp/ successfully loaded.

Repo description: Unnamed repository; edit this file 'description' to name the repository.

Repo active branch is master

Remote named "origin" with URL "git@github.com:mattmakai/fullstackpython.com"

Last commit for repo is 1fa2de70aeb2ea64315f69991ccada51afac1ced.

----

1fa2de70aeb2ea64315f69991ccada51afac1ced

"update latest blog post with code" by Matt Makai (matthew.makai@gmail.com)

2017-11-30 17:15:14-05:00

count: 2256 and size: 254

----

1b026e4268d3ee1bd55f1979e9c397ca99bb5864

"new blog post, just needs completed code section" by Matt Makai (matthew.makai@gmail.com)

2017-11-30 09:00:06-05:00

count: 2255 and size: 269

----

2136d845de6f332505c3df38efcfd4c7d84a45e2

"change previous email newsletters list style" by Matt Makai (matthew.makai@gmail.com)

2017-11-20 11:44:13-05:00

count: 2254 and size: 265

----

9df077a50027d9314edba7e4cbff6bb05c433257

"ensure picture sizes are reasonable" by Matt Makai (matthew.makai@gmail.com)

2017-11-14 13:29:39-05:00

count: 2253 and size: 256

----

3f6458c80b15f58a6e6c85a46d06ade72242c572

"add databases logos to relational databases pagem" by Matt Makai (matthew.makai@gmail.com)

2017-11-14 13:28:02-05:00

count: 2252 and size: 270

خروجی که شما در این قسمت مشاهده می‌کنید کاملا براساس آخرین ۵ کامنتی است که من در مخزن گیت‌هاب اضافه کرده‌ام. 

در پایان

تنها کاری که در این مقاله ساده انجام دادیم کلون کردن یک مخزن گیت و استفاده کردن از کتابخانه GitPython برای مطالعه داده‌های مربوط به مخزن و کامیت ‌ها بود. 

GitPython می‌تواند کارهای بسیار دیگری را نیز انجام دهد – با استفاده از این کتابخانه می‌توانید مخازن گیت را ایجاد کنید و همچنین در آن‌ها بنویسید. با مطالعه مستندات این کتابخانه در این لینک می‌توانید اطلاعات بسیار بیشتری را بدست بیاورید. 

منبع

مقالات پیشنهادی

5 سوال ساده برای وقتی که به دنبال بازخورد کاربر هستید

شما نمی توانید اولین برداشت را از نو بسازید درسته؟ البته که درسته و این یکی از دلایلی است که باید وقت و تلاش زیادی صرف طراحی یک وب سایت کنید . شما می...

10 نکته برای داشتن تجربه کاربری بهتر در موبایل

لایه ها، فرم ها، فونت ها و موارد دیگر، چیزهایی هستند که در هنگام طراحی وبسایت باید آنها را در نظر بگیرید. جدای از آن شما باید در رابطه با اینکه این ال...

7 افسانه اشتباه در مورد تجربه کاربری [UX]

در حالی که امروزه ، طراحی وب تبدیل به یه کالا جدید رقابتی در بازار شده . بسیاری از مشتری ها هنوز درک روشنی از کاری که با وب سایتشون میخوان انجام بدن ن...

۱۰ کاراکتر طراحی شده با HTML و CSS

من همیشه از اینکه می‌بینم چکارهایی با سی‌اس‌اس می‌ توان انجام داد، شگفت زده می‌شوم. توسعه دهندگان وب می‌دانند که با سی‌اس‌اس می‌توان لایه‌های خارق الع...