我在Git版本控制下有一个项目,我在服务器和本地计算机上工作。我最初将远程原点设置为我的本地计算机,但我现在想将其更改为BitBucket。
在服务器上我使用了命令
git remote set-url origin bitbucket_address
但是现在当我尝试推动我的项目时,我得到了错误
! [remote rejected] master -> master (shallow update not allowed)
导致此问题的原因以及如何解决?
答案 0 :(得分:260)
您似乎已使用git clone --depth <number>
克隆本地版本。这导致浅克隆。此类克隆的一个限制是您无法将其推送到新存储库。
您现在有两个选择:
所以,你想保留你的历史,嗯?这意味着您必须 unshallow 您的存储库。为此,您需要再次添加旧遥控器。
git remote add old <path-to-old-remote>
之后我们使用git fetch
从旧遥控器中获取剩余的历史记录(如this answer中所述)。
git fetch --unshallow old
现在您应该能够进入新的远程存储库。
注意:取消克隆之后,您显然可以再次移除旧遥控器。
答案 1 :(得分:15)
如果您的回购是origin
,原始回购是upstream
:
git fetch --unshallow upstream
答案 2 :(得分:7)
如果您想按原样推送新回购,可以试试这个:
old git folder
sudo rm -rf .git
git init
git remote add your-new-repo
答案 3 :(得分:5)
如果您希望将存储库与添加的新提交保持不变,那么另一个选择是:使用交互式rebase修改此提交。
启动一个交互式基础,包括使用以下命令进行的第一次(根)提交
git rebase --interactive --root
将初始提交的pick
更改为edit
,然后保存并关闭文件。
使用
将此提交转换为常规的,浅表的提交git commit --amend --no-edit
这还将更改提交ID,并将您作为共同作者添加到此初始提交中。
如果克隆的存储库的深度大于1,则可能需要对所有这些提交执行相同的操作。或者,也可以在交互式变基期间对所有这些命令执行fixup
。
答案 4 :(得分:1)
如果获取--unshallow不起作用。您的分支机构一定存在一些问题。在推入之前,请使用以下命令对其进行修复。
git filter-branch -- --all
仅在--unshallow上执行此操作无效,因为存在SAFETY顾虑。
答案 5 :(得分: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
的当前分支