Re: Submodule/contents conflict
From: Philip Oakley <hidden>
Date: 2017-04-24 23:33:45
From: "Stefan Beller" <redacted>
On Mon, Apr 24, 2017 at 1:06 AM, Orgad Shaneh [off-list ref] wrote:quoted
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.
This is almost the same as just reported by 'vvs' [1] https://public-inbox.org/git/CAM1zWBtfgHT=pT0pidQo1HD=DfrXLG3gNaUvs0vZKvYfG1BHFw@mail.gmail.com/, originally on the 'git user' list https://groups.google.com/forum/?hl=en#!topic/git-users/9ziZ6yq-BfU It also has a similarity to https://public-inbox.org/git/1492287435.14812.2.camel@gmail.com/ regarding how checkout operates. It does feel as if there are two slightly different optimisations that could be used when the desired file pre-exists in the worktree, but isn't immediately known to the index.
quoted
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.
That sounds like a wait that is not wanted!
quoted
A similar bug report https://public-inbox.org/git/CAG0BQX=wvpkJ=PQWV-NbmhuPV8yzvd_KYKzJmsfWq9xStZ2bnQ@mail.gmail.com/ "checkout --recurse-submodules" (as mentioned in that report) made it into Git by now, but this bug goes unfixed, still.quoted
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
-- Philip