已有的轮子
GitHub 上简单搜了下有这些
但这些轮子都缺少冲突检测的功能,以及依赖于 inotify 来实现对文件移动的检测(检测到文件移动后我们就可以在服务器端同样移动一下而不用重新上传)。我没有下载尝试,但阅读代码后发现以上解决方案执行的操作都是,先把服务器上的内容下载下来,覆盖掉本地内容,然后检测文件系统的改变并实时上传,直到下一次同步的时候再用云端内容覆盖掉本地内容。
我希望实现 Windows 下官方客户端的功能。
需求
- 首次运行的时候,用云端内容填充本地目录(这个没问题)
- 每次同步的时候,将云端增加和修改的文件同步到本地,删除在云端被删除的文件,同时将本地这样的修改同步到云端。对本地文件有哪些修改进行描述的时候,尽量减少上传量,避免重复上传的发生。如果出现冲突,提示用户(也就是我)
- 非同步时段,没有网络操作,也没有
daemon进程。因为如果程序的正常工作依赖一个驻留进程的话,总是担心这个进程有没有运行、没有运行是不是数据就不一致了这样的问题很难受的
OneDrive 提供了这些接口:
- 对服务器上的所有文件做全量快照或增量快照
- 上传、下载、删除单个文件,删除文件夹
- 移动、重命名文件和文件夹
然而微软没有提供“告知客户端,云端文件有修改”这样的接口,导致 daemon 方案的必要性大大降低。同时微软也没有提供批量上传文件的接口
问题
-
对两棵树进行
diff操作的算法是什么?我想要尽量简明地对本地文件有哪些修改进行描述。我们知道,我们执行
git mv命令之后,查阅提交内容,git会告诉我们移动了一个文件。这很容易让我们理解为git mv命令在 Git 的数据库里面写入了一条“用户移动了文件”的记录。但是,据 Pro Git 所述Unlike many other VCS systems, Git doesn ’ t explicitly track file movement. If you rename a file in Git, no metadata is stored in Git that tells it you renamed the file.
The only real difference is that
git mvis one command instead of three — it ’ s a convenience function.我很好奇这样的操作是用什么算法完成的。
-
如何尽量多地自动解决冲突,尽量少地提醒用户解决冲突?
依前文所述,微软提供了云端文件树的增量描述,如果前一个问题解决了,我们也得到了本地文件树的增量描述。那么问题来了,如何对两个“增量描述”进行比较,并检测冲突?
-
更基本的一个问题,如何描述这样的文件树,如何规划数据结构?
题外话
正如很多资深苹果用户一样,我是曾经个资深微软用户,许多重要的文件在 OneDrive 上有一份存档,OneDrive 的空间也比较大。但由于 Windows 10 不断地让我失望,它从我的启动分区消失已经有一年多了。由于众所周知的原因,使用 OneDrive 客户端比使用网页版方便且稳定得多(虽然都不咋地)。我不是计算机相关专业的,因此我认为我可能欠缺不少基础知识,希望各位能多多指教,非常感谢~