我在一个没有子模块的存储库中使用master
。我创建了一个新的分支remote
,并在那里添加和提交了一些更改。然后,回到master
,我将子目录转换为子模块,并在其中添加和提交一些更改,然后在父存储库中添加和提交子模块commit。
现在我想将remote
合并到master
中。如果有与子模块相关的更改,我希望它们成为子模块内的冲突,而不是父代码库。我该怎么做?
下面是一个脚本来重现上面描述的状态:
#!/usr/bin/env bash
mkdir repo
mkdir repo/a/
mkdir repo/b/
echo 'a' > repo/a/a.txt
echo 'b' > repo/b/b.txt
cd repo
git init
git add .
git commit -m "Initial commit"
git checkout -b remote
echo 'c' > b/c.txt
echo 'b' >> b/b.txt
git add .
git commit -m "Changes"
git checkout master
cd ..
git clone repo copy
cd copy
git filter-repo --subdirectory-filter b
cd ..
cd repo
git rm -rf b
git add .
git commit -m "Remove b"
git submodule add ../copy b
git commit -m "Add b as submodule"
echo 'd' > b/d.txt
cd b
git add .
git commit -m "Add new file in submodule b"
cd ..
git add .
git commit -m "Add submodule commit"
如果在此之后运行git merge remote
,则会得到以下输出:
error: The following untracked working tree files would be overwritten by merge:
b/b.txt
Please move or remove them before you merge.
Aborting
1条答案
按热度按时间fhg3lkii1#
如果有与子模块相关的更改,我希望它们成为子模块内的冲突,而不是父代码库。
考虑到一个分支没有子模块,而另一个分支有子模块,最好在尝试
git merge remote
之前先在remote中遵循错误建议和git rm b
。另外,不要忘记子模块中的分支与父存储库中的分支是不同的。
最后:
当你对一个子模块进行任何修改,并在父仓库中注册新的树时,不要忘记从子模块 push 到它自己的上游仓库。或者你的父存储库会反映一个子模块存储库主树,它…没有人能够克隆和替换/检出。