Skip to content
  • Jeff King's avatar
    merge-one-file: fix broken merges with alternate work trees · 6aaeca90
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    The merge-one-file tool predates the invention of
    GIT_WORK_TREE. By the time GIT_WORK_TREE was invented, most
    people were using the merge-recursive strategy, which
    handles resolving internally. Therefore these features have
    had very little testing together.
    
    For the most part, merge-one-file just works with
    GIT_WORK_TREE; most of its heavy lifting is done by plumbing
    commands which do respect GIT_WORK_TREE properly. The one
    exception is a shell redirection which touches the worktree
    directly, writing results to the wrong place in the presence
    of a GIT_WORK_TREE variable.
    
    This means that merges won't even fail; they will silently
    produce incorrect results, throwing out the entire "theirs"
    side of files which need content-level merging!
    
    This patch makes merge-one-file chdir to the toplevel of the
    working tree (and exit if we don't have one). This most
    closely matches the assumption made by the original script
    (before separate work trees were invented), and matches what
    happens when the script is called as part of a merge
    strategy.
    
    While we're at it, we'll also error-check the call to cat.
    Merging a file in a subdirectory could in fact fail, as the
    redirection relies on the "checkout-index" call just prior
    to create leading directories. But we never noticed, since
    we ignored the error return from running cat.
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    6aaeca90