git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Michael McClimon <michael@mcclimon.org>
To: git@vger.kernel.org
Subject: Potential bug with octopus merges and symlinks
Date: Wed, 1 Dec 2021 22:04:58 -0500	[thread overview]
Message-ID: <20211202030458.GA48278@newk> (raw)

I am having a problem with octopus merges when symbolic links are involved.
I'm not completely convinced this is a bug in git, but I'm also not convinced
that it's _not_. (If it's not, my apologies; I often find it very hard to
track down the answers to complicated git questions on the internet.)

There is a minimal reproducer available at
https://github.com/mmcclimon/git-merge-problem-demo. Fetch all the branches
there. The main branch contains a directory (dir1) with a single file
(file.txt), plus a symlink (dir2), which links to dir1. branch1 replaces this
symlink with a copy of the files that were linked to. (This was accomplished
with: rm dir2; cp -r dir1 dir2.) branch2 and branch3 do not touch this
directory at all.

Merging these three branches fails:

$ git merge branch1 branch2 branch3
Fast-forwarding to: branch1
Trying simple merge with branch2
Simple merge did not work, trying automatic merge.
Trying simple merge with branch3
error: Entry 'dir2/file.txt' not uptodate. Cannot merge.
Merge with strategy octopus failed.

The order here matters! Here is every permutation (1 here is the symlink
change) to git merge; only the first two fail, all the others work.

1 2 3   FAIL
1 3 2   FAIL
2 1 3   PASS
2 3 1   PASS
3 1 2   PASS
3 2 1   PASS
1 2     PASS
2 1     PASS
2 3     PASS
3 2     PASS
1 3     PASS
3 1     PASS

I tracked this down as best I could (I am not a C programmer), by adding 
`set -x` to my copy of git-octopus-merge.sh. I determined that the line is
failing is toward the very bottom of the main loop there: 
    git read-tree -u -m --aggressive  $common $MRT $SHA1

I had a read of the index-format.txt and then the git read-tree docs, and I
confess that I don't _totally_ follow the latter. But, I wonder if maybe
--aggressive is perhaps not aggressive enough if the parts of the index that
store symbolic link data aren't taken into account, when it's changed between
two versions and the blobs involved aren't actually different.

I recognize that replacing a symlink with real files under the same name is a
weird thing to do, but this is a pared-down example of a thing that happens
occasionally at $work, where we regularly octopus-merge 15+ heads into
development branches. I would also be happy to know, if this isn't a bug, if
there's some other workaround! The only way I know to fix this case is to
merge the symlink change, then rebase all in-flight branches against it. That
is often extremely time-consuming and tedious, though, and requires a human to
be involved (all the other merging is done by CI.)

Thanks!
Michael


Please review the rest of the bug report below.
You can delete any lines you don't wish to share.

[System Info]
git version:
git version 2.34.1
cpu: x86_64
no commit associated with this build
sizeof-long: 8
sizeof-size_t: 8
shell-path: /bin/sh
uname: Darwin 20.6.0 Darwin Kernel Version 20.6.0: Wed Jun 23 00:26:31 PDT 2021; root:xnu-7195.141.2~5/RELEASE_X86_64 x86_64
compiler info: clang: 13.0.0 (clang-1300.0.29.3)
libc info: no libc information available
$SHELL (typically, interactive shell): /bin/zsh


[Enabled Hooks]


-- 
Michael McClimon
michael@mcclimon.org


             reply	other threads:[~2021-12-02  3:05 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-02  3:04 Michael McClimon [this message]
2021-12-04 17:34 ` Potential bug with octopus merges and symlinks Elijah Newren
2021-12-06 16:53 ` Martin von Zweigbergk
2021-12-06 18:13 ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211202030458.GA48278@newk \
    --to=michael@mcclimon.org \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).