Python “复制”;git checkout<;承诺>;使用PyGit2

Python “复制”;git checkout<;承诺>;使用PyGit2,python,git,libgit2,pygit2,Python,Git,Libgit2,Pygit2,我试图复制命令“git checkout(commit)”的行为,其中(commit)是对as-specific-commit的引用,而不是分支名称 使用此命令时,存储库的“头”指向提交(分离头),并且工作目录与此提交中的状态相同 目前,我设法用PyGit2将存储库的头部指向提交: def go(self, repo_name, version): repo = pygit2.Repository(bdd[repo_name]) #commit = repo.revparse_s

我试图复制命令“git checkout(commit)”的行为,其中(commit)是对as-specific-commit的引用,而不是分支名称

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

目前,我设法用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
我的问题是,我找不到如何像gitcli那样回滚工作目录。 我尝试使用:

  • repo.checkout\u head()
    :它不会在工作目录上执行任何操作
  • repo.checkout()
    :与GitError一起崩溃:X冲突阻止签出

有没有一种方法可以在不使用Repository.reset(ref,pygit2.GIT_reset_HARD)的情况下复制此行为?

低级签出是
GIT read tree-um HEAD$target&&GIT update ref HEAD$target
pygit2显然只理解一个树读取,而不理解其中的任何选项,因此,不管它如何执行签出和合并以及任何其他操作,它只提供了实际git的粗略模型。看起来你可以在提交中添加一个引用,检查出,然后重置头部并删除引用。repo.checkout_树可以直接使用提交。完成后,你仍然需要头脑清醒。另外,如果您想要“git reset”等效,请将以下策略传递到签出树:
pygit2.git\u checkout\u FORCE>pygit2.git\u checkout\u RECREATE\u MISSING

在您尝试运行
repo.checkout()
?@NilsWerner我尝试执行
repo.checkout()之前,您的工作目录是否干净
在我将头部更改为指向提交后。此时,工作目录包含上一次提交中的所有内容,因此从头部的角度来看,工作目录并不干净。因此,请不要将
set\u HEAD()
(它会使工作区变脏)和
checkout()
(期望工作区干净)结合起来。只需使用
checkout()
@NilsWerner,在这种情况下,我的问题是
存储库。checkout(ref)
获取一个引用,不要接受
提交
对象,也不要接受它的十六进制表示或Oid。因此,我找不到如何在pygit2中
checkout()
到特定的提交。低级签出是
git read tree-um HEAD$target&&git update ref HEAD$target
;pygit2显然只理解一个树读取,而不理解其中的任何选项,因此,不管它如何执行签出和合并以及任何其他操作,它只提供了实际git的粗略模型。看起来你可以在提交中添加一个ref,检查它,然后重置
HEAD
并删除该ref。