pygit2中Repository.checkout()和Repository.checkout_head()有什么区别?

时间:2014-07-11 10:43:50

标签: git pygit2

pulling and integrating changes from remote使用pygit2时,最后一步是使用Repository.checkout()Repository.checkout_head()结帐。哪个用?

这两个都以结账策略为参数。 现在有几种策略可以检查出GIT_CHECKOUT_SAFE,GIT_CHECKOUT_SAFE_CREATE,GIT_CHECKOUT_FORCE etc.
我面临的问题是,即使在签出后,索引文件也被修改,即其中有几个文件被暂存。

  
    
      

r.repo.status()
          {'README.md':2}

    
  

当使用策略GIT_CHECKOUT_FORCE时,索引为空并且还存储了提交。

何时不应使用GIT_CHECKOUT_FORCE策略?
以下是该过程的逐步代码:
r.repo是Repository对象。 remo是名为ssh-sansa

的远程
>>> r.repo.status()
{}
>>> z = remo.fetch()
>>> remoref = r.repo.lookup_reference('refs/remotes/ssh-sansa/master')
>>> rref = r.repo.lookup_reference(r.ref)
>>> r.ref
'refs/heads/master'
>>> remoref.target.hex
'23aac24f65c775d0524095d422133c63caf3826a'
>>> rref.target.hex
'29f5f99722e9c93a58ec085a55c6a4814c4adffb'
>>> rref.target=remoref.target.hex
>>> rref.target.hex
'23aac24f65c775d0524095d422133c63caf3826a'
>>> r.repo.status()
{'README.md': 2}
>>> r.repo.checkout_head(repo_.pygit2.GIT_CHECKOUT_SAFE_CREATE)
>>> r.repo.status()
{'README.md': 2}
>>> r.repo.checkout('HEAD',strategy=repo_.pygit2.GIT_CHECKOUT_SAFE_CREATE)
>>> r.repo.status()
{'README.md': 2}
>>> r.repo.checkout('HEAD',strategy=repo_.pygit2.GIT_CHECKOUT_FORCE)
>>> r.repo.status()
{}

注意:这是pulling and integrating changes using pygit2another question here

的后续问题

1 个答案:

答案 0 :(得分:0)

没有区别。如果您将refname 'HEAD'传递给Repository.checkout(),则会致电Repository.checkout_head()

至于为什么文件仍然被修改,这是因为你告诉图书馆不要覆盖更改。有关每种策略的作用的说明,请参阅the strategy docs。具体地,

  

在它们之间是GIT_CHECKOUT_SAFE和GIT_CHECKOUT_SAFE_CREATE,它们都只进行不会丢失变化的修改。

当您的文件被修改时,覆盖它会导致我们失去更改,因此它会拒绝。如果要覆盖它,请使用FORCE或使文件不处于修改状态。