使用 pygit2 创建提交

Create a commit using pygit2

我想在一个分支上进行提交(例如 master)。

我正在使用 pygit2 (pygit2.clone_repository)

制作存储库克隆

然后我更改存储库中的现有文件。

然后我 运行 提交:

index = repository.index
index.add_all()
index.write()
author = pygit2.Signature(user_name, user_mail)
commiter = pygit2.Signature(user_name, user_mail)
tree = repository.TreeBuilder().write()
oid = repository.create_commit(reference, author, commiter, message,tree,[repository.head.get_object().hex])

但是当我去存储库和 运行 git status:

On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file:   test.txt

修改后的文件似乎是添加提交,但提交没有成功。使用返回的 Oid,我可以在 pygit2 存储库中找到提交属性。

我是不是漏掉了什么?

通过写作

tree = repository.TreeBuilder().write()

您正在创建一个空树,然后将其作为提交的树,这意味着您已经删除了每个文件(如果您 运行 git show HEAD 在 运行 修改你的代码之后)。

你想做的是

tree = index.write_tree()

它将索引中的数据存储为存储库中的树(创建丢失的那个),当您 运行 像 git commit 这样的命令时会发生这种情况。然后,您可以像现在一样将此树传递给提交创建方法。

问题是您刚刚创建了提交,但还没有更新您的 HEAD 引用。创建提交后,手动更新您的 HEAD 引用可以解决此问题。

repo.head.set_target(oid)