`aws s3 sync` 如何确定文件是否已更新?

30
当我在终端中连续运行命令时,第二次不会同步。这很好!它不应该这样。但是,如果我通过编程方式运行我的构建过程并连续运行aws s3 sync,则两次都会同步所有文件,好像我的构建过程第二次正在以不同的方式更改某些东西。
无法确定可能发生了什么。有任何想法吗?
我的构建过程基本上是pug source/ --out static-site/stylus -c styles/ --out static-site/styles/

1
这可能是由于Amazon S3是[最终一致性](Amazon S3数据一致性模型)的结果。如果在两次执行之间设置延迟,它会表现得更好吗? - John Rotenstein
我隔了几分钟尝试了一下。结果相同。 - Costa Michailidis
3个回答

26

3
有一个名为--exact-timestamps的选项,当时间戳完全匹配时,相同大小的项目将被忽略。默认行为是在本地版本新于S3版本时忽略相同大小的项目。 - John Rotenstein
嗯...这并没有真正帮助。要解决这个问题,我需要中断pug的编译命令来运行cmp或其他东西。我无法想象如何开始做到这一点。我想我会放弃这个项目。 - Costa Michailidis

23

AWS CLI同步:

如果本地文件的大小与S3对象的大小不同,本地文件的最后修改时间比S3对象的最后修改时间更新或者本地文件不在指定的存储桶和前缀下,则需要上传本地文件。

--size-only(布尔值)仅使用每个键的大小来决定是否从源到目标进行同步是合适的。

你需要使用--size-only选项,它仅查看文件大小而不是最后修改日期。这对于资产构建系统非常完美,因为会频繁更改最后修改日期,但不会更改文件的实际内容(我在 webpack 构建中遇到了这个问题,其中像字体这样的文件即使文件内容相同也一直在同步)。如果你没有使用将内容哈希值并包含在文件名中的构建方法,可能会出现问题(如果构建生成具有相同大小但不同内容的文件),所以要注意这一点。

我手动测试添加一个不在远程存储桶上的新文件,并确实使用--size-only将其添加到了远程存储桶中。


5
如果我在HTML文件中将“lump”这个词更改为“pump”,或者进行一些类似的微小更改,这不会改变文件大小,对吗? - Costa Michailidis
3
不会。但我建议使用一个可以在文件名中添加哈希值的构建系统。对于CSS和JavaScript文件来说,这至少非常有效。在我的项目中,我通常只有一个根目录下的 "index.html" 文件,因此我会将它作为部署命令的一部分同步。但是,如果你有很多HTML文件,你需要通过不同的方式进行同步。 - Cymen
7
明白了,这是一个不错的策略:)我希望S3只存储文件内容的哈希值以检查更改。不知道我能否在自己的端上实现这个...o_O - Costa Michailidis
1
@Costa 我同意,如果S3有类似rsync和其他同步工具的选项,那将是最好的前进方式。自己做是一个有趣的想法,看起来应该会起作用(只需决定将文件名映射到哈希的存储位置 - 即放在git存储库中还是单独将其放在s3上或仅从一个服务器部署并将其保留本地或...)。 - Cymen

11
这篇文章有点过时,但我仍然会为那些通过谷歌搜索到这里的人做出贡献。
我同意已经勾选的答案。为了提供更多背景信息,AWS S3功能在很多方面与标准的Linux S3不同。在Linux中,可以计算md5哈希值来确定文件是否已更改。S3没有这样做,因此它只能根据大小和/或时间戳来确定。更糟糕的是,AWS在任何方向传输时都不保留时间戳,因此在同步到本地时忽略时间戳,只在同步到S3时使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接