我已经“简化”了一个仓库:
FIRST_COMMIT="bf450342272a94117d78eae34a140a2a39359dad"
git rev-parse ${FIRST_COMMIT} > .git/shallow
git fsck --unreachable
git gc --prune=now
现在我尝试推动:
! [remote rejected] develop -> develop (shallow update not allowed)
我知道此限制是由于回购协议很浅所致。
如何将浅层回购转换为普通回购?
我不在乎失去旧的历史。其实,我想失去过去的历史
为澄清这一点:
仅删除.git/shallow
文件不起作用:
» git push -f --set-upstream myorigin develop
error: Could not read d18d4a247bebd32a3b57b2c0e5f9c28749083211
fatal: revision walk setup failed
error: remote unpack failed: eof before pack header was fully read
error: failed to push some refs to 'git@somehost:repos/somerepo.git'
尝试与fetch
合并:
git fetch --unshallow
仍然留下grafted
回购:
commit bf450342272a94117d78eae34a140a2a39359dad (grafted)
Author: The author
Date: Thu Nov 29 16:55:05 2018 +0100
Chages by pre-commit hook (!?)
答案 0 :(得分:1)
已经有一个类似的question,具有非常好的answer,也可以解决我的问题。
基本上,我需要执行以下操作:
git rev-parse --verify bf450342272a94117d78eae34a140a2a39359dad > .git/info/grafts
git filter-branch -f -- --all
这将用指定的提交作为新的根目录重写历史记录。提交元数据将不会受到影响(日期,所有者,...),仅提交哈希和提交之间的链接将不会受到影响,因此新图将从指定的根开始。
然后,回购将是unshallowed
/ ungrafted
,并且通常可以将其推送到新的遥控器上,从而减少历史记录。
答案 1 :(得分:1)
来自"How to convert a Git shallow clone to a full clone":
以下命令(git版本1.8.3)会将浅表克隆转换为常规克隆:
git fetch --unshallow
然后,可以访问原始站点上的所有分支(感谢评论中的@Peter)
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin