【问题标题】:Create a commit using pygit2使用 pygit2 创建提交
【发布时间】:2015-04-06 10:41:16
【问题描述】:

我想在一个分支上进行提交(例如 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 存储库中找到 commit 属性。

我错过了什么吗?

【问题讨论】:

  • 我没有看到你的代码在某处提到了一个分支,也许你应该在某处指定它?
  • reference的值为'ref/heads/master'
  • 我在为 pygit2 找到合适的文档时遇到了麻烦,所以我只是在猜测:我看到您在进行一些状态更改后调用了各种 write() 方法。 create_commit() 是隐式写还是你忘记写了?
  • 我尝试在 create_commit 之后制作:repository.index.write_tree() 但我得到了相同的结果

标签: git libgit2 pygit2


【解决方案1】:

通过写作

tree = repository.TreeBuilder().write()

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

你想要做的是

tree = index.write_tree()

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

【讨论】:

    【解决方案2】:

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

    repo.head.set_target(oid)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多