Python “复制”;git checkout<;承诺>;使用PyGit2
我试图复制命令“git checkout(commit)”的行为,其中(commit)是对as-specific-commit的引用,而不是分支名称 使用此命令时,存储库的“头”指向提交(分离头),并且工作目录与此提交中的状态相同 目前,我设法用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
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()
:与GitError一起崩溃:X冲突阻止签出repo.checkout()
有没有一种方法可以在不使用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。