On Mon, Apr 24, 2017 at 1:06 AM, Orgad Shaneh <orgads@xxxxxxxxx> wrote: > Hi, > > I've noticed a strange behavior with submodule/content conflict. My > current Git version is 2.12.2, but the problem exists since I > remember. > > Branch A has a submodule. > In branch B which diverged from A, I replaced the submodule with its contents. > > Now, every time I merge A into B, and A had changed the submodule > reference, all the files inside the ex-submodule directory in B are > being "re-added". > > Moreover, aborting the merge prints an error, but seems to work > nevertheless, and if I run git reset --hard all the files in that > directory are actually written to the disk, even though they haven't > changed at all. > > When the submodule is small, it might be ok. But in my project we have > a huge submodule with ~16K files, and on each merge all the files are > listed, and even mixed reset takes several minutes. > A similar bug report https://public-inbox.org/git/CAG0BQX=wvpkJ=PQWV-NbmhuPV8yzvd_KYKzJmsfWq9xStZ2bnQ@xxxxxxxxxxxxxx/ "checkout --recurse-submodules" (as mentioned in that report) made it into Git by now, but this bug goes unfixed, still. > The following script demonstrates this: > #!/bin/sh > > rm -rf super sub > mkdir sub > cd sub > git init > touch foo > git add foo > git commit -m 'Initial commit' > mkdir ../super; cd ../super > git init > git submodule add ../sub > touch foo; git add foo sub > git commit -m 'Initial commit' > git checkout -b update-sub > git update-index --cacheinfo 160000,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,sub > git commit -m 'Update submodule' > git checkout -b remove-sub HEAD^ > git rm sub > mkdir sub > touch sub/foo sub/bar > git add sub > git commit -m 'Replaced submodule with contents' > git checkout -b remove-2 HEAD^ > git merge --no-ff remove-sub > git merge update-sub > # Adding sub/foo > # Adding sub/bar > # CONFLICT (modify/delete): sub deleted in HEAD and modified in > update-sub. Version update-sub of sub left in tree at sub~update-sub. > # Automatic merge failed; fix conflicts and then commit the result. > git merge --abort > # error: 'sub' appears as both a file and as a directory > # error: sub: cannot drop to stage #0 > > - Orgad