如何推动EC2的Git

我正在尝试遵循这个指示。 我有一个本地的git仓库,当我做一个git push时,我需要把仓库推到我的EC2实例。

但是,在上面的教程中,当我做一个git push origin master ,我得到Permission denied (publickey)错误,因为我没有指定标识文件。

说,我像这样login到EC2: ssh -i my_key.pem username@11.111.11.11

那么,我可以在这里做类似的东西: git -i my_key.pem push origin master或在.git/config设置身份文件

那么,我该如何设置?

更新: git config -l输出

 user.name=my name user.email=my_email_addreess@gmail.com github.user=userid core.repositoryformatversion=0 core.filemode=true core.bare=false core.logallrefupdates=true core.ignorecase=true remote.origin.url=ec2_id@my_e2_ip_address:express_app remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* 

更新(来自@ Jon的评论 ):

如果你的密钥是奇数path,只需运行ssh-add /private/key/path 。 这对我有效。

要将您的本地SSH密钥复制到亚马逊试试这个

 cat ~/.ssh/id_?sa.pub | ssh -i amazon-generated-key.pem ec2-user@amazon-instance-public-dns "cat >> .ssh/authorized_keys" 

当然,更换密钥和亚马逊ec2公共dns的名称。

你将能够在亚马逊上设置你的遥控器

这里列出的说明对我更有用。

从链接:

调整~/.ssh/config并添加:

 Host example Hostname example.com User myuser IdentityFile ~/.ssh/other_id_rsa 

现在使用ssh主机别名作为您的存储库:

 $ git remote add origin example:repository.git $ git pull origin master 

它应该使用other_id_rsa键!

在你的本地机器上,编辑〜/ .ssh / config并添加:

 Host example Hostname example.com User myuser IdentityFile ~/.ssh/YOURPRIVATEKEY 

你应该可以用“ssh example”login到你的实例。 记住你的私钥应该是chmod 400.一旦你可以在不使用“ssh -i mykey.pem username @ host”的情况下进入ssh,执行以下操作。

在您的EC2实例上,初始化一个裸仓库,用于专门推送。 约定是将扩展名“.git”添加到文件夹名称。 这可能会显示不同于您的“项目”文件夹中通常以.git文件夹的本地回购。 裸仓库(根据定义)没有连接到它们的工作树,因此您不能像在普通的非裸仓库中那样轻松地向它们添加文件。 这只是他们完成的方式。 在你的EC2实例上:

 mkdir project_folder.git cd project_folder.git git init --bare 

现在回到你的本地机器上,设置远程时使用ssh主机别名。

 git remote add ec2 EXAMPLEHOSTFROMSSHCONFIG:/path/to/project_folder.git 

现在,你应该能够做到:

 git push ec2 master 

现在你的代码被推送到服务器没有问题。 但是现在的问题是,ec2实例上的www文件夹不包含您的web服务器需要执行的实际“工作文件”。 所以,你需要设置一个“hook”脚本,当你推送到ec2时,脚本会执行。 该脚本将使用您的实际项目文件填充ec2实例上的相应文件夹。

所以,在你的ec2实例上,进入你的project_folder.git / hooks目录。 然后创build一个名为“post-receive”的文件,然后chmod 775它(它必须是可执行的)。 然后插入这个bash脚本:

 #!/bin/bash while read oldrev newrev ref do branch=`echo $ref | cut -d/ -f3` if [ "ec2" == "$branch" -o "master" == "$branch" ]; then git --work-tree=/var/www/example.com/public_html/ checkout -f $branch echo 'Changes pushed to Amazon EC2 PROD.' fi done 

现在,在你的本地机器上,做一个“git push ec2 master”,它应该将代码推送到裸回购站,然后post-receive hook脚本将检出你的文件到你的web服务器configuration读取的相应文件夹中。

您需要生成并上传一个SSH密钥到EC2实例。 按照这个教程: http : //alestic.com/2010/10/ec2-ssh-keys

  1. 在本地运行ssh-keygen
  2. 在您的本地 ~/.ssh/目录中,您现在应该会看到一个名为id_rsa.pub公用密钥文件 – 将此文件的内容复制到位于远程服务器上的/etc/ssh/authorized_keys文件中。

您可以复制并粘贴内容,或者先将file upload到远程服务器,然后使用以下命令:

cat id_rsa.pub >> /etc/ssh/authorized_keys

当通过源代码pipe理进行部署时,我得到的权限被拒绝 ,无法找出原因。 我意识到我的用户我创build了一个ssh密钥(名为ubuntu,也是我的ec2服务器的推荐login名)不是负责cap部署(root)的用户。 为root运行ssh-keygen并将该ssh密钥作为部署密钥上传到bitbucket解决了我的问题。

我知道我为时太晚,但我只是想分享这篇文章,在几秒钟内,我已经成功推到EC2的git回购

http://shirtdev.wordpress.com/2011/05/04/setting-up-a-git-repository-on-an-amazon-ec2-instance/

这是最简单的方法,对我来说很好…我在克隆存储库时遇到了问题…它不能识别我创build的SSH密钥…而不是更改您的configuration文件和所有这些,我只是复制REAL ssh键试图连接,我把这个添加到bitbucket …这里是命令:

  sudo vi /root/.ssh/id_rsa.pub 

使用VI打开REAL RSA密钥并复制内容并粘贴到bitbucket中…完成!

我想,我不会在这里发表任何新东西,但是我必须通过上面的答案来解决我的具体情况。 我在EC2上有一个Ubuntu实例。

要login到我的实例,我需要做的是:

 ssh -i "pemfile.pem" ubuntu@very-long-amazon-address 

密钥文件“pemfile.pem”必须在引号中。

我加了遥控器:

 remote add origin ubuntu@very-long-amazon-address/home/ubuntu/git/REPO/gitfile.git 

但是当我试图推动:

 git push origin master 

我有:

 Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 

为了解决,我做了:

 /<path to pemfile>/pemfile.pem 

这给了我一个回应,

 Identity added: /<path to pemfile>/pemfile.pem (/<path to pemfile>/pemfile.pem ) 

之后,推得很好。

我发现这是最快的方法: https : //gist.github.com/matthewoden/b29353e266c554e04be8ea2058bcc2a0

基本上:

ssh-add /path/to/keypair.pem (“ ssh-add /path/to/keypair.pem ”需要在ssh之后)

检查看它是否工作: ssh ubuntu@crazylongAWSIP (也许你的用户名不是Ubuntu的)

之后,你可以在你的ec2上build立一个git仓库并推送给它:

 git remote add origin ec2Username@long-crazy-amazon-ip.com:/path/to/your/repo-name.git git config --global remote.origin.receivepack "git receive-pack" # needed for aws ec2 stuff. git push origin master 

你的select是在ec2上build立一个“裸”的git仓库(这意味着其他git仓库可以从仓库中取出并推送到仓库,但它不会保存任何文件),或者你可以设置一个NORMAL仓库直接(我的首选,如果你想推动本地更改您的EC2,而不必不断ssh到你的ec2)。

如果你想在ec2上设置一个正常的回购,请到ec2中,在你想要的地方做一个git init ,然后这样做:

 git config receive.denyCurrentBranch updateInstead 

请参阅: 不能推入到Git仓库解释“接收拒绝当前分支”

对于任何可能感兴趣的人来说,这个解决scheme对我来说是最清洁和最简单的:

http://eric.sau.pe/accessing-a-git-repository-using-a-key-pair/