当我在终端中连续运行该命令时,它第二次不会同步。这太棒了!不应该。但是,如果我运行构建过程并以编程方式连续运行
aws s3 sync
,它会两次同步所有文件,就好像我的构建过程第二次更改了不同的内容一样。
无法弄清楚可能会发生什么。有什么想法吗?
我的构建过程基本上是
pug source/ --out static-site/
和 stylus -c styles/ --out static-site/styles/
根据此 - http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
S3 同步会比较文件的大小和上次修改的时间戳,以查看文件是否需要同步。
在你的情况下,我怀疑构建系统会产生更新的时间戳,即使文件大小没有改变?
如果本地文件大小小于,则需要上传 与 s3 对象的大小不同,最后修改时间 本地文件比 s3 对象的上次修改时间新, 或者指定的bucket下不存在本地文件并且 前缀。
--size-only(布尔值)使每个键的大小成为用于决定是否从源同步到目标的唯一标准。
您需要
--size-only
选项,该选项仅查看文件大小而不是上次修改日期。这对于资产构建系统来说是完美的,该系统会频繁更改最后修改日期,但不会更改文件的实际内容(我在 webpack 构建中遇到了这种情况,其中字体等内容保持同步,即使文件内容相同)。如果您不使用将内容哈希合并到文件名中的构建方法,则可能会遇到问题(如果构建发出相同大小的文件但内容不同),因此请注意这一点。
我确实手动测试了添加不在远程存储桶上的新文件,它确实已通过
--size-only
添加到远程存储桶中。
这篇文章有点过时,但我仍然会为通过谷歌到达这里的人们做出贡献。
我同意检查的答案。 为了添加额外的上下文,AWS S3 功能在许多方面与标准 Linux s3 不同。 在 Linux 中,可以计算 md5hash 来确定文件是否已更改。 S3 不这样做,因此它只能根据大小和/或时间戳来确定。 更糟糕的是,AWS 在以任何一种方式传输时都不会保留时间戳,因此同步到本地时会忽略时间戳,仅在同步到 s3 时使用时间戳。
除了现有答案之外,目前还无法使用
aws s3 sync
使用校验和作为标准(请参阅此 github 问题),但可以使用 rclone 工具 来实现此用例
以下命令会将文件同步到指定的 S3 存储桶,并且如果 modtime 已更新(例如使用
touch
)但校验和未更改,则不会重新上传文件:
rclone sync input_dir s3-config:my-s3-bucket/ --checksum
对于那些不熟悉rclone的人来说,
s3-config
是~/.config/rclone/rclone.conf
中定义的rclone配置,例如:
[s3-config]
type = s3
provider = AWS
env_auth = true
region = us-east-1
server_side_encryption = aws:kms
来自 rclone 文档:
-c, --校验和 通常,rclone 会查看文件的修改时间和大小,看看它们是否相等。如果您设置此标志,则 rclone 将检查文件哈希和大小以确定文件是否相等。
当遥控器不支持设置修改时间并且需要比仅检查文件大小更准确的同步时,这非常有用。
请注意,仅当
--exact-timestamps
和 --size-only
不足以满足您使用 aws s3 sync
的用例时,此答案才相关。