Начало работы с Git Python - PullRequest
       35

Начало работы с Git Python

3 голосов
/ 04 января 2012

Моя цель - получить доступ к существующим репозиториям Git из Python.Я хочу получить историю репо и разницу по требованию.

Для этого я начал с dulwich .Поэтому я попытался:

from dulwich.repo import Repo
Repo.init('/home/umpirsky/Projects/my-exising-git-repo')

и получил OSError: [Errno 17] File exists: '/home/umpirsky/Projects/my-exising-git-repo/.git

документ говорит You can open an existing repository or you can create a new one..

Есть идеи, как это сделать?Могу ли я получить историю и различия с Далвичем?Можете ли вы порекомендовать любую другую библиотеку для доступа к Git?Я занимаюсь разработкой приложения Ubuntu, поэтому было бы желательно иметь пакет ubuntu для более простого развертывания.

Я также буду периодически проверять наличие новых изменений в репозитории, поэтому я предпочел бы работать с удаленным, чтобы я мог обнаруживать изменения,пока не тянутся к местным.Я не уверен, как это должно работать, поэтому любая помощь будет оценена.

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 04 января 2012

Я думаю, что метод init используется для создания нового хранилища, чтобы открыть существующее, вы просто передаете путь к нему следующим образом:

from dulwich.repo import Repo
repo = Repo(<path>)

Для краткого обзора альтернативных библиотек, пожалуйста,посмотрите на этот ответ .По сути, это говорит о том, что использовать модуль subprocess проще, поскольку это лучший способ использовать интерфейс, который вы уже знаете.

3 голосов
/ 04 января 2012

Большая часть документации Dulwich предполагает достаточное знание форматов / протоколов файлов Git.

Вы сможете открыть существующий репозиторий с помощью Repo:

from dulwich.repo import Repo
x = Repo("/path/to/git/repo")

или создать новый:

x = Repo.init("/path/to/new/repo")

Чтобы получить diff дляконкретный коммит (diff с его первым родителем)

from dulwich.patch import write_tree_diff
commit = x[commit_id]
parent_commit = x[commit.parents[0]]
write_tree_diff(sys.stdout, x.object_store, parent_commit.tree, commit.tree)

Протокол Git позволяет только получать / отправлять пакеты, он не разрешает прямой доступ к определенным объектам в базе данных.Это означает, что для проверки удаленного репозитория сначала необходимо получить соответствующие коммиты из удаленного репозитория, а затем просмотреть их:

from dulwich.client import get_transport_and_path
client, path = get_transport_and_path(remote_url)
remote_refs = client.fetch(path, x)
print x[remote_refs["refs/heads/master"]]
...