3

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

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

我是唯一处理这些文件的人,而这两个位置是这些文件存在的唯一位置。我唯一的原因git是因为就在今天我不小心删除了一些代码,并且无法恢复。

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

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

4

3 回答 3

4

没有任何错误。

请记住 git 对象:提交、树和 blob 是不可变的,因此 git 对象存储就像一个日志,您只向其中写入新对象而不删除任何内容,即使您“重写历史记录”也是如此。不是在git gc你停止世界和修剪之前。Git 使丢失数据变得困难。


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

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

touch .git/objects/pack-fe017c0e9ea12841cd29458df7bd4421c2b12458.keep

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

于 2009-10-25T00:20:16.040 回答
3

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

于 2009-10-25T00:15:08.420 回答
3

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

于 2009-10-25T02:03:14.817 回答