【发布时间】:2012-12-22 21:28:54
【问题描述】:
我有一个项目,我最初将子模块用于一些依赖代码。事实证明,子模块并不真正适合这个项目(而且它们在实践中很难使用),所以我将每个子模块转换为子树(使用新的git-subtree 功能)。
在我的工作存储库中,我已成功删除每个子模块并将旧的子模块存储库添加为子树。这个没问题。
当我转到另一个克隆并尝试从第一个克隆中提取时,合并步骤中出现以下错误:
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
这似乎是因为sub/ 中的文件最初从未真正存在于主存储库中,并且当 Git 应用补丁更新 .gitmodules 时,它不会删除包含子模块文件的目录。在处理下一次提交时,Git 尝试在 sub/ 中创建 现在是主存储库一部分的新文件,所有这些文件都与 sub/ 中仍然存在的文件冲突。
我发现的解决方法是在git pull之前使用rm -rf sub,这样可以避免这个问题。
我的问题是,有没有可以与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
这应该会导致错误消息
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
【问题讨论】:
-
你试过这个吗:goo.gl/z1XP9?
-
@Efthymis:完整链接是stackoverflow.com/questions/1295171/…(请不要在此处使用 URL 缩短器)。我尝试了
git merge -s recursive -X theirs origin/master并发生了同样的错误。 -
是的,这似乎是一个聪明的机智
git merge。我渴望得到那份赏金。 -
我赞成你的回答,因为这也发生在我身上:D
标签: git merge git-submodules git-subtree