如何推动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
- 在本地运行
ssh-keygen
- 在您的本地
~/.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/