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

我有一个Git版本控制下的项目,我在服务器和本地计算机上工作。我原来有远程起源设置为我的本地计算机,但我现在想把它改为BitBucket。

在服务器上使用该命令

git remote set-url origin bitbucket_address

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

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

是什么导致了这种情况,我如何解决它?

104326 次浏览

似乎你已经使用git clone --depth <number>来克隆你的本地版本。这将导致浅克隆。这种克隆的一个限制是你不能将它推入存储库。

你现在有两个选择:

  1. 如果你不关心你丢失的历史,看看这个问题
  2. 如果你想保留完整的历史,请继续阅读:

你想保留你的历史,是吗?这意味着你必须unshallow你的存储库。如果你已经移除或更换了旧的遥控器,那么你需要重新添加它:

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

之后,我们使用git fetch从旧远程获取剩余的历史记录(如这个答案中所建议的那样)。

git fetch --unshallow old

现在您应该能够将数据推入新的远程存储库。


请注意:在unshallowing你的克隆后,你可以删除旧的遥控器。

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

git fetch --unshallow upstream

如果你想推动新的回购,你可以试试这个:

  • 首先从当前的repo中删除old git foldersudo rm -rf .git
  • 然后重新初始化git 李git init < / >
  • 添加新的远程repo 李git remote add origin your-new-repo < / >
  • 然后推它。

另一个选项是:使用交互式rebase修改此提交,如果你想保持回购与你添加的新提交一样,因为浅的,初始的提交。

  • 开始一个交互式的rebase,包括第一次(根)提交

    git rebase --interactive --root
    
  • Change the pick of the initial commit(s) to edit and save & close the file.

    If you've cloned the repo with greater depth than 1, you may need to do the same for all of those commits. Or, alternatively, execute fixup for all of these during the interactive rebase.

  • Convert this commit to a regular, unshallow commit with

    git commit --amend --no-edit
    

    这也将改变提交ID,并将您添加为初始提交的合著者

  • 别忘了完成你的rebase

    git rebase --continue
    

如果取回。unshallow不起作用。你们的分行一定有问题。在推它之前,用下面的命令修复它。

git filter-branch -- --all

只使用——unshallow这样做是不行的,因为存在安全问题。

根据投票最多的答案,我创建了一个别名来自动化事情:

.gitconfig中添加:

[alias]
unshallow = !"git fetch --unshallow \"${1:-origin}\" # Unshallow from remote $1 (defaults to origin)"

用法:

  • 基于origin远程的__abc0#非浅电流分支
  • git unshallow other-remote #来自远程other-remote的非浅电流分支

为了简单地解决这个问题,如果您不关心远程现有的更改,那么按照以下方法进行。

  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

我解决了这个问题。但也许你无法修复它。解决方法如下。

  1. 从git中获取shallow文件,比如common/.git/shallow
  2. 把这个文件推到git服务器的。git目录下。
  3. 将分支推到git服务器。

在我的公司,我需要IT管理员添加文件,我没有权限。

只要删除你的/.git/shallow中的shallow文件

现在应该可以了。

如果是bitbucket管道

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

你可以增加限制

clone:
depth: 500       # include the last five hundred commits
  

pipelines:
default:
- step:
name: Cloning
script:
- echo "Clone all the things!"

注意:不限制使用深度:完全