使用像这样的git有什么问题吗?

时间:2009-10-25 00:11:52

标签: git rsync

这是我的情况。我在笔记本电脑和服务器上都保留了一组文件。我已经使用rsync在两个位置之间建立了同步设置。最近我决定这些文件的某些部分应该受源代码控制。我正在使用git

所以我使用rsync同步shared/。然后我有shared/stuff/受到git控制。我将在本地存储库的两个位置使用git。我一次只使用一个副本,而且我总是来回同步文件。

我是唯一处理这些文件的人,这两个位置是这些文件存在的唯一位置。我git的唯一原因是因为就在今天我意外删除了一些代码,但无法将其恢复。

所以我的真正问题是:rsync做任何会破坏git的事情吗?反之亦然?

编辑:对于那些好奇的人,我使用rsync同步而不是git的原因是因为我已经拥有一个很好的系统来保持共享/文件夹同步,并且希望将git存储库保存在其中。

3 个答案:

答案 0 :(得分:4)

没有错。

请记住,git对象:提交,树和blob是不可变的,因此git对象存储就像一个日志,你只需要向它写入新对象而不删除任何东西,即使你“重写历史”。不是在git gc之前,你停止世界和修剪。 Git很难丢失数据。


如果您的存储库非常大,并且您重新打包它,则rsync必须再次传输整个对象数据库,因为git将所有内容打包到一个新的大包文件中。如果要重新打包,可以使用git repack代替,这将为新对象创建新包而不触及旧对象。或者你可以重新打包一次,并标记大包文件以保持:

如果你有一个名为.git/objects/pack-fe017c0e9ea12841cd29458df7bd4421c2b12458.pack的包文件,只需在它旁边创建一个名为.keep的文件:

touch .git/objects/pack-fe017c0e9ea12841cd29458df7bd4421c2b12458.keep

现在,git gc不会重写该包文件,但它会占用所有其他小包和对象并将它们收集在一起。与git repack的区别在于您不会构建大量小包文件的集合。

答案 1 :(得分:3)

只要您只在一台计算机上编辑存储库并在编辑之前进行同步,就可以了。

答案 2 :(得分:3)

我一直这样做,但使用Unison而不是rsync。不同之处在于,如果您在两台机器上意外更改了某些内容,Unison将检测到该问题。 Unison甚至内置了rsync算法!