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)
我知道你的问题是特定的合并,但我在合并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
.它适用于您的示例,但是当涉及多个子模块时,我有意外的结果.不过,你可能会有更好的运气.
归档时间: |
|
查看次数: |
2528 次 |
最近记录: |