【问题标题】:Replicating "git checkout <commit> with PyGit2使用 PyGit2 复制“git checkout <commit>”
【发布时间】: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 &amp;&amp; git update-ref HEAD $target; pygit2 显然只了解一棵树的读取,而没有任何选项,因此它正在执行结帐和合并以及任何数量的其他操作,它只提供实际 git 的粗略模型。看起来你可以通过在你的提交中添加一个 ref 来解决它,检查它,然后重置 HEAD 并删除 ref。

标签: python git libgit2 pygit2


【解决方案1】:

低级结帐是git read-tree -um HEAD $target &amp;&amp; git update-ref HEAD $target; pygit2 显然只了解一棵树读取并且没有任何选项,因此它正在执行结帐和合并以及任何数量的其他操作,它提供的只是粗略的实际 git 的模型。看起来你可以通过在你的提交中添加一个 ref 来解决它,检查它,然后重置 HEAD 并删除 ref。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      • 2021-11-05
      • 2017-04-22
      • 1970-01-01
      • 2017-06-12
      • 2013-02-13
      相关资源
      最近更新 更多