【问题标题】:Complete control via Git over deployment with Github private repo as main通过 Git 完全控制以 Github 私有 repo 为主的部署
【发布时间】:2020-06-27 10:07:57
【问题描述】:

我正在学习和调整集成 Git 的工作流程。我的愿望是能够将我的开发分支从我的本地终端推送到我的测试服务器。一旦我分支,我当前的设置就会给我一个错误。我觉得这不是一个错误,而是 Git 完成了它的工作,而我并没有完全理解它。 您能否解释为什么会发生这种情况以及如何避免?

Git“错误”

! [remote rejected] feature -> feature (branch is currently checked out)
error: failed to push some refs to (I hide the ssh server address)

我是怎么遇到这种情况的:

  • 在 github 上创建 repo
  • 包括从我的服务器通过 cpanel 生成的部署密钥
  • 本地机器上的 Git 克隆
  • 通过 SSH 在服务器上进行 Git 克隆
  • 将服务器作为远程服务器添加到作为测试的存储库中

流程

  • 在本地调整 master,将其推送到 github 和服务器都可以正常工作。但我的理解是,Git 的强大之处在于为“功能”创建一个分支 > 测试它 > 将其合并到 master 中。

  • 我在本地机器上创建了一个名为 feature 的分支

git checkout -b feature

  • 对 repo 进行一些更改并将其推送到源并进行测试

git add . git commit -m 'added index.html' git push origin feature (for backup/sync purposes) git push test feature (to be able so see my code working on the test server

  • 我必须“签出”新分支才能显示服务器上的文件,所以我通过 SSH 连接到我的服务器并签出新分支:

    git checkout feature

我的想法是,从现在开始,我可以在本地处理功能分支 > 提交调整并使用简单的推送命令 git push test feature 我可以在我的测试服务器上测试代码。

打破常规

但是现在我的流程被打破了。在我检查服务器上的功能分支后,我无法将调整后的分支推送到远程测试。 Git 返回如上所示的消息。

【问题讨论】:

    标签: git github deployment version-control web-deployment


    【解决方案1】:

    通过 SSH 在服务器上进行 Git 克隆

    您仍需要通过 SSH 会话在该服务器上添加:

    cd /path/to/cloned/repo
    git config --local receive.denyCurrentBranch updateInstead
    

    意思是,使用 Git 2.4 或更高版本,using a push-to-deploy,以便允许 git push 直接更新签出工作树。
    通常,您宁愿推送到裸存储库:参见“What is a bare repository and why would I need one?”,并使用post-receive hook with a checkout
    即:一个名为post-receive 的可执行文件(chmod 775),位于“myrepo.git/hooks”文件夹中,详细信息为in the discussion
    myrepo.git 是服务器上您的仓库的 git clone --bare : 你可以推到它。

    【讨论】:

    • 感谢您的回复@VonC,您为我指明了一个有趣的方向。我将阅读推送部署和裸存储库。
    • @Ole 没问题。请注意,点赞比感谢按钮更重要。
    • 我已经阅读了您的信息,我认为从信息中可以满足我的需求。我能够将我的仓库的裸版本克隆到我的服务器'git clone --bare [url repo github]' 正在创建一个文件夹'name repo.git',其中没有任何项目文件。当我从本地机器推送到仓库时:'git push [name remote] [name branch]' = 一切都是最新的,但没有文件被推送(我理解,因为我认为使用裸仓库我是断开连接)。我想我已经创建了一个裸机,但不知道如何推送/更新以进行部署。你知道吗?
    • @Ole 为了清楚起见,一个裸仓库仍然有文件:refs/objects/ 中的 internal 文件,...。您需要添加一个 @ 987654332@ hooks 文件夹中的钩子,以便在推送后签出这些文件。
    • @Ole Pushing to a bare 意味着只需在您的推送 URL 中使用 repo.git 文件夹路径。 post-receive 钩子,至少通过一个简单的回显,可以确认您何时成功推送 new 提交。
    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 2017-01-09
    • 2011-10-30
    • 2020-08-24
    • 2022-06-18
    • 2019-11-27
    • 1970-01-01
    • 2015-12-06
    相关资源
    最近更新 更多