使用 PyGit2 复制“git checkout <commit>

Replicating "git checkout <commit> with PyGit2

我正在尝试复制命令 "git checkout (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 那样回滚工作目录。 我尝试使用:

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

低级结帐是 git read-tree -um HEAD $target && git update-ref HEAD $target; pygit2 显然只理解一棵树读取和 none 上的选项,因此它正在执行结帐和合并以及除了实际 git 的粗略模型外,它所提供的任何其他操作都没有。看起来你可以通过向你的提交添加一个引用来搞砸它,检查它,然后重置 HEAD 并删除引用。

repo.checkout_tree 可以直接使用commit。完成后,您仍然需要 set_head。此外,如果您想要 'git reset' 等效项,请将以下策略传递给 checkout_tree:pygit2.GIT_CHECKOUT_FORCE | pygit2.GIT_CHECKOUT_RECREATE_MISSING