Рубрики
Без рубрики

Первые шаги с GitPython

Научитесь использовать библиотеку GitPython для программного взаимодействия с репозиториями Git.

Автор оригинала: Matt Makai.

GitPython – это библиотека кода Python. для программного чтения и записи в Git репозитории системы контроля версий.

Давайте узнаем, как использовать GitPython, быстро установив его и прочитав локальный клонированный репозиторий Git.

Наши инструменты

Это руководство должно работать с Python 2.7 или 3, но Python 3, особенно 3.6+, настоятельно рекомендуется для всех новых Приложения. я использовал Python 3.6.3 в напишите этот пост. Помимо Python, в этом руководстве мы также будет использовать следующие зависимости приложения:

  • Git,
  • реализация контроля версий (версий),
  • версия 2.15.1
  • GitPython
  • версия 2.1.7
  • pip и
  • virtualenv , которые входят
  • в комплекте с Python 3, для установки и изоляции библиотеки GitPython
  • из любого из ваших других проектов Python

Взгляни на это руководство по настройке Python 3 и Flask в Ubuntu 16.04 LTS если вам нужны конкретные инструкции для получения базы Настроена среда разработки Python.

Весь код в этом сообщении в блоге доступен с открытым исходным кодом по лицензии MIT. на GitHub в разделе каталог first-steps-gitpython репозитория blog-code-examples . Используйте исходный код и злоупотребляйте им в своих собственных приложениях.

Установить GitPython

Начните с создания новой виртуальной среды для вашего проекта. Мой виртуальный называется testgit , но вы можете назвать свое имя, соответствующее проекту вы создаете.

python3 -m venv gitpy

Активируйте только что созданный файл virtualenv.

source gitpy/bin/activate

Имя virtualenv будет добавлено в командную строку после активация.

Создать и активировать виртуальную среду Python.

Теперь, когда virutalenv активирован, мы можем использовать команду 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

Затем мы можем начать программное взаимодействие с репозиториями Git в нашем Приложения Python с установленным GitPython.

Клонировать репозиторий

GitPython может работать с удаленными репозиториями, но для простоты в этом В руководстве мы будем использовать клонированный репозиторий в нашей локальной системе.

Клонируйте репозиторий, с которым хотите работать, в свою локальную систему. Если вы этого не сделаете иметь в виду конкретный, использовать Репозиторий Full Stack Python Git с открытым исходным кодом который размещен на GitHub.

git clone [email protected]:mattmakai/fullstackpython.com fsp

Обратите внимание на место, где вы клонировали репозиторий, потому что нам нужно путь к сообщению GitPython о том, какой репозиторий обрабатывать. Перейти в каталог для нового репозитория Git с помощью cd , затем запустите pwd (присутствует рабочий каталог), чтобы получить полный путь.

cd fsp
pwd

Вы увидите что-то вроде /Users/matt/devel/py/fsp . Этот путь твой абсолютный путь к базе репозитория Git.

Используйте команду export , чтобы установить переменную среды для абсолютного пути в репозиторий Git.

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

Наш репозиторий Git и переменная среды пути установлены, поэтому давайте напишем код Python, использующий GitPython.

Чтение данных репозитория и фиксации

Создайте новый файл Python с именем read_repo.py и откройте его, чтобы мы могли начать написать простой скрипт.

Начнем с пары импортов и константы:

import os
from git import Repo


COMMITS_TO_PRINT = 5

Модуль os упрощает чтение переменных среды, таких как наши GIT_REPO_PATH переменная, которую мы установили ранее. from git import Repo дает наши доступ приложения к библиотеке GitPython при создании объекта Repo . COMMITS_TO_PRINT – константа, ограничивающая количество строк вывода. в зависимости от количества коммитов, о которых мы хотим, чтобы наш скрипт печатал информацию. Full Stack Python содержит более 2250 коммитов, так что вывода будет много если мы напечатали каждую фиксацию.

Затем в нашем файле 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 принимает объект фиксации GitPython и печатает 40-символьный хэш SHA-1 для фиксации, за которым следует:

Под функцией 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-адреса Git настроены для этого репозитория и последней фиксации.

Наконец, нам нужна «основная» функция, когда мы вызываем скрипт из терминал с помощью команды python . Завершите наш

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

Основная функция обрабатывает получение переменной среды GIT_REPO_PATH . и, если возможно, создает объект Repo на основе пути.

Если репозиторий не пуст, это означает, что не удалось найти репозиторий, то функции print_repository и print_commit вызывается, чтобы показать данные репозитория.

Если вы хотите скопировать и вставить сразу весь код, найденный выше, возьмите посмотри на Файл read_repo.py на GitHub .

Пришло время протестировать наш скрипт, использующий GitPython. Вызов файла read_repo.py с помощью следующую команду.

(gitpy) $ python read_repo.py

Если виртуальная среда активирована и переменная среды GIT_REPO_PATH установлен правильно, мы должны увидеть результат, подобный следующему.

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 "[email protected]:mattmakai/fullstackpython.com"
Last commit for repo is 1fa2de70aeb2ea64315f69991ccada51afac1ced.
----
1fa2de70aeb2ea64315f69991ccada51afac1ced
"update latest blog post with code" by Matt Makai ([email protected])
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 ([email protected])
2017-11-30 09:00:06-05:00
count: 2255 and size: 269
----
2136d845de6f332505c3df38efcfd4c7d84a45e2
"change previous email newsletters list style" by Matt Makai ([email protected])
2017-11-20 11:44:13-05:00
count: 2254 and size: 265
----
9df077a50027d9314edba7e4cbff6bb05c433257
"ensure picture sizes are reasonable" by Matt Makai ([email protected])
2017-11-14 13:29:39-05:00
count: 2253 and size: 256
----
3f6458c80b15f58a6e6c85a46d06ade72242c572
"add databases logos to relational databases pagem" by Matt Makai ([email protected])
2017-11-14 13:28:02-05:00
count: 2252 and size: 270

Конкретные коммиты, которые вы видите, будут зависеть от последних 5 коммитов, которые я помещен в репозиторий GitHub, но если вы видите что-то вроде вывода выше это хороший знак, что все работает, как ожидалось.

Что дальше?

Мы только что клонировали репозиторий Git и использовали GitPython библиотека для чтения множества данных о репозитории и всех его коммитах.

GitPython может не только читать данные – он также может создавать и пишите в репозитории Git! Взгляните на изменение ссылок страницу документации в официальном руководстве по GitPython или вернитесь сюда в будущее, когда у меня будет возможность написать более продвинутый GitPython прохождение.

Вопросов? Дай мне знать через запрос на выпуск GitHub в репозитории Full Stack Python , в Твиттере @fullstackpython или @mattmakai .

Видите что-то не так в этом сообщении в блоге? Вилка исходный код этой страницы на GitHub и отправьте запрос на перенос.