仅在文件夹中 s3 同步更改文件的最佳方式

问题描述 投票:0回答:2

我有一项工作,克隆存储库,然后 s3 将更改文件同步到 s3 存储桶。我只想同步已更改的文件。由于首先克隆存储库,因此文件始终具有新的时间戳,因此 s3 同步将始终上传它们。我考虑过使用“--size-only”,但我的理解是,这可能会丢失已合法更改的文件。解决这个问题最好的方法是什么?

amazon-web-services amazon-s3
2个回答
2
投票

如果不能依赖 mtime,则没有现成的答案可以同步更改的文件。正如您所指出的,这意味着如果文件的大小没有改变,那么使用“--size-only”标志将导致

aws s3 sync
跳过这些文件。在我看来,有两种基本路径,您使用的解决方案将取决于您的具体需求。

利用 Git

首先,您可以利用 git 中存储的文件这一事实来帮助更新修改时间。 git 本身不会存储元数据,维护者有一种哲学,认为这样做是一个坏主意。我不会争论或反对这一点,但有两种基本方法可以解决这个问题:

您可以将此元数据存储在 git 中。有多种方法可以做到这一点,其中一种方法是 metastore,它使用与 git 一起安装的工具来存储元数据并在以后应用。这确实需要向 git 存储库的所有用户添加一个工具,这可能会也可能不会被接受。

另一个选择是尝试从 git 中已有的元数据重新创建 mtime。例如,git-restore-mtime通过使用修改文件的最近提交的时间戳来完成此操作。这需要在运行同步命令之前运行外部工具,但不需要任何其他工作流程更改。

使用这些选项中的任何一个都可以让基本的

aws sync
命令发挥作用,因为一次运行到另一次运行的时间戳是一致的。

做好自己的事情

从根本上来说,您想要上传已更改的文件。

aws sync
尝试使用文件大小和修改时间戳来检测更改,但如果您愿意,您可以编写一个脚本或程序来枚举要上传的所有文件,并将它们与少量额外的元数据(包括某些内容)一起上传就像 sha256 哈希值一样。然后,在将来的运行中,您可以使用
list-objects
枚举 S3 中的文件,并依次在每个对象上使用
head-object
来获取元数据以查看哈希是否已更改。

或者,您可以使用 S3 中每个对象的“etag”,因为它是在

list-objects
调用中返回的。据我了解,etag 公式没有记录并且可能会发生变化。也就是说,众所周知,您可以在 Stack Overflow 和其他地方找到它的实现。您可以计算本地文件的 etag,然后查看远程文件是否不同并需要更新。这将使您在检查更改时不必在每个对象上执行头对象。


0
投票

如果有人感兴趣,我自己用 C++ 编写了一个解决这个问题的小解决方案。我现在刚刚看到有人用 JS 编写了一个解决方案……但我的小 C++ 解决方案对我有用 :-) .. Windows 上还有 S3Express - 但价格为 99.99 美元。

https://unrealwizard.com/chatgptandawss3/

如果对其他人有用,我可以将其变成一个独立的命令行工具..但它将仅限于 Windows...

© www.soinside.com 2019 - 2024. All rights reserved.