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

rwo*_*lst 145 git

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

在服务器上我使用了命令

git remote set-url origin bitbucket_address
Run Code Online (Sandbox Code Playgroud)

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

 ! [remote rejected] master -> master (shallow update not allowed)
Run Code Online (Sandbox Code Playgroud)

造成这种情况的原因是什么?如何解决?

Sas*_*olf 284

因为您似乎已经习惯git clone --depth <number>克隆本地版本.这导致浅克隆.这种克隆的一个限制是你无法从它推入新的存储库.

您现在有两个选择:

  1. 如果你不关心你当前或遗失的历史,请看看这个问题
  2. 如果您想保留完整的历史记录,请继续阅读:

那么,你想保留你的历史,嗯?这意味着您必须对存储库进行unhallow.为此,您需要再次添加旧遥控器.

git remote add old <path-to-old-remote>
Run Code Online (Sandbox Code Playgroud)

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

git fetch --unshallow old
Run Code Online (Sandbox Code Playgroud)

现在您应该能够进入新的远程存储库.


:后unshallowing你的克隆可以很明显的删除旧的远程一次.

  • 如果我克隆了一个启动项目并且我不想/需要整个历史怎么办?有没有办法避免它? (43认同)
  • 被问为新问题http://stackoverflow.com/questions/29748197/how-to-clone-seed-kick-start-project-without-the-whole-history (13认同)
  • @itamar这似乎是一个非常有效的新问题的好例子.您可以链接到此问题以供参考. (9认同)
  • 如果您要推送的回购有点落后于您克隆的任何回购,而不是创建一个全新的回购,那么您的本地引用足以包含远程引用就足够了.因此,如果你的`origin/master`在你的`oldrepo/master`之前是20次提交,当你克隆 - 深度为1'时,你已经做了17次本地提交,那么你就可以了.git fetch --depth 37 origin refs/heads/master:refs/remotes/origin/master`(对于任何一个错误的道歉),然后你可以做`git push oldrepo master`而不会发生任何事故(可能需要git 1.9) .0或更新). (4认同)
  • 请注意,`git fetch --unshallow`可以将refspec仅取消某个分支而不是整个repo.例如:`git fetch --unshallow origin refs/heads/mydeepbranch:refs/remotes/origin/mydeepbranch` (2认同)
  • @itamar delete /.git/(&package.json中的引用)和git init (2认同)

Dor*_*ian 19

如果你的回购是origin,原始回购是upstream:

git fetch --unshallow upstream
Run Code Online (Sandbox Code Playgroud)


小智 10

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

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

  • @NachPD,当您说另一个解决方案需要“推向旧的”时,我不确定您的意思。您的意思是获取而不是推送吗?因为它不需要推动。 (2认同)

Ren*_*ger 7

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

  • 使用以下命令启动交互式基础,包括第一次(根)提交

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

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

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

    git commit --amend --no-edit
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 别忘了完成基准

    git rebase --continue
    
    Run Code Online (Sandbox Code Playgroud)