在我的git存储库中,我已经使用此链接中的配方将名为firmware/SDK
的文件夹转换为子模块。然后我做了两个提交:
- 删除文件夹:
git rm -r firmware/SDK
- 下一个添加子模块:
git submodule add https://blablabla/sdk.git firmware/SDK
这个工作得很好…直到我尝试做一个交互式的重置:git rebase -i HEAD~4
。然后我得到了错误:The following untracked working tree files would be overwritten
和rebase中止。
我理解发生这种情况是因为rebase是一个接一个地撤销提交,但仍然将文件留在我的工作空间中,因此它们与其他提交发生冲突。
我尝试在一次提交中压缩这两个提交,但我仍然在rebase中得到相同的错误。
然后我测试用不同的名称添加子模块,如firmware/submodularized_SDK
。在本例中,rebase工作得很好。但我希望保持相同的名称,否则我将不得不改变我的配置,并选择一个新的文件夹名称(更糟糕的是😅)。
是否有一种方法,我可以保持相同的目录名称和做重基和签出的标准方式?
这些名称(在本例中是文件的路径名或子模块中的名称)在以下情况下发生冲突:
- 名称匹配,和
- 你做了一些事情,导致Git在子模块转换之前引用了一些旧的命名为的提交,而在子模块转换之后引用了一些新的命名为的提交。
:
是否有一种方法,我可以保持相同的目录名称,并做rebase和检出的标准方式?
Yes:在时间上走得足够远(并提交)到你永远不会混合使用"old"与"new"再重复一次,问题就不会再发生了。
在此之前,您当前的解决方案(使用不同的名称,以便名称不冲突)运行得很好。什么时候你已经走得"足够远",这取决于你自己。你不会"回到过去"直到两个名字发生冲突。此时,无论何时,您都可以重命名子模块。"在计算机科学中有两个难题:缓存无效、命名和off-by-1错误。">