2010-08-08 58 views
17

我使用git进行源代码控制,并将我的更改推送到Internet上的服务器上的存储库中以便安全保存。连接不可靠的“git”有多安全?

我可以在火车上的笔记本电脑上做一些少量的编码,它有一个无线互联网连接,但它不是,那可靠,偶尔会退出或变得无法使用缓慢。我的问题是如果我的连接在“git push”过程中丢失会发生什么?我最终是否会损坏或更新一半的git存储库?如果是这样,它有多难恢复呢?

+0

我会想象它的SVN和它的一个事务..所以如果更新失败,存储库中的任何内容都不会改变。我对此没有足够的了解以获得正确的答案 – WalterJ89 2010-08-08 08:09:31

+0

我也希望如此,但很想知道:) – jcoder 2010-08-08 08:13:23

回答

15

Git不会因为连接失败或连接速度缓慢而损坏或“半更新”Git存储库。它非常强大,即使在最艰苦的环境下,我仍然可以使用它。

实际push功能在本质上是两个步骤来实现(在快速向前推进的情况下,应该始终如此):

  • 上传所有对象从当前的分公司负责,而不是到达从远程分支头可达
  • 更新远程分支头指向最新提交

的第一个操作是幂等的,因此,如果由于某种原因失败一半,你可以简单地再次运行它让一切都保持最新。第二个操作是原子操作,只有在所有新对象上传后才会发生。

+0

如果推送在第一步中的大量更新过程中失败(由于conn丢失),git会在连接恢复时从哪里停止,或重新开始? – 2011-07-14 19:17:23

+0

@Mark Elliot:对象可以单独传送或“包装”传送。如果连接失败,我认为不完整的包文件将存储在目的地,但个别对象可能是。 – 2011-07-14 19:51:52

+0

@Mark Elliot:它会重新开始,git使用refs(在第二步中更新)来确定它应该发送的内容。有关详细信息,请参阅Documentation/technical/send-pack-pipeline.txt。 – CesarB 2011-09-09 07:48:23

5

根据Linus的说法,git在数据区域的安全性非常好,甚至可以在运行的系统上检测到内存错误。它不会应用到达服务器的包含无效校验和的数据包,因此您无需担心。

+0

如果我有几个本地更改推送,我可以确定它不会应用其中的一些,但不会其他? – jcoder 2010-08-08 08:28:30