git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[RFC PATCH v2 0/9] Improve merge recursive performance

From
Elijah Newren <newren@gmail.com>
Date
Nov 20, 2017, 22:19 UTC
Message-ID
<20171120221944.15431-1-newren@gmail.com>

You probably want to wait to review this series until my rename detection series lands so that I can clean up any more conflicts, but I'm posting this new series in case anyone wants to take an early look. It includes fixes identified by the reviews of my other patch series, and has been rebased on top of newer versions with conflicts resolved.

For the adventerous, though...

This patch series improves merge recursive performance, particularly when one side of history only makes a small number of changes, and the other has lots of renames (or lots of adds and deletes); I saw a speedup factor of over 30 on one particular real world repository.

Still RFC for the same reasons that the first series was (see https://public-inbox.org/git/20171110222156.23221-1-newren@gmail.com/), I haven't yet had time to push this further other than rebasing and cleaning up issues shared with my other series.

If you just want to test it out, it's available as the 'big-repo-small-cherry-pick' branch of https://github.com/newren/git .

Elijah Newren (9):
  diffcore-rename: no point trying to find a match better than exact
  merge-recursive: avoid unnecessary string list lookups
  merge-recursive: new function for better colliding conflict
    resolutions
  Add testcases for improved file collision conflict handling
  merge-recursive: fix rename/add conflict handling
  merge-recursive: improve handling for rename/rename(2to1) conflicts
  merge-recursive: improve handling for add/add conflicts
  merge-recursive: accelerate rename detection
  diffcore-rename: filter rename_src list when possible
 diff.c                               |   1 +
 diff.h                               |   7 +
 diffcore-rename.c                    |  85 ++++++-
 merge-recursive.c                    | 452 ++++++++++++++++++++++++-----------
 t/t2023-checkout-m.sh                |   2 +-
 t/t3418-rebase-continue.sh           |  27 ++-
 t/t3504-cherry-pick-rerere.sh        |  19 +-
 t/t4200-rerere.sh                    |  12 +-
 t/t6020-merge-df.sh                  |   4 +-
 t/t6024-recursive-merge.sh           |  35 +--
 t/t6025-merge-symlinks.sh            |   9 +-
 t/t6031-merge-filemode.sh            |   4 +-
 t/t6036-recursive-corner-cases.sh    |  19 +-
 t/t6042-merge-rename-corner-cases.sh | 212 +++++++++++++++-
 t/t6043-merge-rename-directories.sh  |  15 +-
 t/t7060-wtstatus.sh                  |   1 +
 t/t7064-wtstatus-pv2.sh              |   4 +-
 t/t7506-status-submodule.sh          |  11 +-
 t/t7610-mergetool.sh                 |  28 +--
 19 files changed, 723 insertions(+), 224 deletions(-)
-- 
2.15.0.323.g31fe956618
Next: Elijah Newren
Message 1 of 10 in “Improve merge recursive performance”
  1. 0/9 Improve merge recursive performanceElijah Newren, Nov 20, 2017
  2. 2/9 merge-recursive: avoid unnecessary string list lookupsElijah Newren, Nov 20, 2017
  3. 3/9 merge-recursive: new function for better colliding conflict resolutionsElijah Newren, Nov 20, 2017
  4. 1/9 diffcore-rename: no point trying to find a match better than exactElijah Newren, Nov 20, 2017
  5. 7/9 merge-recursive: improve handling for add/add conflictsElijah Newren, Nov 20, 2017
  6. 6/9 merge-recursive: improve handling for rename/rename(2to1) conflictsElijah Newren, Nov 20, 2017
  7. 4/9 Add testcases for improved file collision conflict handlingElijah Newren, Nov 20, 2017
  8. 9/9 diffcore-rename: filter rename_src list when possibleElijah Newren, Nov 20, 2017
  9. 5/9 merge-recursive: fix rename/add conflict handlingElijah Newren, Nov 20, 2017
  10. 8/9 merge-recursive: accelerate rename detectionElijah Newren, Nov 20, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.