簡體   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