Git稀疏检出其他仓库子目录推送后出现多余目录如何解决?
问题根因
sparse-checkout仅控制本地工作目录的文件显示规则,不会过滤Git提交树中的实际文件内容。你执行git pull repos2 master --allow-unrelated-histories时,已经将Repo2整个master分支的所有文件(包括folder21、folder23)合并到了Repo1的本地分支中,只是本地工作目录受sparse规则限制没有显示这些文件,推送时自然会把所有合并进来的文件同步到Repo1远程端。
现有仓库修复方案
执行以下操作删除提交树中多余的Repo2目录,不会影响你本地已有的文件:
- 先确认本地工作区无未提交的修改
git status
- 从提交树和暂存区移除多余目录,
--cached参数会保留本地文件(你本地本来就没有这两个目录,不会产生其他影响)
git rm -r --cached folder21 folder23
- 提交修改并推送到远程
git commit -m "移除从Repo2合并的多余目录folder21、folder23" git push origin master
更稳定的替代方案(推荐)
如果需要长期关联Repo2的folder22目录,推荐用git subtree实现,不需要配置sparse checkout,也不会引入多余文件,操作更稳定:
- 进入Repo1本地目录,添加Repo2远程源
git remote add repos2 <Repo2的仓库地址>
- 拉取Repo2的master分支
git fetch repos2 master
- 将Repo2的folder22目录合并到Repo1的同名目录下,
--squash参数会把Repo2的提交合并为单个提交,避免污染Repo1的提交历史
git subtree add --prefix=folder22 repos2 master --squash
后续同步Repo2的folder22更新时执行:
git subtree pull --prefix=folder22 repos2 master --squash
如果需要将Repo1中对folder22的修改推送回Repo2,执行:
git subtree push --prefix=folder22 repos2 master
内容的提问来源于stack exchange,提问作者Manoj Kumar
相关产品推荐
相关产品推荐

