首页 > 解决方案 > git remote 被拒绝 - 本地存储库

问题描述

如果我的 directory1 包含一系列文件并且受 git 控制,那么我运行 ..

git clone -l $HOME/directory1 directory2

我现在在我的 cwd 中有一个 directory1 的副本。

如果我然后在 directory2 中编辑一个文件,将它添加到暂存并提交它,我无法将它推送到 directory1,因为我收到错误..

remote: error: refusing to update checked out branch: refs/heads/master

我不明白这一点,因为远程分支(directory1)是最新的,并且在将其克隆到 directory2 和尝试将其推回 directory1 之间我没有对其进行更改。

编辑:如果我git status在 directory2 中运行,它会显示“您的分支比 origin/master 早 1 个提交”。

我还是不明白。

标签: gitgit-pushgit-clone

解决方案


您看到的错误是因为存储库中包含directory1当前签出分支的工作副本。master

此时,您有两个选择:

  1. 将 repodirectory1转换为裸存储库(即没有工作副本的存储库)
  2. 通过将选项设置为:告诉 Git 在directory1您推送时更新工作副本: directory2receive.denyCurrentBranchupdateInstead
    cd directory1
    git config receive.denyCurrentBranch updateInstead
    

您可以在文档中阅读有关此选项的更多信息:

如果设置为trueor refusegit-receive-pack将拒绝对非裸存储库的当前签出分支进行 ref 更新。这种推送具有潜在危险,因为它会使 HEAD 与索引和工作树不同步。

refuse是默认值,因此推送时会出错。关于updateInstead价值:

另一个选项是updateInstead如果推入当前分支将更新工作树。

如果您的目标是保持同步directory1directory2我会说这是更可取的选择。但是,请记住:

默认情况下,updateInstead如果工作树或索引与 HEAD 有任何差异,将拒绝推送。

这意味着如果您有未提交的更改directory1,则推送directory2将失败,因为它将覆盖索引和工作副本中的任何内容。


推荐阅读