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

6

我已经克隆了一个仓库:

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'

编辑2

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

我相信你想要的是 git fetch --unshallow - Owen Delahoy
@OwenDelahoy fetch 从哪里获取?没有远程可以获取。该存储库目前是本地的。也就是说,我正在尝试推送到一个新的远程,它没有历史记录,并且我没有克隆。在这种情况下,“fetch”是什么意思? - blueFast
@OwenDelahoy 那是我想要“推送”的新远程,从中获取没有意义吗? - blueFast
@OwenDelahoy 尝试获取,没有运气。 - blueFast
可能不被建议,但你可以强制使本地历史记录与远程历史记录匹配,你可以使用 git reset --soft develop/master,确保立即提交所有文件并推送所有文件。如果需要恢复历史记录,你应该能够再次使用 git reflog 中的提交哈希进行软重置。 - Owen Delahoy
显示剩余2条评论
2个回答

8

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

以下命令 (git版本 1.8.3) 可将浅克隆转换为完整克隆:

git fetch --unshallow

然后,为了访问所有在远程仓库(感谢评论区的 @Peter)上的分支:
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin

2

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

基本上我需要做以下事情:

git rev-parse --verify bf450342272a94117d78eae34a140a2a39359dad > .git/info/grafts
git filter-branch -f -- --all 

这将把指定的提交作为新的根来重写历史记录。提交元数据不会受到影响(日期、所有者等),只有提交哈希和提交之间的链接会被改变,从而使新图形从指定的根开始。
存储库将变为“未剪裁”/“未移植”,可以正常推送到新的远程仓库,并缩短历史记录。

我理解你的问题是如何通过获取缺失的历史记录来“去浅化”存储库。你在这里描述的方法通过将剩余的历史记录作为真正的(且唯一的)历史记录,从而“去浅化”了存储库,生成了一个新的不兼容(但不是浅层)的存储库。这两者非常不同,因为新的存储库不能与旧的克隆一起使用(好吧,除非经历很多痛苦)。 - torek
@torek,我的问题中已经有了,甚至是加粗的:“我不在乎失去旧历史记录。实际上,我希望失去旧历史记录。” - blueFast
是的,但从问题本身并不清楚你是否理解这需要将每个提交复制到一个具有新的不同哈希ID的新提交中。但是,根据您自己的答案和此评论系列,很明显您确实想要这样做。我认为重要的是为那些不想要这样做的人指出这一点,并且可能会犯与我在阅读您的问题时犯的相同错误... - torek
@torek 已经明白了。我会在这方面澄清问题。 - blueFast

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接