threads / bug / 45615

[BUG?] Issue with merging from another branch after replacing subdirectory with submodule

Subject: [BUG?] Issue with merging from another branch after replacing subdirectory with submodule

## tl;dr

3 messages between Apr 6, 2017 and Apr 7, 2017.

replies: 2people: 2as markdown or json

Ben Nason· Apr 6, 2017, 06:10 UTC · lore
Hi,

In git if you replace a subdirectory with a submodule in one branch, every successive merge from another branch without that change will cause a conflict. To reproduce this please see below (DOS batch file).

Is this expected behavior?

Thanks, Benbuck

:: prep simple repo with subdir git init repo pushd repo echo foo > foo.txt git add --all git commit -m "foo" mkdir sub echo bar > sub\bar.txt git add --all git commit -m "bar" popd

:: prep simple submodule git init submod pushd submod echo baz2 > baz.txt git add --all git commit -m "baz2" popd

:: in a new branch: delete subdir, replace with submodule pushd repo git checkout -b resub git rm -rf sub git commit -m "delete subdir" git submodule add ../submod sub git submodule update --init git commit -m "add submod"

:: in old branch: make an unrelated change git checkout master git clean -fd git rs --hard master echo foo2 > foo.txt git commit --all -m "foo2"

:: switch back to new branch git checkout resub git rs --hard resub git submodule update --init pushd sub git reset --hard master popd

:: all is good so far, now merge git merge master git status @echo !!!!!! note the above merge conflict !!!!!! pause :: resolve the conflict to keep the submodule git reset sub git commit --no-edit

:: make another change to old branch git checkout master git clean -fd git rs --hard master echo foo3 > foo.txt git commit --all -m "foo3" git checkout resub git rs --hard resub git submodule update --init pushd sub git reset --hard master popd

:: merge again git merge master git status @echo !!!!!! note that the conflict happens on every single merge !!!!!! pause

popd
Stefan Beller· Apr 6, 2017, 23:05 UTC · re: Ben Nason · lore

Re: [BUG?] Issue with merging from another branch after replacing subdirectory with submodule

On Wed, Apr 5, 2017 at 11:10 PM, Ben Nason <bnason@netflix.com> wrote:
Show 7 quoted lines
> Hi,
>
> In git if you replace a subdirectory with a submodule in one branch,
> every successive merge from another branch without that change will
> cause a conflict. To reproduce this please see below (DOS batch file).
>
> Is this expected behavior?
Yes.

"git submodule update [--init]" only (creates or) updates existing submodules. It doesn't take care of removing submodules that are no longer recorded in the tree.

"git merge" currently also does not touch submodules. (we may have git merge --recurse-submodules soon, though). So as soon as there is a conflict between the submodule (or an unrelated repo, who happens to live inside this other repo), and new directories/files that would appear, the merge errors out.

Ideally Git would be smarter than the current behavior.
Stefan
Ben Nason· Apr 7, 2017, 15:25 UTC · re: Stefan Beller · lore

Re: [BUG?] Issue with merging from another branch after replacing subdirectory with submodule

Hi Stefan,

Thanks for the reply. Is there any known workaround for this situation, so that a manual resolve isn't needed for every single merge in this scenario?

Thanks, Benbuck

On Thu, Apr 6, 2017 at 4:05 PM, Stefan Beller <sbeller@google.com> wrote:
Show 24 quoted lines
> On Wed, Apr 5, 2017 at 11:10 PM, Ben Nason <bnason@netflix.com> wrote:
>> Hi,
>>
>> In git if you replace a subdirectory with a submodule in one branch,
>> every successive merge from another branch without that change will
>> cause a conflict. To reproduce this please see below (DOS batch file).
>>
>> Is this expected behavior?
>
> Yes.
>
> "git submodule update [--init]" only (creates or) updates existing
> submodules. It doesn't take care of removing submodules that are
> no longer recorded in the tree.
>
> "git merge" currently also does not touch submodules. (we may have
> git merge --recurse-submodules soon, though). So as soon as there
> is a conflict between the submodule (or an unrelated repo, who happens
> to live inside this other repo), and new directories/files that would appear,
> the merge errors out.
>
> Ideally Git would be smarter than the current behavior.
>
> Stefan

← back to recent threads