【问题标题】:Git - Can't Push - "! [remote rejected] master -> master (Working directory has unstaged changes)"Git - 无法推送 - “![远程拒绝] master -> master(工作目录有未暂存的更改)”
【发布时间】:2018-07-02 22:40:28
【问题描述】:

我正在尝试为具有本地版本、暂存版本和生产版本的 Wordpress 安装设置“简单”的 git 工作流程。我想做的就是在本地进行更改,然后从本地推送到暂存,从本地推送到生产。起初我认为这将是一个简单的任务。我已经能够初始化存储库,添加两个遥控器“staging”和“production”,在遥控器上初始化 git,并通常使用以下命令将更改从我的本地版本推送到暂存和生产服务器:

git add .
git commit -m "some changes"
git push staging master
git push production master

但是,在我工作期间的某个时间点发生了一些变化,虽然我仍然能够推送到 Staging,但现在我无法推送到生产服务器而不收到错误:

! [remote rejected] master -> master (Working directory has unstaged changes)

当我执行“git status”时,它会说:

On branch master
nothing to commit, working tree clean

在阅读了 Stack Overflow 上几个相似但不同问题的答案后,我尝试了以下方法:

git pull staging master
git pull staging master --rebase
git pull production master
git pull production master --rebase

我也尝试在远程服务器上执行此命令

git config --local receive.denyCurrentBranch updateInstead

我已经完全重新创建了几次服务器和存储库,只是为了完全从头开始重新安装 git,但是这个问题在一段时间后一直在发生,此时 Git 实际上正在损害我的工作流程而不是帮助它。如果有人对我的错误有任何见解,将不胜感激!

【问题讨论】:

  • 您的生产仓库是否设置为裸仓库?
  • 您好,感谢您的建议。我尝试删除远程存储库并使用git init --bare 重新初始化它们,这在每个存储库中创建了裸存储库。但是,现在当我尝试执行 git push staging master 时,它说它完成了推送,但是更改后的文件实际上并没有进入我要推送到的文件夹中:-C
  • :(。请问您为什么要这样做?您可以只使用普通的旧 github 并将您的(Windows?)机器设置为 VSTS 构建客户端。任何时候您推送到在您的 github 上,VSTS 将自动在云端或生产/登台机器上“构建”您的代码。构建的最后一步是发布工件,如果您的生产/登台机器是构建代理,甚至不需要 FTP 或任何东西。
  • 更改后的文件实际上并没有进入我要推送到的文件夹中——当然他们没有。裸仓库是一个没有文件的仓库(没有工作树),它只包含 git 数据库。要从裸仓库签出文件,您需要从它克隆到非裸仓库。每次推送到裸仓库时再次从中提取。

标签: wordpress git git-push git-remote git-add


【解决方案1】:

我遇到了类似的问题,我在推送到一个非裸远程仓库时,我希望立即签出工作副本文件。

我的遥控器配置了receive.denyCurrentBranch updateInstead,但它仍然拒绝在不可预知的时间接受推送。

Git 2.4 添加了一个push-to-checkout 挂钩,可以覆盖此类推送失败。

我根据githooks documentation 中的示例编写了一个简短的脚本。

#!/bin/sh
set -ex
git read-tree --reset -u HEAD "$1"

我在远程仓库的.git/hooks/push-to-checkout 中安装了这个脚本。

请注意,此脚本会覆盖远程中的工作副本 - 它不会尝试合并对这些文件的任何更改。

那是因为我希望工作副本简单地反映 repo 中的文件。

【讨论】:

  • 谢谢!!!如果可以的话,我会投票 100 次。我唯一没有提到的事情是更改文件权限以使其可执行chmod +x push-to-checkout 然后它起作用了。
  • 请注意,如果您使用的是 cPanel,则需要手动创建 push-to-checkout 文件。
【解决方案2】:

制作一个 git 裸仓库是推送的最佳实践。
您可以推送到非裸机...但前提是您在从源端推送文件时不修改目标端的文件。见push-to-deploy

但最佳做法仍然是添加一个接收后挂钩 (as in my other answer),以便在实际文件夹中签出您收到的所有文件。

【讨论】:

    猜你喜欢
    • 2018-03-14
    • 1970-01-01
    • 2012-07-25
    • 2020-11-26
    • 2011-11-24
    • 2014-07-11
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多