使用PyGit2复制“git checkout <commit>

时间:2017-05-10 07:50:39

标签: python git libgit2 pygit2

我正在尝试复制命令“git checkout(commit)”的行为,其中(commit)是对特定提交的引用,而不是分支名称。

使用此命令时,存储库的“HEAD”指向提交(分离的头),工作目录处于与此提交中相同的状态。

目前,我设法使存储库的HEAD指向使用PyGit2的提交:

def go(self, repo_name, version):
    repo = pygit2.Repository(bdd[repo_name])
    #commit = repo.revparse_single(version)
    #repo.reset(version, pygit2.GIT_RESET_HARD)
    repo.set_head(pygit2.Oid(hex=version))
    print repo.head_is_detached

我的问题是我找不到如Git CLI那样回滚工作目录的方法。 我尝试使用:

  • repo.checkout_head():它对工作目录没有任何作用。
  • repo.checkout():因GitError: X conflicts prevent checkout
  • 而崩溃

有没有办法在不使用Repository.reset(ref, pygit2.GIT_RESET_HARD)的情况下复制此行为?

2 个答案:

答案 0 :(得分:2)

低级结账是git read-tree -um HEAD $target && git update-ref HEAD $target; pygit2显然只能理解单树读取而且没有任何选项,所以不过它正在进行结账和合并以及它提供的任何数量的其他操作实际git的粗略模型。看起来你可以通过在你的提交中添加一个ref来检查它,检查出来,然后重置HEAD并删除ref。

答案 1 :(得分:0)

repo.checkout_tree可以直接使用提交。完成后,您仍然需要set_head。另外,如果您想等效进行“ git reset”,则将以下策略传递给checkout_tree:pygit2.GIT_CHECKOUT_FORCE | pygit2.GIT_CHECKOUT_RECREATE_MISSING