将Git子模块转换为子树后合并错误

Gre*_*ill 18 git merge git-submodules git-subtree

我有一个项目,我最初使用子模块的一些相关代码.事实证明,子模块并不适合这个项目(并且它们在实践中很难使用),因此我将每个子模块转换为子树(使用新git-subtree功能).

在我的工作存储库中,我已经成功删除了每个子模块,并将旧的子模块repo添加为子树.没问题.

当我转到另一个克隆并尝试从第一个克隆拉出时,我从合并步骤中收到以下错误:

error: The following untracked working tree files would be overwritten by merge:
        sub/.gitignore
        sub/Makefile
        sub/README
        sub/src/main.c
        ... and so on for all files in sub/
Aborting
Run Code Online (Sandbox Code Playgroud)

看来这是因为sub/首先在主存储库中从未真正存在过文件,并且当Git应用补丁进行更新时,.gitmodules它不会删除带有子模块文件的目录.当处理下一次提交时,Git尝试在其中创建新文件sub/,现在它们主存储库的一部分,所有这些文件都与仍然存在的文件冲突sub/.

我发现的解决方法是使用rm -rf sub之前git pull,这可以避免这个问题.

我的问题是,是否有任何命令行开关我可以使用git merge"覆盖工作目录中恰好存在的任何文件"?更好的方法是git merge查看现有文件的内容,如果内容与它要创建的文件完全相同,则禁止显示错误消息并继续.

更新:我已经创建了演示此问题的Git存储库,以准确显示我正在谈论的内容.重现:

$ git clone https://github.com/ghewgill/q14224966.git
$ cd q14224966
$ git submodule init
$ git submodule update
$ git merge origin/branch
Run Code Online (Sandbox Code Playgroud)

这应该导致错误消息

error: The following untracked working tree files would be overwritten by merge:
    sub/Makefile
    sub/README
    sub/src/main.c
Please move or remove them before you can merge.
Aborting
Run Code Online (Sandbox Code Playgroud)

Jon*_*ren 9

我知道你的问题是特定的合并,但我在合并git子模块时遇到了类似的问题.我认为这个解决方案可以解决您的问题,即使它没有直接解决合并问题.

我发现通过强行检查你想要合并的分支,然后回到master,一切都与子模块一致.

为了让你的例子工作:

$ git clone https://github.com/ghewgill/q14224966.git
$ cd q14224966
$ git submodule init
$ git submodule update
$ git checkout -f origin/branch
$ git checkout master
$ git merge origin/branch
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为它基本上是rm -rf为你做的.当然,这有点迂回,如果你只有像你的例子那样只有一个子模块,也许不值得做.但是我发现在一个包含许多子模块的项目中工作非常节省时间.

另外,正如评论中指出的那样,如果您想避免对工作树进行更改,可以使用以下命令:

$ git clone https://github.com/ghewgill/q14224966.git
$ cd q14224966
$ git submodule init
$ git submodule update
$ git reset origin/branch
$ git reset --hard master
Run Code Online (Sandbox Code Playgroud)

这大致以相同的方式工作,但避免在过程中检出其他文件.我没有机会在野外使用它,但它似乎是一种合理的方法.

还有$ git merge -s subtree origin/branch.它适用于您的示例,但是当涉及多个子模块时,我有意外的结果.不过,你可能会有更好的运气.