使用gcloud rsync本地文件夹至GCS桶时遇ArgumentException问题求助
这问题我之前帮不少开发者排查过,大概率是目标路径格式或者参数使用不当导致的,给你几个针对性的解决方向:
1. 修正目标GCS路径的格式
GCS路径的规范很重要,尤其是同步文件夹的时候:
- 正确格式必须是
gs://[bucket-name]/[target-folder]/(注意结尾的斜杠),比如gs://my-project-bucket/sync-target/ - 常见错误:如果只写
gs://my-project-bucket而不加结尾斜杠,rsync会混淆你是要把本地文件夹作为一个对象上传,还是同步文件夹内的内容到桶根,这就会触发元数据缺失对象名的错误。 - 调整命令示例:把
改成gcloud storage rsync ./local-data gs://my-project-bucketgcloud storage rsync ./local-data gs://my-project-bucket/
2. 处理含特殊字符/空格的路径
如果你的本地文件夹或GCS目标路径包含空格、&、*这类特殊字符,一定要用引号把路径包裹起来:
gcloud storage rsync "./local folder with spaces" "gs://my-project-bucket/target folder/"
没加引号的话,shell会把路径拆分成多个参数,导致rsync无法正确解析目标对象的名称,自然就会出现元数据缺失的问题。
3. 更新gcloud工具到最新版本
旧版本的gcloud storage组件可能存在这类兼容性bug,运行下面的命令更新所有组件:
gcloud components update
更新完成后再重新执行同步命令,很多时候这类老bug就能直接解决。
4. 排查单个文件的异常
如果是同步到一半报错,可能是某个本地文件的文件名不符合GCS规则(比如空文件名、包含\、?这类GCS禁止的字符)。可以先测试单个文件上传:
gcloud storage cp ./test-file.txt gs://my-project-bucket/test-file.txt
如果单个文件上传正常,再逐步扩大同步范围,找出那个有问题的文件并修正文件名。
你提供的错误信息:
ArgumentException: Object metadata supplied for destination object had no object name。
堆栈跟踪片段:
2018-04-15T08:30:06.3806055Z - [2 files][ 9.0 MiB/ 16.3 MiB] 69.2 KiB/s
2018-04-15T08:30:06.3806130Z DEBUG: Exception stack trace:
2018-04-15T08:30:06.3806196Z Traceback (most recent call last):
2018-04-15T08:30:06.3806287Z File "C:\Program Files (x86)...
内容的提问来源于stack exchange,提问作者Florian Baader

