首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >目录被转换为子模块后合并

目录被转换为子模块后合并
EN

Stack Overflow用户
提问于 2015-08-04 23:50:00
回答 2查看 3.1K关注 0票数 15

我发现,在使用git子模块时,我经常会遇到合并问题:提交包含给定的子模块和表示与普通目录相同代码的提交。小型复制示例:

代码语言:javascript
运行
复制
# 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^

这已经产生了一个错误:

代码语言:javascript
运行
复制
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

为了避免错误,我首先去初始化所有子模块:

代码语言:javascript
运行
复制
# 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

如您所见,特性分支与子模块完全无关,它修改了一组不同的文件。这让整个问题特别烦人。

代码语言:javascript
运行
复制
# Try to merge the feature branch
git checkout master
git merge branch

这再次失败,我无法完全理解错误消息:

代码语言:javascript
运行
复制
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的输出中,它都是这样的:

代码语言:javascript
运行
复制
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,则会得到另一个错误:

代码语言:javascript
运行
复制
error: unable to index file a
fatal: updating files failed

如果我在合并之前执行git submodules update --init,那么我可以成功地执行git add a。但是,如果我忘记这样做,然后在合并之后尝试这样做,我会收到以下错误消息:

代码语言:javascript
运行
复制
Submodule 'a' (…/a) registered for path 'a'
Skipping unmerged submodule a

如何从这种情况中恢复过来?不是git merge --abort,因为我也想使用它来处理诸如git rebase之类的事情,而且在某些情况下(不知道如何复制),我甚至无法彻底地中止合并,而是不得不进行硬重置。

我一开始怎样才能避免呢?有什么神奇的设置可以让git在合并过程中对子模块和目录做正确的事情,这样我就不必手动地处理只修改与子模块无关的文件的合并了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-19 04:18:44

不,不应该添加a,合并不应该更改它。你应该跑的是

代码语言:javascript
运行
复制
git reset a

所以你就忽略了“查奇”。

PS:显然git只是检查目录的存在,所以如果

代码语言:javascript
运行
复制
git submodule deinit a
rmdir a

在合并之前,它会成功的。不知道这是不是你想要的。

票数 4
EN

Stack Overflow用户

发布于 2017-06-12 03:16:00

当我合并包含需要转换为子模块的文件夹的代码时,我也遇到了类似的问题。

我通过使用BFG --delete-folders从新源代码中删除文件夹和使用git gc清理存储库来解决这个问题,然后我将使用没有任何冲突的git rebase

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31821219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档