Git克隆S3出错:403禁止访问。

4

我希望能够将Git存储库同步到AWS S3以进行备份。此外,我希望公众能够通过git clone来访问我的备份。我的步骤如下:

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.

有人知道我缺少什么吗?

3个回答

6
如果你想避免任何同步问题(比如缺失 .git/objects/...),不要同步 .git 目录的内容。
使用 git bundle,只复制代表压缩版本的一个文件,即可解决该问题(参见 "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存储库中进行克隆。


5

.git下的Git对象可能仅存在于单个文件中,也可能存在于Git包中。如果使用Git dumb HTTP协议尝试将对象作为单个文件获取时,只有在失败并返回"404 Not found"后才会查找包。

显然,只有当您向所有人授予"List"权限时,Amazon S3存储桶才会返回404代码:如何让S3存储桶返回404(而不是403),对于不存在于存储桶中的密钥?

更新:您可以使用s3api中的put-bucket-acl命令通过AWS CLI分配必要的权限。

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

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

1
如果您明确说明如何添加读取权限,例如 aws s3api put-bucket-acl --bucket $BUCKET --acl public-read,我将接受您的答案。 - hendry

1

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

使用调试标志[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

[1] /objects/03/4261c96d614614344a1b618c8ec3d8d2ff7d3c

似乎我的本地或远程副本中不存在 objects/bf/866b95d9517ea38e213740cead5cf1c313f5aa。不知道为什么 Git 在寻找它。 - hendry
看起来它被引用在 objects/pack/pack-c09c1942e51effe9e1ce1106a8f1f57f845b0dee.idx 这个文件中,但是我对 Git 的了解不够,无法确定原因。在这种情况下,我想 S3 默认的行为是在对象无效时返回 403 而不是 404,这可能导致了 Git 的意外响应。克隆至少将仓库输出到 lktesting.s3-website-ap-southeast-1.amazonaws.com/,但我不知道是否有缺失的对象。 - alexjs

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