使用Git发布到S3?


87

有谁知道如何做到这一点?到目前为止,我还无法通过Google找到任何有用的信息。

我真的很想设置本地存储库并将git push其发布到S3,其想法是对资产进行本地版本控制,但在S3上进行远程存储。

可以做到吗?如果可以,怎么做?


1
OP,目前接受的答案不适用于所提出的问题。为了更大的利益,有可能进行更新吗?我相信s3fs这是一个可行的解决方案。
bnjmn 2012年

1
@Benjamin感谢您再次引起我的注意,它已更新。
Andrew

部署到任何远程存储库(以保留提交的备份历史记录)并使用git钩子简单地与S3存储桶同步(例如:)是否有意义s3cmd sync …
法比恩·斯诺瓦特

Answers:


50

1 通过http://blog.spearce.org/2008/07/using-jgit-to-publish-on-amazon-s3.html使用JGit

下载jgit.sh,将其重命名为jgit并将其放在您的路径中(例如$ HOME / bin)。

设置.jgit配置文件并添加以下内容(替换您的AWS密钥):

$ vim〜/ .jgit

accesskey: aws access key
secretkey: aws secret access key

注意,通过在.jgit文件中不指定acl:public,S3上的git文件将是私有的(这就是我们想要的)。接下来,创建一个S3存储桶以将您的存储库存储在其中,我们将其称为git-repos,然后创建一个git存储库进行上传:

s3cmd mb s3://git-repos
mkdir chef-recipes
cd chef-recipes
git init
touch README
git add README
git commit README
git remote add origin amazon-s3://.jgit@git-repos/chef-recipes.git

在上面,我使用s3cmd命令行工具创建存储桶,但是您也可以通过Amazon Web界面来完成存储桶。现在,将其推至S3(注意,当我们与S3交互时,如何使用jgit,否则与标准git一起使用):

jgit push origin master

现在转到其他地方(例如cd / tmp)并尝试克隆它:

jgit clone amazon-s3://.jgit@git-repos/chef-recipes.git

当需要更新它时(因为jgit不支持合并或拉取),您需要执行以下两个步骤:

cd chef-recipes
jgit fetch
git merge origin/master

2 使用Amazon S3支持的基于FUSE的文件系统

  1. 获取一个Amazon S3帐户!

  2. 下载,编译和安装。(请参阅安装说明)

  3. 通过以下方法之一指定安全凭证(访问密钥ID和秘密访问密钥):

    • 使用passwd_file命令行选项

    • 设置AWSACCESSKEYID和AWSSECRETACCESSKEY环境变量

    • 在主目录中使用.passwd-s3fs文件

    • 使用系统范围的/ etc / passwd-s3fs文件

    • 做这个

/usr/bin/s3fs mybucket /mnt

而已!您的亚马逊存储区“ mybucket”的内容现在应该可以在/ mnt中进行读取/写入


1
我遵循了这些指示,但是The request signature we calculated does not match the signature you provided. Check your key and signing method尝试执行时出现错误jgit push origin master。知道我该如何解决吗?
约翰

4
您为什么不只使用git?似乎对于aws上的一个简单的远程git repo来说,需要做很多额外的工作/东西
cmcculloh

1
我建议您更新此(实际)答案,并使用post-receive签出的钩子将其进一步向前移动GIT_WORK_TREE。有关更多详细信息,请参见此处。我最终使它与可以很好地协同工作s3fs。强烈推荐,感谢您帮助我入门。
bnjmn 2012年

1
@cmculloh,如果您还没有EC2实例,那么仅拥有一个git repo可能会带来更多麻烦并需要长期花费。同样,默认情况下,S3存储更加持久。要在EC2上获得相同的持久性,无论如何都必须将快照备份到S3
Jeremy

1
似乎该博客帖子已更新,使jgit项目页面链接到egit [ eclipse.org/egit/]项目的存储库,这使整个解决方案1令人困惑。经过一番搜索,我可以找到原始的jgit项目页面,可以从该页面下载和使用jgit.sh。该链接是eclipse.org/jgit/download,供将来可能需要的任何人使用。
MN伊斯兰教士汉

9

Dandelion是另一个CLI工具,它将使Git存储库与S3 / FTP / SFTP保持同步:http : //github.com/scttnlsn/dandelion


不知道谁对此表示反对。如果目标是与git一起进行增量部署以进行本地版本管理,并与S3进行托管,则我认为此解决方案很好。这就是问题所在。
Tabrez

8

git-s3 - https://github.com/schickling/git-s3

你只需要跑步 git-s3 deploy

它具有git repo的所有优点,并且仅上传/删除您已更改的文件。
注意:部署不是通过git push隐式实现的,但是您可以通过git hook来实现。


14
仅供参考,这取决于Composer,而这又取决于PHP
Maarten

3

您可以使用mc aka Minio client,它是用Golang编写的,可以在开源Apache许可下获得。它适用于Mac,Linux,Windows,FreeBsd。您可以使用mc mirror命令来实现您的要求。

mc GNU / Linux下载

64-bit Intel from https://dl.minio.io/client/mc/release/linux-amd64/mc
32-bit Intel from https://dl.minio.io/client/mc/release/linux-386/mc
32-bit ARM from https://dl.minio.io/client/mc/release/linux-arm/mc
$ chmod +x mc
$ ./mc --help

为Amazon S3配置MC

$ mc config host add mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12
  • 替换为您的访问/密钥
  • 默认情况下,mc使用的是Amazon S3的签名版本4。
  • mys3是minio客户端的Amazon S3别名

将您的github本地存储库/目录说名称镜像mygithub到Amazon S3存储桶名称mygithubbkp

$ ./mc mirror mygithub mys3/mygithubbkp

希望对您有所帮助免责声明:我为Minio工作


3

您也可以使用AWS CLI和Git(带有挂钩)来执行此操作。经过验证可在Windows 10上运行。应在Linux / Mac上运行。

提交时设置同步到S3

  1. 安装AWS CLI
  2. 设置IAM编程访问凭据(您可以限制为S3,甚至可以限制为存储桶)。
  3. 使用凭证配置AWS CLI
  4. 在AWS控制台或CLI上创建S3存储桶。
  5. 确保存储桶是私有的。
  6. bare为您现有的git项目制作一个新的git repo:
mkdir myproject.git
cd myproject.git
git init --bare

注意:使用裸仓库将作为上游,裸仓库将仅具有您要上载到S3存储桶的更改,而不会忽略文件,本地git配置等。

  1. 将这个钩子安装post-updatehooksmyproject.git目录中。
    #!/bin/sh; C:/Program\ Files/Git/usr/bin/sh.exe
    # Sync the contents of the bare repo to an S3 bucket.
    aws s3 sync . s3://myproject/
    
  2. 使用正确的S3存储桶名称更新该挂钩。
  3. 现在,进入您的myproject目录,并将裸仓库添加为上游,s3例如将其命名为:
git remote add s3 path/to/bare/directory/myproject.git 

注意:您可以使用相对路径作为裸目录的路径。

测验

  1. 将更改添加到您的仓库中并提交。
  2. 要将更改s3同步到S3存储桶时,将更改推送到上游。
  3. 您应该看到更改同步到您指定的S3存储桶,还可以查看S3存储桶中的更改以验证所有工作。

参考文献:


如果您已经安装了AWS CLI和Git,则可以。它假定Git具有钩子知识,您知道如何设置IAM用户和编程凭据以及制作S3存储桶。
b01

因此,我是否正确理解这在本地有两个存储库,并且设置了裸露的本地存储库以通过更新后将自身同步到s3?
约西亚

@Josiah是的,这是正确的。尽管没有必要,但它有助于简化仅在S3中所需文件的同步,因为裸仓库仅包含已提交的文件。我没有裸仓库就尝试了此操作,但是随后我不得不排除了一些文件无法同步到S3,尤其是.gitignore文件中的所有文件。
b01

1

您可以使用deplybot(http://deploybot.com/)服务,该服务对于单个git存储库是免费的。

您可以通过在部署模式部分中选择“自动”来自动化部署。

我正在使用它。这是非常容易和有用的。


不再免费。
mxcl


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.