4

我正在尝试复制命令“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)

4

2 回答 2

3

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

于 2017-05-15T14:17:12.863 回答
0

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

于 2018-11-08T23:30:33.430 回答