#版本控制 #文件 #存储 #提交 #控制系统 #远程 #在线

app sssync

一种基于在线对象存储的大文件版本控制系统

2 个版本

0.1.1 2022年10月15日
0.1.0 2022年10月15日

#2248 in 命令行实用工具

MIT 许可证

115KB
3K SLoC

sssync

Sssync 是一种以解决 Git 的两个限制为目标的版本控制系统;处理大文件的能力,以及将文件轻松存储到在线对象存储中的能力。

它的工作方式与 git 类似,其中每个文件都会被哈希并存储在提交中,这些提交本身也会被哈希、跟踪和存储。然而,它使用 xxhash 而不是 SHA1 来提高大文件哈希的性能,并且具有使用 S3 存储桶作为远程存储后端的能力。

Sssync 并没有解决使用 git 的二进制文件重复问题,因此它最适合于文件集合,尽管这些文件很大,但预计不会频繁更改。

如何获取它

Sssync 可在 crates.io 上找到。您可以使用以下命令安装它:

> cargo install sssync

如何使用它

初始化新的 sssync 仓库

在您想要使用 sssync 管理的任何目录中运行

> sssync init .

这将生成一个新的目录 .sssync 并设置仓库。一旦完成,您就可以运行 sssync add 来暂存文件以供添加,并运行 sssync commit 将暂存的更改添加到仓库中。

设置远程仓库

Sssync 具有使用 S3 作为远程后端的能力。要设置 S3 远程,请运行以下命令:

# sssync remote add <remote-name> <s3-url>
> sssync remote add new-remote s3://example.com/path/to/bucket

然后初始化远程仓库

# sssync remote init <remote-name>
> sssync remote init new-remote

在此之后,您可以将更改推送到远程仓库

# sssync remote push <remote-name>
> sssync remote push new-remote

工作原理

Sssync init 在指定的目录中创建一个名为 .sssnyc 的目录。此目录包含 sssync.db 文件以及另外两个目录: objectsremotes

对象

sssync 中的对象是存储在 objects 目录中的文件,其存储方式是通过其内容的哈希值。

sssnc.db

sssync.db 是一个 Sqlite3 数据库,其中包含有关 sssync 项目的所有运行信息:提交、引用、远程、索引、树和上传。

提交

sssync 中的提交是由在特定时间点的所有对象的哈希值组合而成的哈希,该哈希链接到上一个提交,以及有关提交的一些元信息(注释、作者、创建时间戳)。

CREATE TABLE commits (
    hash TEXT PRIMARY KEY,
    comment TEXT NOT NULL,
    author TEXT NOT NULL,
    created_unix_timestamp INTEGER NOT NULL,
    parent_hash TEXT
);

在 sssync 中的树是提交创建时仓库文件路径的表示。当您将仓库切换到不同的 HEAD 时,树允许系统将提交中的对象放置在文件系统中正确的空间。

CREATE TABLE trees (
    path TEXT NOT NULL,
    file_hash TEXT NOT NULL,
    size_bytes INTEGER NOT NULL,
    commit_hash TEXT NOT NULL
);

暂存

暂存是当前仓库中所有尚未提交(但我们希望它们被提交)的更改的存储区域。

CREATE TABLE staging (
    file_hash TEXT PRIMARY KEY,
    path TEXT NOT NULL,
    size_bytes INTEGER NOT NULL,
    modified_time_seconds INTEGER NOT NULL
);

如何使用

> sssync init
> sssync add
> sssync commit
> sssync remote add example --kind s3 --location s3://test.bucket
> sssync remote init example
> sssync remote push example

依赖项

~64MB
~1M SLoC