Git subtree合并后子模块代码显示在根目录,如何解决?
折腾了一下午用subtree把第三方组件库合并到项目里,结果代码全堆到根目录了,明明指定了components/third-party路径啊?
按网上的教程用了:
git subtree add --prefix=components/third-party <远程仓库> main --squash
合并后文件结构直接变成这样了(截图里组件文件全在根目录):
<!-- 根目录出现不应该有的组件文件 -->
<template>
<ThirdPartyButton />
</template>
<script>
import ThirdPartyButton from './ThirdPartyButton.vue' // 本应位于components/third-party下
</script>
git status显示所有文件都属于主仓库,子模块路径参数完全没生效,是不是命令写错了?手动移动文件再提交会不会破坏subtree关联?
git subtree add --prefix=components/third-party <远程仓库> main --squash
注意--prefix后面必须是本地路径在前,远程仓库在后。如果还是不行,先删掉错误的subtree再重新添加,不会破坏关联。我刚试过这样是可以正常放到指定目录的。
--prefix是对本地路径生效的,但你在 add 的时候如果远程仓库本身没那个目录结构,它就会把远程仓库根目录的内容直接平铺到你指定的 prefix 路径下。不过你现在的情况更可能是:执行命令时网络或路径写错了,导致 Git 没真把远程代码合并进来,反而把你本地当前分支的东西全当成了 subtree 内容,所以文件都堆根目录了。
先确认一下你执行的完整命令是不是这样:
注意别漏了远程仓库地址和分支名。如果你本地之前已经误提交了一堆东西,可以回退一步:
然后再重新执行正确的 subtree add 命令。
最关键的一点:确保
components/third-party这个路径在执行前不存在,否则 Git 会拒绝操作或者行为异常。如果确定命令没错还是不行,可能是远程仓库本身就是扁平结构,那你得接受它的文件会出现在你的
components/third-party/xxx.vue下,而不是根目录。引用的时候也得改过来:import ThirdPartyButton from './components/third-party/ThirdPartyButton.vue'最后提醒一句,手动移动那些已经被提交的文件绝对会破坏 subtree 后续的 pull 和 push,别干这事。要么重来,要么用 subtree 的方式更新。