我发现,在使用git子模块时,我经常会遇到合并问题:提交包含给定的子模块和表示与普通目录相同代码的提交。小型复制示例:
# Create one project, to be used as a subproject later on
git init a
cd a
echo aaa > aa
git add -A
git commit -m a1
cd ..
# Create a second project, containing a as a normal directory initially
git init b
cd b
mkdir a b
echo aaa > a/aa
echo bbb > b/bb
git add -A
git commit -m b1
# Replace directory with submodule
git rm -r a
git submodule add ../a a
git commit -m b2
# Try to create branch from the pre-submodule state of affairs
git checkout -b branch HEAD^
这已经产生了一个错误:
error: The following untracked working tree files would be overwritten by checkout:
a/aa
Please move or remove them before you can switch branches.
Aborting
为了避免错误,我首先去初始化所有子模块:
# Create feature brach starting at version without submodule
git submodule deinit .
git checkout -b branch HEAD^
echo abc > b/bb
git commit -a -m b3
如您所见,特性分支与子模块完全无关,它修改了一组不同的文件。这让整个问题特别烦人。
# Try to merge the feature branch
git checkout master
git merge branch
这再次失败,我无法完全理解错误消息:
CONFLICT (file/directory): There is a directory with name a in branch. Adding a as a~HEAD
Automatic merge failed; fix conflicts and then commit the result.
如果在git submodule update --init
之前执行git merge branch
,则会得到相同的错误。我在任何地方都没有看到任何a~HEAD
,无论是在我的目录树中还是在git status
的输出中,它都是这样的:
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Changes to be committed:
modified: b/bb
Unmerged paths:
(use "git add <file>..." to mark resolution)
added by us: a
如果我按建议执行git add a
,则会得到另一个错误:
error: unable to index file a
fatal: updating files failed
如果我在合并之前执行git submodules update --init
,那么我可以成功地执行git add a
。但是,如果我忘记这样做,然后在合并之后尝试这样做,我会收到以下错误消息:
Submodule 'a' (…/a) registered for path 'a'
Skipping unmerged submodule a
如何从这种情况中恢复过来?不是git merge --abort
,因为我也想使用它来处理诸如git rebase
之类的事情,而且在某些情况下(不知道如何复制),我甚至无法彻底地中止合并,而是不得不进行硬重置。
我一开始怎样才能避免呢?有什么神奇的设置可以让git在合并过程中对子模块和目录做正确的事情,这样我就不必手动地处理只修改与子模块无关的文件的合并了吗?
发布于 2015-08-19 04:18:44
不,不应该添加a,合并不应该更改它。你应该跑的是
git reset a
所以你就忽略了“查奇”。
PS:显然git只是检查目录的存在,所以如果
git submodule deinit a
rmdir a
在合并之前,它会成功的。不知道这是不是你想要的。
发布于 2017-06-12 03:16:00
当我合并包含需要转换为子模块的文件夹的代码时,我也遇到了类似的问题。
我通过使用BFG --delete-folders
从新源代码中删除文件夹和使用git gc
清理存储库来解决这个问题,然后我将使用没有任何冲突的git rebase
。
https://stackoverflow.com/questions/31821219
复制相似问题