更改Git远程URL后出现“Remote rejected (shallow update not allowed)”错误

266

我有一个在Git版本控制下的项目,我在服务器和本地电脑上都进行了工作。最初,我的远程源被设置为我的本地电脑,但现在我想将其更改为BitBucket。

在服务器上,我使用了以下命令:

git remote set-url origin bitbucket_address

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

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

这是什么原因,我该如何修复?


4
你是如何克隆本地版本的?使用了 git clone --depth 命令吗? - Sascha Wolf
那是一段时间之前,我记不起来了。有办法找出来吗? - rwolst
2
你的 .git 文件夹中应该有一个名为 shallow 的文件。 - Sascha Wolf
是的,我能看到一个“shallow”文件。 - rwolst
请参考 https://dev59.com/VVUL5IYBdhLWcg3wAECj#50996201 中的解决方案,该方案可以丢弃(或重写)缺失的历史记录。 - caw
最好在Git服务器上启用receive.shallowUpdate - milahu
10个回答

484

看起来你已经使用 git clone --depth <number> 来克隆本地版本。这会导致一个 浅层克隆。这种克隆的限制之一是你无法将其推送到一个新的仓库。

现在你有两个选择:

  1. 如果你不关心你丢失的历史记录,可以查看这个问题
  2. 如果你想保留全部历史记录,请继续阅读:

那么,你想保留你的历史记录?这意味着你需要使你的仓库变为 非浅层克隆。如果你已经删除或替换了旧的远程仓库,那么就需要再次添加它:

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

然后我们使用 git fetch 命令,从旧的远程代码库中获取剩余的历史记录(正如此答案所建议的)。

git fetch --unshallow old

现在你应该能够推送到你的新远程代码库了。


注意:在取消深度克隆后,您可以删除旧的远程代码库。


61
如果我克隆了一个启动项目,但我不需要或不想要整个历史记录,有没有办法避免克隆整个历史记录? - itamar
10
这似乎是一个非常好的新问题示例。您可以提供这个问题的链接作为参考。 - Sascha Wolf
17
如何克隆种子/启动项目但不包含整个历史记录?请问如何克隆一个种子/启动项目但不包含整个历史记录? - itamar
5
请注意,git fetch --unshallow 命令可以接受一个 refspec 参数,以便只展开某个分支而不是整个仓库。例如:git fetch --unshallow origin refs/heads/mydeepbranch:refs/remotes/origin/mydeepbranch - clacke
5
如果你正在向一个比你克隆的仓库稍微滞后一些的仓库推送代码,而不是创建一个全新的仓库,那么你本地的引用足够深,以包含远程引用。因此,如果当你使用 clone --depth 1 克隆时,你的 origin/master 比你的 oldrepo/master 要超前20个提交,而你之后又进行了17次本地提交,那么你只需要执行 git fetch --depth 37 origin refs/heads/master:refs/remotes/origin/master (对于任何误差请谅解),然后你就可以毫无问题地执行 git push oldrepo master(可能需要 Git 版本 1.9.0 或更高版本)。 - clacke
显示剩余2条评论

54

如果你的 repo 是 origin,而原始 repo 是 upstream 的话:

git fetch --unshallow upstream

1
这对我很有效,而且比得到最高票的答案容易。 - Maosheng Wang

28

如果你想保持仓库的现状并包含从浅层初始提交以来添加的新提交,另一个选项是: 使用交互式变基修改该提交

  • 通过以下方式开始包括第一个(根)提交的交互式变基:

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

    如果您克隆的存储库深度大于1,您可能需要对所有这些提交执行相同的操作。或者,您可以在交互式变基期间为所有这些提交执行fixup

  • 使用以下命令将此提交转换为常规的非浅层提交:

    git commit --amend --no-edit
    

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

  • 别忘了完成您的变基操作。

    git rebase --continue
    

谢谢!当原始存储库被删除且您只有其浅层副本时,它的工作效果就像魅力一样。 - Vitalii Dmitriev
致命错误:没有正在进行的变基? - CS QGB
错误:src refspec main 不符合任何内容 - CS QGB

17

如果您想将新的repo推送为原样,可以尝试以下操作:

  • 首先从当前repo中删除旧的git文件夹sudo rm -rf .git
  • 然后重新初始化git git init
  • 然后添加新的远程repo git remote add origin your-new-repo
  • 最后Push它。

我发现这是一个更好的解决方案,因为它不需要推送到旧的版本。有时候使用样板文件可能会出现这种情况。 - rnpd
这基本上就是与此相关的问题的答案,您可以在这里找到它:https://dev59.com/H10a5IYBdhLWcg3w-80i。 - Sascha Wolf
2
@NachPD,我不确定你的意思是什么,当你说另一个解决方案需要“推送到旧版本”时。你是指需要拉取而不是推送吗?因为它并不需要推送。 - Sascha Wolf

4
如果执行“git fetch --unshallow”命令无效,那么你的分支可能存在问题。在推送之前,请使用以下命令修复分支。
git filter-branch -- --all

只使用 --unshallow 命令可能无效,因为存在 安全 问题。


这将帮助您通过 git clone file://<path> <dirname> --depth=<N> 剪切历史记录来推送本地 repo。这种浅层克隆将无法推送,因为历史记录只会被嫁接隐藏。 filter-branch 将会删除它。 - Ferdinand Prantl

1

如果使用Bitbucket Pipeline

可能是由于提交深度有限(默认为50个提交)

您可以增加限制

clone:
  depth: 500       # include the last five hundred commits
  
pipelines:
  default:
    - step:
        name: Cloning
        script:
          - echo "Clone all the things!"

注意:使用 depth: full 表示没有限制。

1
我解决了这个问题。但是你可能无法解决它。解决方案如下:
  1. 从git获取浅显文件,例如common/.git/shallow
  2. 将此文件推送到git服务器上的.git目录中。
  3. 将您的分支推送到git服务器。
在我的公司中,我需要IT管理员添加该文件,而我没有权限。

0

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

  1. 从存储库中删除本地的 .git 文件夹。
  2. 键入 git init
  3. 再次添加您的远程仓库 git remote add origin <REMOTE_URL>
  4. 通过 git branch -M main 设置 main 分支。
  5. 然后推送您的更改 git push --set-upstream origin main

致命错误:无效的分支名称:“HEAD” - CS QGB

0
根据最受赞同的答案,我创建了一个别名来自动化一些操作:
将以下内容添加到你的.gitconfig文件中:
[alias]
    unshallow = !"git fetch --unshallow \"${1:-origin}\" # Unshallow from remote $1 (defaults to origin)"

使用方法:

  • git unshallow # 基于 origin 远程仓库,将当前分支转换为非浅层克隆
  • git unshallow other-remote # 基于远程仓库 other-remote,将当前分支转换为非浅层克隆

-1

只需删除 /.git/shallow 目录下的 shallow 文件即可。

现在应该可以正常工作了。


!git push -f https://{repo} main 致命错误:无法获取凭据存储锁定:文件已存在 计数对象:347,完成。 使用最多4个线程进行增量压缩。 正在压缩对象:100%(245/245),完成。 正在写入对象:100%(347/347),56.28 MiB | 1.56 MiB/s,完成。 共计347个(增量153个),重用250个(增量99个) 远程:正在解决增量:100%(153/153),完成。 远程:致命错误:未收到预期的对象2aaa07546a89ead5a106b6ed48beb3ce3a485c8a 错误:解包失败:索引包失败 推送到https://github.com/ ![拒绝接受] main -> main(失败) 错误:未能将某些引用推送到 - CS QGB
git fetch --unshallow https://github.com/ 可以解决上述问题。 - CS QGB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接