git 如何将一个没有子模块的分支合并到一个新创建子模块的分支中

wribegjk  于 2023-05-05  发布在  Git
关注(0)|答案(1)|浏览(190)

我在一个没有子模块的存储库中使用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
fhg3lkii

fhg3lkii1#

如果有与子模块相关的更改,我希望它们成为子模块内的冲突,而不是父代码库。
考虑到一个分支没有子模块,而另一个分支有子模块,最好在尝试git merge remote之前先在remote中遵循错误建议和git rm b
另外,不要忘记子模块中的分支与父存储库中的分支是不同的。
最后:

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"

当你对一个子模块进行任何修改,并在父仓库中注册新的树时,不要忘记从子模块 push 到它自己的上游仓库。或者你的父存储库会反映一个子模块存储库主树,它…没有人能够克隆和替换/检出。

相关问题