【问题标题】:Git push to cPanel account - Push did not update modified fileGit推送到cPanel帐户-推送未更新修改的文​​件
【发布时间】: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?

标签: linux git ssh ftp centos


【解决方案1】:

我的 cPanel 帐户也有类似的问题,设置了 git,但由于某种原因我无法推送它。经过大量的头疼后,我意识到问题的根源就像您指出的那样,尽管设置了 git,但 repo 是空的,因此没有任何东西可以跟踪。 当您在 cPanel 中设置一个空存储库然后尝试推送您已经创建的本地存储库时会发生这种情况,而不是先从 github 或本地存储库克隆它(这就是发生在我身上的事情,因为出于某种原因我不能'即使我设置了 SSH 密钥,也不能从 cPanel git 界面访问我的 github)

我找到的简单解决方案是使用您的 cPanel 帐户中的终端手动克隆 repo

在您的 cPanel 仪表板上的“高级”部分下,您会找到终端。您会收到一条警告,说如果您不知道自己在做什么,您可能会弄乱您的服务器,点击确定就可以了。

现在您只需像克隆到本地计算机时一样克隆您的存储库。

导航到您的 cPanel 中设置 git 的位置

cd repositories/<nameOfYourRepo>

然后运行克隆命令

git clone <URLofYourGithubReop>

如果是私有仓库,系统会要求你提供 github 用户名和密码

就是这样,你可以走了

【讨论】:

    【解决方案2】:

    您复制的 (my_project.git) 是一个裸仓库,这意味着没有工作树(实际签出的文件)。
    阅读例如“Git workflow - Setting up a build process”。

    这意味着推送到 if 不会改变 /home/myuser/public_html/ 中的任何内容

    缺少的部分是post-receive hook(在/home/myuser/public_html/my_project.git/hooks/post-receive 中,确保它是可执行的:chmod +x),以便签出/home/myuser/public_html/ 中的repo。

    #!/bin/sh
    GIT_WORK_TREE=/home/myuser/public_html GIT_DIR=/home/myuser/public_html/my_project.git git checkout -f
    

    【讨论】:

    • 注意:git 1.7.1 听起来很古老:你可以升级它 (stackoverflow.com/q/20111476/6309)
    • 谢谢,是的,版本号看起来很旧,但没有调查。认为这可能是库及其独立版本的变体。我会按照你的指示去做,看看我能让他们工作。我稍后会报告:)
    • 在您提供的“Git 工作流程 - 设置构建过程”链接中,我收集到我需要 cd 到“public_html”目录并运行 git pull。它还提到取消设置 GIT_DIR。我创建了一个 perl 脚本,将 chdir() 设置为 'public_html',并使用 system() 执行 'git pull /home/myuser/git-repos/my_project.git' - 注意:我将 my_project.git 移出将 web 目录放入 'git-repos'。我的问题是,我是否需要这样做,即:创建 post-receive.pl 来执行我刚才所说的操作,或者我只需要使用带有 1 行定义 GIT_WORK_TREE 和 GIT_DIR 的 bash 脚本?再次感谢!
    • @WadeShuler 不需要拉:我在下面的答案中写了一个可能的命令。结帐就足够了,因为public_html 不是 git repo。不要在这里使用 perl:简单的 bash 脚本就足够了。
    • 我没有看到最后的结帐 -f.. 更有意义.. brb
    猜你喜欢
    • 2020-01-17
    • 2017-02-25
    • 2012-03-02
    • 1970-01-01
    • 2013-08-28
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    相关资源
    最近更新 更多