【问题标题】:git clone S3 error: 403 Forbiddengit clone S3 错误:403 Forbidden
【发布时间】:2016-04-05 21:11:40
【问题描述】:

我希望能够将 git 存储库同步到 AWS S3 以进行备份。此外,我希望公众能够git clone 我的备份。 My steps分别是:

s3cmd mb s3://lktesting
git update-server-info
s3cmd -P sync .git/ s3://lktesting
s3cmd ws-create s3://lktesting
s3cmd ws-info s3://lktesting

我认为这曾经有效,但现在我明白了:

git clone http://lktesting.s3-website-ap-southeast-1.amazonaws.com/
Cloning into 'lktesting.s3-website-ap-southeast-1.amazonaws.com'...
error: The requested URL returned error: 403 Forbidden (curl_result = 22, http_code = 403, sha1 = bf866b95d9517ea38e213740cead5cf1c313f5aa)
Checking connectivity... done.

有人知道我错过了什么吗?

【问题讨论】:

    标签: git amazon-s3


    【解决方案1】:

    .git 下的 Git 对象可能作为单个文件存在或存在于 git 包中。 Git dumb HTTP protocol 将尝试将对象作为单个文件获取,并且仅当失败并显示“404 Not found”时,它才会查找包。

    显然,如果您将“列表”权限授予所有人,Amazon S3 存储桶将仅返回 404 代码:How do I have an S3 bucket return 404 (instead of 403) for a key that does not exist in the bucket/

    更新:您可以使用 AWS CLI 和来自 s3api 的 put-bucket-acl 分配必要的权限。

    在 S3 存储桶中托管可克隆 git 存储库的完整命令序列:

    BUCKET=my-bucket-name
    
    # Setup
    aws s3 mb s3://$BUCKET
    aws s3api put-bucket-acl --bucket $BUCKET --acl public-read
    
    # Sync
    git update-server-info
    aws s3 sync --acl public-read .git s3://$BUCKET
    
    # Clone
    git clone https://$BUCKET.s3.amazonaws.com
    

    【讨论】:

    • 如果您明确告知如何添加读取权限,我会接受您的回答,例如aws s3api put-bucket-acl --bucket $BUCKET --acl public-read
    【解决方案2】:

    如果您想避免任何同步问题(例如缺少.git/objects/...),请不要同步.git 的内容

    使用git bundle 以便仅复制一个 表示您的git 存储库的压缩版本的文件(请参阅“How can I email someone a git repository?”)。
    该文件充当成熟的 git 存储库:您可以从中 git clone。

    cd /path/to/your/repo
    git bundle create /tmp/myrepo.bundle --all
    s3cmd -P sync /tmp/myrepo.bundle s3://lktesting
    git clone http://lktesting.s3-website-ap-southeast-1.amazonaws.com/myrepo.bundle
    

    你不能推送到它,所以你可能想在你的 s3 实例中直接克隆它,然后从那个未压缩的 s3 存储库中克隆。

    【讨论】:

      【解决方案3】:

      看起来使用空存储库运行完全相同的方法可以正常工作。

      使用调试标志 [0] 运行相同的命令(git clone),虽然我在本地复制了一些内容,但看起来在 git 存储库中引用的某些对象 [1] 不存在于 S3 存储桶中(403 是键不存在时抛出的默认响应代码)。您的同步是否完全完成?

      [0]

      GIT_CURL_VERBOSE=1 GIT_TRACE=1 git clone http://lktesting.s3-website-ap-southeast-1.amazonaws.com/
      [...]
      GET /objects/03/4261c96d614614344a1b618c8ec3d8d2ff7d3c HTTP/1.1
      Host: lktesting.s3-website-ap-southeast-1.amazonaws.com
      User-Agent: git/2.5.4 (Apple Git-61)
      Accept: */*
      
      * The requested URL returned error: 403 Forbidden
      

      [1] /objects/03/4261c96d614614344a1b618c8ec3d8d2ff7d3c

      【讨论】:

      • 会出现 objects/bf/866b95d9517ea38e213740cead5cf1c313f5aa 在我的本地或远程副本中不存在。想知道为什么 git 正在寻找它。
      • 看起来它在 objects/pack/pack-c09c1942e51effe9e1ce1106a8f1f57f845b0dee.idx 中被引用——但我对 Git 的了解不够多,无法说明原因。在这种情况下,我想 S3 为无效对象抛出 403 而不是 404 的默认行为导致 Git 的意外响应。克隆至少给了我一个存储库输出到lktesting.s3-website-ap-southeast-1.amazonaws.com/,但我不知道是否缺少对象。
      猜你喜欢
      • 2016-03-12
      • 2019-12-09
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2020-09-07
      • 2014-02-17
      • 2021-01-24
      相关资源
      最近更新 更多