仅克隆最新提交后Git镜像推送报“未知提交”问题求助
这个问题我碰到过好几次,本质是浅克隆的bare仓库缺少完整的提交依赖链,而--mirror推送会尝试同步所有关联的Git对象,导致远程找不到缺失的父提交。下面给你两种靠谱的解决思路,按需选择:
方法一:修改已有的bare仓库,生成无历史的根提交
- 先进入你克隆的bare仓库目录:
cd repo.git - 获取当前分支最新提交的哈希值:
latest_commit=$(git rev-parse HEAD) - 基于最新提交的文件树,创建一个没有父节点的新根提交(相当于把当前内容变成仓库的第一个提交):
这里的提交信息可以改成你想要的内容。new_root=$(git commit-tree $latest_commit^{tree} -m "Initial commit (from latest of original repo)") - 更新当前分支的指向到这个新根提交(如果你的分支是
master就替换成master):git update-ref refs/heads/main $new_root - 最后推送到目标仓库,不要用
--mirror,直接强制推送分支:git push https://githost2/repo main --force
方法二:用普通仓库重新处理(更直观,适合新手)
如果觉得bare仓库操作有点绕,可以换这种方式:
- 重新克隆浅仓库到普通目录(不用
--bare):git clone --depth 1 --single-branch --shallow-submodules https://githost1/repo temp-repo cd temp-repo - 创建一个孤立分支(这个分支没有任何历史提交):
git checkout --orphan new-main - 提交当前所有文件作为初始提交:
git add -A git commit -m "Initial commit (latest snapshot from original repo)" - 添加目标仓库作为远程:
git remote add target https://githost2/repo - 强制推送新分支到目标仓库的主分支(如果目标仓库已有内容,
--force会覆盖,确认没问题再执行):git push target new-main:main --force
为什么原来的--mirror会报错?
git push --mirror的作用是完全镜像原仓库的所有引用和对象,但你用--depth 1做的浅克隆,只拉取了最新的提交,而这个提交的父提交、历史依赖对象都不在本地仓库里。远程仓库收到推送请求时,会检查这些依赖对象是否存在,找不到就会抛出Unknown commit的错误。我们上面的方法都是创建一个全新的无依赖根提交,这样推送时只需要发送当前提交和文件树,不会触发历史依赖检查。
内容的提问来源于stack exchange,提问作者webjay
相关产品推荐
相关产品推荐

