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

dan*_*ast 6 git shallow-clone

我已经“浅化”了一个回购协议:

\n\n
FIRST_COMMIT="bf450342272a94117d78eae34a140a2a39359dad"\ngit rev-parse ${FIRST_COMMIT} > .git/shallow\ngit fsck --unreachable\ngit gc --prune=now\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我尝试推动:

\n\n
! [remote rejected] develop -> develop (shallow update not allowed)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我知道这个限制是由于回购协议很浅造成的。

\n\n

如何将浅层仓库转换为普通仓库?

\n\n

我不在乎失去旧历史。其实我丢掉旧历史

\n\n

为了澄清这一点:

\n\n
    \n
  • 我希望转换后的存储库保留提交历史记录,以及浅层存储库的元数据(日期、作者、提交消息...)
  • \n
  • 我想彻底丢掉旧历史
  • \n
  • 我不关心与原始存储库的兼容性:这将被视为新存储库
  • \n
  • 我不关心提交是否被重新创建,只关心元数据被保留。
  • \n
\n\n

编辑

\n\n

简单地删除该.git/shallow文件是行不通的:

\n\n
\xc2\xbb git push -f --set-upstream myorigin develop\nerror: Could not read d18d4a247bebd32a3b57b2c0e5f9c28749083211\nfatal: revision walk setup failed\nerror: remote unpack failed: eof before pack header was fully read\nerror: failed to push some refs to \'git@somehost:repos/somerepo.git\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑2

\n\n

尝试浅化fetch

\n\n
git fetch --unshallow\n
Run Code Online (Sandbox Code Playgroud)\n\n

仍然留下一个grafted回购协议:

\n\n
commit bf450342272a94117d78eae34a140a2a39359dad (grafted)\nAuthor: The author\nDate:   Thu Nov 29 16:55:05 2018 +0100\n\n    Chages by pre-commit hook (!?)\n
Run Code Online (Sandbox Code Playgroud)\n

Hug*_*ugo 8

来自“如何将 Git 浅克隆转换为完整克隆”

以下命令(git 版本 1.8.3)会将浅克隆转换为常规克隆:

git fetch --unshallow
Run Code Online (Sandbox Code Playgroud)

然后,访问 origin 上的所有分支(感谢评论中的@Peter)

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin
Run Code Online (Sandbox Code Playgroud)


dan*_*ast 2

已经有一个类似(相同?)的问题,有一个非常好的答案,也解决了我的问题。

基本上我需要执行以下操作:

git rev-parse --verify bf450342272a94117d78eae34a140a2a39359dad > .git/info/grafts
git filter-branch -f -- --all 
Run Code Online (Sandbox Code Playgroud)

这将使用指定的提交重写历史记录作为新的根。提交元数据不会受到影响(日期、所有者等),只会影响提交哈希以及提交之间的链接,以便新图从指定的根开始。

然后,该存储库将是unshallowed/ ungrafted,并且可以正常推送到新的遥控器,并减少历史记录。