【发布时间】:2015-03-14 17:23:45
【问题描述】:
下面的解决方案 - 如何使用 git 推送到 cpanel 服务器
我终于在我的本地主机(Windows 8.1 上的 WAMP 设置)和我的 Linux 服务器(CentOS 6.6 x64 和 cPanel 11.46.2)之间设置了 Git。
我在本地创建了一个裸克隆:git clone --bare my_project my_project.git
注意:my_project 是示例名称,而不是真实名称,来自此文档:http://git-scm.com/book/en/v2/Git-on-the-Server-Getting-Git-on-a-Server
我将 my_project.git 文件夹复制到服务器的根目录 /home/myuser/public_html/
所以现在在我的根目录中:
- cgi-bin
- my_project.git
这是我不确定的一个领域。我是否必须在 public_html 目录中的服务器上进行初始化(使用 putty)?我读过一些关于裸初始化的东西?我只想(从我的电脑)将我已经在 Git 控制下的网站推送到服务器。当我对 1 个文件进行更改时,将该更改推送到服务器,以便通过推送实时更新。该网站已完成并准备上线。我已经手动来回移动以在服务器上进行实时测试。我的最后一步是正确设置 Git,因此任何进一步的更改我都可以将它们推送到服务器而无需 FTP。
我添加了一个远程源:git remote add origin ssh://myuser@thedomain.com/home/myuser/public_html/my_project.git
我试图推动它,并得到“权限被拒绝(公钥)”。我的 PC 上本地已经有一个 id_rsa 和 id_rsa.pub 密钥,所以我复制了它们并将它们重命名为 id_rsa.myname id_rsa.myname.pub (其中 myname 是我的名字)。然后我通过 FTP 将它们复制到 .ssh 文件夹(FTP 作为 cpanel 用户,它是您转储到的目录,位于 public_html 之上),与 /home/myuser/.ssh/ 目录相同。
一旦他们在那里,我使用以 cpanel 用户(我的私人 ppk)身份登录的 Putty 将它们添加到“authorized_keys”,方法是:
cd .ssh
cat id_rsa.myname >> ~/.ssh/authorized_keys
cat id_rsa.myname.pub >> ~/.ssh/authorized_keys
这样做之后,推送似乎起作用了。因为我遇到了密钥/身份验证问题,所以我使用了 Git Gui 版本,该版本已在本地设置并运行良好。我通过 Git Bash 添加了起源。当我在 Gui 版本中执行“Remote > Push”时,我得到了:
Pushing to ssh://theregistrybank@theregistrybank.com/home/theregistrybank/public_html/yiire gistrybank.git
stdin: is not a tty
To ssh://myuser@thedomain.com/home/myuser/public_html/my_project.git
44ae034..0388a05 master -> master
updating local tracking ref 'refs/remotes/origin/master'
在进行推送之前,唯一修改的文件(与我传输到服务器的裸克隆的差异)是我的 .gitignore 文件。我又添加了 2 个排除项,并在本地提交。所以我试图推动该文件中的更改。在我推动之后,它以绿色显示“成功”并且似乎工作。但是,当我在 FileZilla 中查看文件时,.gitignore 文件并不是我刚刚在本地提交的更新文件。
我想我已经接近了,但在某个地方错过了一步。我尽量做到描述性。
并且将源代码放在 GitHub 上不是一种选择,因为客户不希望源代码公开,也不想为私有存储库付费。我应该能够从我的本地设置推送到 cPanel 服务器,这样我就不必每次都传输数千个文件。我实际上传输了一个 zip 文件,然后在服务器上解压缩。哈哈。
服务器信息
- cPanel 11.46.2 build 0
- CentOS 6.6 x86_64 kvm build01
是的,Git 已在服务器上设置,并且正在运行,并且 git --version 报告:git 版本 1.7.1
我的 PC 上的 Git:git 版本 1.9.4.msysgit.2
提前谢谢你。
解决方案
感谢@VonC,我能够让它工作:)
你需要某个地方来放置你的 git 存储库。我在“/home/cpaneluser/git-repos”中创建了一个“git-repos”文件夹来存放这个 cpanel 用户的存储库。
第一步是创建一个bare repo:http://git-scm.com/book/en/v2/Git-on-the-Server-Getting-Git-on-a-Server - 我只按照第一步,基本上创建了bare repo 'my-project.git'
在将它放到你的服务器上之前,将“my-project.git/hooks/post-receive.sample”重命名为“post-receive”,这样它就会运行。用你的编辑器编辑它,并添加@VonC 在他选择的答案中给我们的那行:
#!/bin/sh
umask 0022
GIT_WORK_TREE=/home/cpaneluser/public_html GIT_DIR=/home/cpaneluser/git-repos/my-project.git git checkout -f
注意:我使用的是cpanel,所以你的路径可能不同,你的umask也可能不同。 0022 用于 0644 文件权限。如果没有 umask,我会收到 500 个内部服务器错误,因为这些文件是使用 0664 权限创建的。
使用 FTP 或任何您喜欢的方式,将“my-project.git”裸仓库复制到您的服务器到“/home/cpaneluser/git-repos”。然后进入 'my-project.git/hooks' 并将 post-receive 的权限更改为具有执行权限。对我来说,0744 工作得很好。这是神奇的酱汁:)
在本地,添加你的远程(必须在你的 git 项目中): git remote set-url origin ssh://cpaneluser@yourdomain.com/home/cpaneluser/git-repos/my-project.git
现在,如果您现在尝试推送,它不会将文件放在“public_html”中,因为 git 树(术语?)匹配并且是最新的。如果它们是最新的,它似乎会跳过执行您的“接收后”挂钩。这意味着您的 bash 脚本从未运行过,也从未将文件检出到您的工作树中。
我们需要手动运行 'post-receive' bash 脚本来在 'public_html' 目录下创建我们项目的所有文件。
cd 到'/home/cpaneluser/git-repos/my-project.git/hooks'
运行:./post-receive
Boom,您所有的文件都在“public_html”中。现在您可以在本地工作,然后按预期推送到您的 cpanel 服务器 :)
【问题讨论】:
-
在你的最后一行,你的意思是,运行:
./post-update?