【问题标题】:git remote rejected - local repositoriesgit remote 被拒绝 - 本地存储库
【发布时间】:2020-12-13 02:07:53
【问题描述】:

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

git clone -l $HOME/directory1 directory2

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

如果我随后编辑目录 2 中的文件,将其添加到暂存并提交,我无法将其推送到目录 1,因为我收到错误..

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

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

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

我还是不明白。

【问题讨论】:

标签: git git-push git-clone


【解决方案1】:

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

此时,您有两个选择:

  1. directory1 中的存储库转为bare repository(即没有工作副本的存储库)
  2. 通过将receive.denyCurrentBranch 选项设置为updateInstead 来告诉Git 从directory2 推送时更新directory1 中的工作副本:
    cd directory1
    git config receive.denyCurrentBranch updateInstead
    

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2023-03-29
    • 2012-10-17
    • 2016-02-21
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多