0

当使用 pygit2从远程拉取和集成更改时,最后一步是使用Repository.checkout()or签出Repository.checkout_head()。使用哪个?

两者都以检查策略为论据。现在有几种检查策略,即 GIT_CHECKOUT_SAFE、GIT_CHECKOUT_SAFE_CREATE、GIT_CHECKOUT_FORCE
。我面临的问题是,即使在检查了索引文件之后,它也被修改了,即其中有几个文件是暂存的。

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()
{}

注意:这是使用 pygit2 拉取和集成更改的后续问题以及此处的另一个问题

4

1 回答 1

0

没有区别。如果你传递一个refnameto 'HEAD'Repository.checkout()它会调用Repository.checkout_head().

至于为什么文件仍然被修改,那是因为你告诉库不要覆盖更改。请参阅策略文档以了解每种策略的作用。具体来说,

介于两者之间的是 GIT_CHECKOUT_SAFE 和 GIT_CHECKOUT_SAFE_CREATE 两者都只进行不会丢失更改的修改。

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

于 2014-07-11T11:19:00.820 回答