Git - 无法推送 - “![远程拒绝] master -> master(工作目录有未暂存的更改)”

问题描述 投票:0回答:3

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

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

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

! [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 实际上正在损害我的工作流程,而不是帮助它。如果有人知道我的错误是什么,我将不胜感激!

wordpress git git-push git-remote git-add
3个回答
16
投票

我的遥控器配置了

receive.denyCurrentBranch updateInstead

,但它仍然拒绝在不可预测的时间接受推送。


Git 2.4 添加了一个

push-to-checkout

钩子,它可以覆盖此类推送失败。 我根据

githooks 文档

中的示例编写了一个简短的脚本。 #!/bin/sh set -ex git read-tree --reset -u HEAD "$1"

我将此脚本安装在我的远程存储库中的 
.git/hooks/push-to-checkout

中。


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

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


1
投票
您可以推送到非裸文件...但前提是您在从源端推送文件时没有修改目标端的文件。请参阅

推送部署
但最佳实践仍然是添加接收后挂钩(

如我的其他答案

),以便在实际文件夹中签出您收到的所有文件。


0
投票

我已经放弃这个了~10个月了。他们的回应是我需要意识到我需要启用现有的

push-to-checkout

钩子。

当没有任何更改时,我看到推送失败(带有 

Working directory has unstaged changes

错误)。

启用示例 

push-to-checkout

钩子后,我再次能够推送,并且当存在本地更改时我看到了拒绝。

在我的实例中,我更新了失败案例:

die "Working directory has unstaged changes"

    git add .
    git commit -m "Save Server Satate"
    die "Working directory had unstaged changes. Fetch to retrieve latest."

这模仿了本地和远程头不同步的任何其他共享分支工作流程,鼓励在推送更新之前在本地解决任何冲突。

© www.soinside.com 2019 - 2024. All rights reserved.