【问题标题】:Remote rejected (shallow update not allowed) after changing Git remote URL更改 Git 远程 URL 后远程拒绝(不允许浅更新)
【发布时间】:2015-05-13 01:53:22
【问题描述】:

我有一个受 Git 版本控制的项目,我在服务器和本地计算机上工作。我最初将远程源设置为我的本地计算机,但现在我想将其更改为 BitBucket。

在我使用命令的服务器上

git remote set-url origin bitbucket_address

但是现在当我尝试推送我的项目时,我得到了错误

 ! [remote rejected] master -> master (shallow update not allowed)

这是什么原因造成的,我该如何解决?

【问题讨论】:

  • 您是如何克隆本地版本的? git clone --depth?
  • 那是很久以前的事了,我不记得了。有没有办法查出来?
  • 你的.git文件夹中应该有一个名为shallow的文件。
  • 是的,我可以看到一个shallow 文件。
  • 查看stackoverflow.com/a/50996201 的解决方案只是丢弃(或重写)丢失的历史记录

标签: git


【解决方案1】:

您似乎已使用git clone --depth <number> 克隆您的本地版本。这会导致浅克隆。这种克隆的一个限制是您不能将其推送到 new 存储库中。

您现在有两个选择:

  1. 如果你不在乎你错过了历史,看看this question
  2. 如果您想保留完整的历史记录,请继续阅读:

所以,你想保留你的历史,是吗?这意味着您必须unshallow您的存储库。为此,您需要再次添加旧遥控器。

git remote add old <path-to-old-remote>

之后,我们使用git fetch 从旧遥控器中获取剩余的历史记录(如this answer 中所建议的那样)。

git fetch --unshallow old

现在您应该可以推送到新的远程存储库了。


注意unshallowing您的克隆后,您显然可以再次移除旧遥控器。

【讨论】:

  • 如果我克隆了一个启动项目并且我不想要/不需要整个历史记录怎么办?有办法避免吗?
  • @itamar 这似乎是一个非常有效的新问题的好例子。您可以链接到此问题以供参考。
  • 请注意,git fetch --unshallow 可以采用 refspec 仅取消浅化某个分支而不是整个 repo。例如:git fetch --unshallow origin refs/heads/mydeepbranch:refs/remotes/origin/mydeepbranch
  • 如果你推送到一个比你克隆的任何 repo 稍晚的 repo,而不是创建一个全新的 repo,你的本地引用足够深以包含远程引用就足够了。因此,如果您的 origin/master 在您 clone --depth 1 编辑它时比您的 oldrepo/master 提前 20 次提交,并且您已经进行了 17 次本地提交,那么您执行 git fetch --depth 37 origin refs/heads/master:refs/remotes/origin/master 就足够了(对任何偏离的人表示歉意-一个错误),然后您可以毫无意外地执行git push oldrepo master(可能需要git 1.9.0或更高版本)。
【解决方案2】:

如果您的 repo 是 origin,而原始 repo 是 upstream

git fetch --unshallow upstream

【讨论】:

  • 这对我有用,而且很简单,然后是投票最多的答案。
【解决方案3】:

如果您想将 repo 与自浅层初始提交以来添加的新提交保持原样,则另一个选项是:使用交互式 rebase 修改此提交

  • 启动一个交互式变基,包括第一个(根)提交

    git rebase --interactive --root
    
  • 将初始提交的 pick 更改为 edit 并保存并关闭文件。

    如果您克隆了深度大于 1 的 repo,您​​可能需要对所有这些提交执行相同的操作。或者,或者,在交互式 rebase 期间对所有这些执行 fixup

  • 将此提交转换为常规的非浅层提交

    git commit --amend --no-edit
    

    这还将更改提交 ID,并将您作为共同作者添加到此初始提交。

  • 别忘了完成你的变基

    git rebase --continue
    

【讨论】:

  • 谢谢!当原始存储库被删除并且您只有一个浅拷贝时,它就像一个魅力。
【解决方案4】:

如果你想按原样推送新的 repo,你可以试试这个:

  • 首先从你当前的仓库中删除old git foldersudo rm -rf .git
  • 然后再次初始化git git init
  • 然后添加新的远程仓库 git remote add your-new-repo
  • 然后推送。

【讨论】:

  • 我发现这是一个更好的解决方案,因为它不需要推动旧的。有时这可能发生在样板文件中。
  • 这基本上是related question which you can find here的答案。
  • @NachPD 我不确定您的意思,当您说其他解决方案需要“推向旧时”时。你的意思是获取而不是推送?因为它不需要推送。
【解决方案5】:

如果获取 --unshallow 不起作用。你的分支肯定有问题。在推送之前使用以下命令修复它。

git filter-branch -- --all

仅使用 --unshallow 执行此操作不起作用,因为存在 SAFETY 问题。

【讨论】:

    【解决方案6】:

    根据最受好评的答案,我创建了一个别名来自动化操作:

    添加到您的.gitconfig

    [alias]
        unshallow = !"git fetch --unshallow \"${1:-origin}\" # Unshallow from remote $1 (defaults to origin)"
    

    用法:

    • git unshallow # 基于origin远程的unshallow当前分支
    • git unshallow other-remote # unshallow 当前分支来自远程 other-remote

    【讨论】:

      【解决方案7】:

      如果您不关心远程现有更改,只需按以下方式解决此问题。

      1. 从存储库中删除本地 .git 文件夹。
      2. 输入git init
      3. 再次添加您的遥控器git remote add origin &lt;REMOTE_URL&gt;
      4. main 分支设置为git branch -M main
      5. 推送您的更改,然后git push --set-upstream origin main

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-27
        • 2020-12-15
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        • 2016-01-10
        • 2014-07-11
        • 2015-02-21
        相关资源
        最近更新 更多