我有一个在Git版本控制下的项目,我在服务器和本地电脑上都进行了工作。最初,我的远程源被设置为我的本地电脑,但现在我想将其更改为BitBucket。
在服务器上,我使用了以下命令:
git remote set-url origin bitbucket_address
但现在当我尝试推送我的项目时,出现了错误
! [remote rejected] master -> master (shallow update not allowed)
这是什么原因,我该如何修复?
我有一个在Git版本控制下的项目,我在服务器和本地电脑上都进行了工作。最初,我的远程源被设置为我的本地电脑,但现在我想将其更改为BitBucket。
在服务器上,我使用了以下命令:
git remote set-url origin bitbucket_address
但现在当我尝试推送我的项目时,出现了错误
! [remote rejected] master -> master (shallow update not allowed)
这是什么原因,我该如何修复?
看起来你已经使用 git clone --depth <number>
来克隆本地版本。这会导致一个 浅层克隆。这种克隆的限制之一是你无法将其推送到一个新的仓库。
现在你有两个选择:
那么,你想保留你的历史记录?这意味着你需要使你的仓库变为 非浅层克隆。如果你已经删除或替换了旧的远程仓库,那么就需要再次添加它:
git remote add old <path-to-old-remote>
然后我们使用 git fetch
命令,从旧的远程代码库中获取剩余的历史记录(正如此答案所建议的)。
git fetch --unshallow old
现在你应该能够推送到你的新远程代码库了。
注意:在取消深度克隆后,您可以删除旧的远程代码库。
git fetch --unshallow
命令可以接受一个 refspec 参数,以便只展开某个分支而不是整个仓库。例如:git fetch --unshallow origin refs/heads/mydeepbranch:refs/remotes/origin/mydeepbranch
。 - clackeclone --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如果你的 repo 是 origin
,而原始 repo 是 upstream
的话:
git fetch --unshallow upstream
如果你想保持仓库的现状并包含从浅层初始提交以来添加的新提交,另一个选项是: 使用交互式变基修改该提交。
通过以下方式开始包括第一个(根)提交的交互式变基:
git rebase --interactive --root
将初始提交的pick
更改为edit
,保存并关闭文件。
如果您克隆的存储库深度大于1,您可能需要对所有这些提交执行相同的操作。或者,您可以在交互式变基期间为所有这些提交执行fixup
。
使用以下命令将此提交转换为常规的非浅层提交:
git commit --amend --no-edit
这也将更改提交ID并将您添加为此初始提交的共同作者。
别忘了完成您的变基操作。
git rebase --continue
如果您想将新的repo推送为原样,可以尝试以下操作:
旧的git文件夹
,sudo rm -rf .git
git init
git remote add origin your-new-repo
git filter-branch -- --all
只使用 --unshallow 命令可能无效,因为存在 安全 问题。
git clone file://<path> <dirname> --depth=<N>
剪切历史记录来推送本地 repo。这种浅层克隆将无法推送,因为历史记录只会被嫁接隐藏。 filter-branch
将会删除它。 - Ferdinand Prantl如果使用Bitbucket Pipeline
可能是由于提交深度有限(默认为50个提交)
您可以增加限制
clone:
depth: 500 # include the last five hundred commits
pipelines:
default:
- step:
name: Cloning
script:
- echo "Clone all the things!"
如果您不关心远程现有更改,只需按以下方式解决此问题。
.git
文件夹。git init
。git remote add origin <REMOTE_URL>
。git branch -M main
设置 main
分支。git push --set-upstream origin main
。.gitconfig
文件中:[alias]
unshallow = !"git fetch --unshallow \"${1:-origin}\" # Unshallow from remote $1 (defaults to origin)"
使用方法:
git unshallow
# 基于 origin
远程仓库,将当前分支转换为非浅层克隆git unshallow other-remote
# 基于远程仓库 other-remote
,将当前分支转换为非浅层克隆只需删除 /.git/shallow 目录下的 shallow
文件即可。
现在应该可以正常工作了。
git clone --depth
命令吗? - Sascha Wolf.git
文件夹中应该有一个名为shallow
的文件。 - Sascha Wolfreceive.shallowUpdate
。 - milahu