将浅层仓库转换为普通仓库

时间:2019-01-16 08:58:27

标签: git shallow-clone

我已经“简化”了一个仓库:

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'

EDIT2

尝试与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 (!?)

2 个答案:

答案 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
相关问题