繁体   English   中英

复制“git checkout <commit> 用PyGit2

[英]Replicating "git checkout <commit> with 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)情况下复制此行为?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM