如何推动EC2上的git

时间:2011-01-08 06:39:59

标签: git amazon-ec2

我正在尝试遵循this指令。我有一个本地git repo,当我进行git推送时,我需要将repo推送到我的EC2实例。

但是,在上面的教程中,当我执行git push origin master时,我收到Permission denied (publickey)错误,因为我没有指定身份文件。

说,我这样登录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的comment):

如果您的钥匙在奇数路径中,请运行ssh-add /private/key/path。这对我有用。

11 个答案:

答案 0 :(得分:47)

要将本地ssh密钥复制到亚马逊,请尝试使用

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

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

然后您就可以在亚马逊上设置遥控器了

答案 1 :(得分:27)

列出的here说明对我来说更有用。

从链接:

调整~/.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键!

答案 2 :(得分:19)

在本地计算机上,编辑〜/ .ssh / config并添加:

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

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

在您的EC2实例上,初始化一个裸存储库,用于独占推送。惯例是将扩展名“.git”添加到文件夹名称。这可能与您的“project”文件夹中通常具有.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服务器需要执行的实际“工作文件”。因此,您需要设置一个“钩子”脚本,当您推送到ec2时将执行该脚本。此脚本将使用您的实际项目文件填充ec2实例上的相应文件夹。

因此,在您的ec2实例上,进入您的project_folder.git / hooks目录。然后创建一个名为“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服务器配置的相应文件夹中阅读。

答案 3 :(得分:5)

您需要生成并将SSH密钥上传到EC2实例。请遵循本教程:http://alestic.com/2010/10/ec2-ssh-keys

答案 4 :(得分:2)

  1. 在本地运行ssh-keygen
  2. 本地 ~/.ssh/目录中,您现在应该看到一个名为id_rsa.pub公钥文件 - 将此文件的竞争内容复制到{ {1}}文件,位于远程服务器上。
  3. 您可以复制并粘贴内容,也可以先将文件上传到远程服务器,然后使用以下命令:

    /etc/ssh/authorized_keys

答案 5 :(得分:1)

我想,我不会在这里张贴任何新内容,但我必须深入研究上述答案,以解决我的具体案例。我在EC2上有一个Ubuntu实例。

要登录我的实例,我需要这样做:

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 )

之后,推动工作顺利。

答案 6 :(得分:1)

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

基本上:

ssh-add /path/to/keypair.pem(&#34; -add&#34;需要在ssh后正确)

检查它是否有效:ssh ubuntu@crazylongAWSIP(也许你的用户名不是ubuntu)

之后你可以在你的ec2上设置一个git repo并推送到它:

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

您可以选择设置“裸露”。你的ec2上的git repo(这意味着其他git repos可以从中拉出并推送到它,但它不会保存任何文件),或者你可以设置一个NORMAL repo并直接推送到它(我的偏好,如果你想要将本地更改推送到您的ec2,而不必经常ssh到您的ec2)。

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

git config receive.denyCurrentBranch updateInstead

请参阅:cannot push into git repository以解释&#34;收到拒绝当前分支&#34;

答案 7 :(得分:0)

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

答案 8 :(得分:0)

我知道我已经太晚了,但我只是想分享这篇文章,在几秒钟内我就成功推向了EC2 git repo

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

答案 9 :(得分:0)

以下是最适合我的EASIEST方式...... 我无法克隆存储库...它没有识别我创建的SSH密钥...而不是更改配置文件和所有这些,我只是复制了它试图连接的REAL ssh密钥,我将其添加到bitbucket ......这是命令:

 sudo vi /root/.ssh/id_rsa.pub

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

答案 10 :(得分:-2)

对于其他可能感兴趣的人来说,这个解决方案对我来说是最干净,最简单的:

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