Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 目录转换为子模块后的合并_Git_Version Control_Merge_Git Submodules_Git Merge - Fatal编程技术网

Git 目录转换为子模块后的合并

Git 目录转换为子模块后的合并,git,version-control,merge,git-submodules,git-merge,Git,Version Control,Merge,Git Submodules,Git Merge,我发现使用git子模块时,在合并包含给定子模块的提交和表示与普通目录相同代码的提交时经常会遇到问题。小型复制示例: #创建一个项目,稍后用作子项目 git init a cd a 回声aaa>aa git添加-A git提交-m a1 光盘 #创建第二个项目,最初将包含作为普通目录的 git init b cd b mkdir a b 回声aaa>a/aa 回声bbb>b/bb git添加-A git提交-m b1 #用子模块替换目录 吉特rm-r a git子模块添加../a git提交-m

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

#创建一个项目,稍后用作子项目
git init a
cd a
回声aaa>aa
git添加-A
git提交-m a1
光盘
#创建第二个项目,最初将包含作为普通目录的
git init b
cd b
mkdir a b
回声aaa>a/aa
回声bbb>b/bb
git添加-A
git提交-m b1
#用子模块替换目录
吉特rm-r a
git子模块添加../a
git提交-m b2
#尝试从子模块前状态创建分支
git签出-b分支机构负责人^
这已经给出了一个错误:

错误:签出将覆盖以下未跟踪的工作树文件:
a/aa
请先移动或删除它们,然后才能切换分支。
流产
为了避免错误,我首先取消初始化所有子模块:

#从没有子模块的版本开始创建功能分支
git子模块deinit。
git签出-b分支机构负责人^
回声abc>b/bb
git提交-a-mb3
如您所见,功能分支与子模块完全无关,修改了一组不同的文件。这使得整个问题特别恼人

#尝试合并要素分支
切换到主分支
git合并分支
此操作再次失败,并显示一条我不完全理解的错误消息:

冲突(文件/目录):分支中有一个名为a的目录。添加a作为~HEAD
自动合并失败;修复冲突,然后提交结果。
如果在
git合并分支
之前执行
git子模块更新--init
,则会出现相同的错误。我在任何地方都看不到任何
a~头
,无论是在我的目录树中还是在
git status
的输出中,都没有看到,其内容如下:

分支主机上的

您有未合并的路径。
(修复冲突并运行“git提交”)
要提交的更改:
修改:b/bb
未合并路径:
(使用“git add…”标记分辨率)
由我们补充:a
如果我按照建议添加了一个,我会得到另一个错误:

错误:无法为文件编制索引
致命:更新文件失败
如果我在合并之前执行
git子模块更新--init
,那么我可以成功地执行
git添加
。但如果我忘记这样做,然后在合并后尝试这样做,我会收到以下错误消息:

为路径“a”注册的子模块“a”(…/a)
跳过未合并的子模块a
如何从这种情况中恢复?除了
git merge--abort
,我还想用它来处理
git-rebase
之类的事情,而且在某些情况下(不知道如何重现),我甚至不能干净地中止合并,而不得不进行硬重置


首先,我怎样才能避免它?是否有一些神奇的设置使git在合并期间对子模块和目录做正确的事情,这样我就不必手动后期处理只修改与子模块无关的文件的合并?

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

git reset a
所以你忽略了a的“chage”

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

git submodule deinit a
rmdir a

在合并之前,它将成功。不确定这是否是您想要的。

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


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

FYI code>--abort标志也适用于rebase。@user880772:是的,但它会中止整个rebase,这意味着如果在过程中出现一些冲突,可能会损失大量的努力。不是以通常的神奇方式。如果您不想忘记在合并之前运行子模块更新,可以将“merge”转换为别名(我觉得这样做很糟糕)。我看不出有什么好办法。