更改Git远程URL后,拒绝远程(不允许进行浅更新)


163

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

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

git remote set-url origin bitbucket_address

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

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

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


3
您是如何克隆本地版本的?git clone --depth
Sascha Wolf

不久前,我不记得了。有没有办法找出来?
rwolst

2
shallow您的.git文件夹中应该有一个名为的文件。
Sascha Wolf

是的,我可以看到一个shallow文件。
rwolst

stackoverflow.com/a/50996201一个解决方案,只是丢弃(或重写)丢失的历史
CAW

Answers:


328

似乎您已经习惯git clone --depth <number>了克隆本地版本。这导致浅克隆。这种克隆的一个局限性是您不能将其从其中推送到新的存储库中。

您现在有两个选择:

  1. 如果您不关心自己当前的历史记录或缺少的历史记录,请查看此问题
  2. 如果您想保留完整的历史记录,请继续阅读:

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

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

之后,我们用来git fetch从旧的遥控器中获取剩余的历史记录(如本答案中所建议)。

git fetch --unshallow old

现在,您应该能够推送到新的远程存储库中。


注意取消克隆克隆后,显然可以再次删除旧的遥控器。


45
如果我克隆了一个启动项目却又不想/不需要整个历史怎么办?有办法避免吗?
itamar 2015年

9
@itamar这似乎是一个完全有效的新问题的很好的例子。您可以链接到该问题以供参考。
Sascha Wolf

14
当被问及作为新的问题stackoverflow.com/questions/29748197/...
伊塔马尔

2
请注意,git fetch --unshallow可以使用refspec仅取消特定分支而不是整个仓库。例如:git fetch --unshallow origin refs/heads/mydeepbranch:refs/remotes/origin/mydeepbranch
clacke

5
如果您要推动的某个存储库比克隆的任何存储库都落后一点,而不是创建一个全新的存储库,则您的本地引用足够深,可以包含远程引用。所以,如果你origin/master是超越你的20个提交oldrepo/master当你clone --depth 1“编吧,你已经17个本地提交,因为,这是足以让你做git fetch --depth 37 origin refs/heads/master:refs/remotes/origin/master(任何差一错误道歉),然后你可以做git push oldrepo master无事(可能需要git 1.9.0或更高版本)。
clacke 2015年

27

如果您的仓库是origin,原始仓库是upstream

git fetch --unshallow upstream

这对我有效,然后很容易获得最高投票的答案。
王茂生

11

如果您希望将存储库与从浅层初始提交以来添加的新提交保持原样,则可以采用以下方法:使用交互式rebase修改此提交

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

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

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

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

    git commit --amend --no-edit
    

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

  • 不要忘记完成基准

    git rebase --continue
    

谢谢!当原始存储库被删除并且您只有一个浅表副本时,它就像一个咒语一样工作。
Vitalii Dmitriev

9

如果您要按原样推送新存储库,可以尝试以下操作:

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

我发现这是一个更好的解决方案,因为它不需要推陈出新。有时这可能会在样板中发生。
rnpd


@NachPD我不确定您的意思,当您说其他解决方案需要“推陈出新”时。您是指获取而不是推送吗?因为它不需要推动。
Sascha Wolf

0

如果获取--unshallow不起作用。您的分支机构一定存在一些问题。在推入之前,请使用以下命令对其进行修复。

git filter-branch -- --all

仅使用--unshallow不能执行此操作,因为存在安全隐患。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.