【发布时间】:2017-05-10 07:50:38
【问题描述】:
我正在尝试复制命令“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) 的情况下复制这种行为?
【问题讨论】:
-
在你尝试运行
repo.checkout()之前你的工作目录是否干净? -
@NilsWerner 在将 HEAD 更改为指向提交后,我尝试执行
repo.checkout()。此时工作目录包含上次提交中的所有内容,因此我猜从 HEAD 的角度来看,工作目录并不干净。 -
所以不要将
set_head()(它使工作空间变脏)和checkout()(希望工作空间干净)结合起来。只需使用checkout()。 -
@NilsWerner 我在这种情况下的问题是
Repository.checkout(ref)接受引用并且不接受Commit对象,也不是十六进制表示或Oid。所以我找不到如何checkout()到 pygit2 中的特定提交。 -
低级结账是
git read-tree -um HEAD $target && git update-ref HEAD $target; pygit2 显然只了解一棵树的读取,而没有任何选项,因此它正在执行结帐和合并以及任何数量的其他操作,它只提供实际 git 的粗略模型。看起来你可以通过在你的提交中添加一个 ref 来解决它,检查它,然后重置HEAD并删除 ref。