3

我的目标是从 Python 访问现有的 Git 存储库。我想获得回购历史和按需差异。

为了做到这一点,我从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 软件包以便于部署。

我还将定期检查以检测 repo 中的新更改,因此我宁愿使用远程工作,这样我就可以检测到尚未拉到本地的更改。我不确定这应该如何工作,因此将提供任何帮助。

提前致谢。

4

2 回答 2

6

我认为该init方法用于创建一个新的存储库,要打开一个现有的存储库,您只需以这种方式将路径传递给它:

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

有关替代库的摘要,请查看此答案。基本上,它表明使用subprocess模块更容易,因为它是使用您已经知道的界面的最佳方式。

于 2012-01-04T09:11:53.103 回答
3

Dulwich 的大部分文档都假设您对 Git 文件格式/协议有一定的了解。

您应该能够使用以下命令打开现有存储库Repo

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

或创建一个新的:

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

获取特定提交的差异(与其第一个父项的差异)

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"]]
于 2012-01-04T17:04:53.883 回答