From: Philip Oakley Date: Mon, 24 Apr 2017 23:33:38 GMT Subject: Re: Submodule/contents conflict Message-ID: <4BF0A1BFFFFD421EB8C5F7E6FEF14357@PhilipOakley> In-Reply-To: From: "Stefan Beller" > On Mon, Apr 24, 2017 at 1:06 AM, Orgad Shaneh 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. >> 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. >> 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! >> > > 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. > >> 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