使用 PyGit2 复制“git checkout <commit>
Replicating "git checkout <commit> with PyGit2
我正在尝试复制命令 "git checkout (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 显然只理解一棵树读取和 none 上的选项,因此它正在执行结帐和合并以及除了实际 git 的粗略模型外,它所提供的任何其他操作都没有。看起来你可以通过向你的提交添加一个引用来搞砸它,检查它,然后重置 HEAD 并删除引用。
repo.checkout_tree 可以直接使用commit。完成后,您仍然需要 set_head。此外,如果您想要 'git reset' 等效项,请将以下策略传递给 checkout_tree:pygit2.GIT_CHECKOUT_FORCE | pygit2.GIT_CHECKOUT_RECREATE_MISSING
我正在尝试复制命令 "git checkout (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 显然只理解一棵树读取和 none 上的选项,因此它正在执行结帐和合并以及除了实际 git 的粗略模型外,它所提供的任何其他操作都没有。看起来你可以通过向你的提交添加一个引用来搞砸它,检查它,然后重置 HEAD 并删除引用。
repo.checkout_tree 可以直接使用commit。完成后,您仍然需要 set_head。此外,如果您想要 'git reset' 等效项,请将以下策略传递给 checkout_tree:pygit2.GIT_CHECKOUT_FORCE | pygit2.GIT_CHECKOUT_RECREATE_MISSING