这是我的情况。我在笔记本电脑和服务器上都保留了一组文件。我已经使用rsync在两个位置之间建立了同步设置。最近我决定这些文件的某些部分应该受源代码控制。我正在使用git
。
所以我使用rsync同步shared/
。然后我有shared/stuff/
受到git控制。我将在本地存储库的两个位置使用git。我一次只使用一个副本,而且我总是来回同步文件。
我是唯一处理这些文件的人,这两个位置是这些文件存在的唯一位置。我git
的唯一原因是因为就在今天我意外删除了一些代码,但无法将其恢复。
所以我的真正问题是:rsync
做任何会破坏git
的事情吗?反之亦然?
编辑:对于那些好奇的人,我使用rsync同步而不是git的原因是因为我已经拥有一个很好的系统来保持共享/文件夹同步,并且希望将git存储库保存在其中。
答案 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算法!