Tags: gitgitgadget/git
Tags
prio-queue: fold lazy_queue into prio_queue for automatic get+put fusion
Rene's lazy_queue wrapper in describe.c was a clever optimization -- by
deferring the get, a following put becomes a simple replace, avoiding a full
remove-rebalance-insert cycle.
It turns out this pattern is so common in git's traversal code that it makes
sense to fold it into prio_queue itself. Gets and puts are interleaved in
virtually every commit walk, so the fusion is essentially always a win.
This is mostly a code simplification -- three callers had independently
reimplemented the same optimization, and they all collapse to plain get+put
now. The 1.7-2.7% speedup on traversal-heavy workloads is a nice bonus.
More details and benchmark numbers in the commit message.
Related to but independent of the cascade sift-down work in
kk/prio-queue-cascade-sift -- the two can land in either order.
Changes in v3:
* Adopted Rene's suggestion to move the flush logic below the LIFO
early-return (LIFO mode never sets get_pending, so flushing there is a
no-op).
* Went a step further and inlined the flush logic directly into get() and
peek(), eliminating the flush_get() helper and its forward declaration of
sift_down_root().
* Updated benchmark numbers with more rigorous methodology: 30 interleaved
runs with paired t-test on an idle server. Split results into code paths
that already had manual fusion (neutral) vs code paths that benefit from
the new automatic fusion (1.7-2.7% improvement).
Changes in v2:
* Added a second commit that renames .nr to .nr_internal so that direct
access from outside prio-queue.c is a compile error. Verified that after
the rename, only prio-queue.c references nr_internal.
* Added prio_queue_for_each() macro for callers that need to walk all
elements (describe.c, show-branch.c, commit-reach.c, revision.c,
negotiator/skipping.c).
* Converted remaining .nr loop conditions to use
prio_queue_get()/prio_queue_peek() as the loop condition, or
prio_queue_size() where get/peek isn't suitable.
* Fixed several callers missed in v1 (object-name.c, fetch-pack.c,
path-walk.c, pack-bitmap-write.c, negotiator/default.c,
negotiator/skipping.c, revision.c, builtin/last-modified.c).
Kristofer Karlsson (2):
prio-queue: fold lazy_queue into prio_queue for automatic get+put
fusion
prio-queue: rename .nr to .nr_internal to prevent direct access
builtin/describe.c | 70 ++++++------------------
builtin/last-modified.c | 7 +--
builtin/show-branch.c | 24 +++-----
commit-reach.c | 24 ++++----
commit.c | 11 +---
fetch-pack.c | 4 +-
negotiator/default.c | 4 +-
negotiator/skipping.c | 12 ++--
object-name.c | 2 +-
pack-bitmap-write.c | 10 ++--
path-walk.c | 8 +--
prio-queue.c | 106 +++++++++++++++++++-----------------
prio-queue.h | 19 ++++---
revision.c | 16 +++---
t/unit-tests/u-prio-queue.c | 6 +-
walker.c | 4 +-
16 files changed, 144 insertions(+), 183 deletions(-)
base-commit: 9ac3f19
Submitted-As: https://lore.kernel.org/git/pull.2140.v3.git.1780832592.gitgitgadget@gmail.com
In-Reply-To: https://lore.kernel.org/git/pull.2140.git.1780757885582.gitgitgadget@gmail.com
In-Reply-To: https://lore.kernel.org/git/pull.2140.v2.git.1780772477.gitgitgadget@gmail.com
git-gui: silence install recipes under "make -s" From: Harald Nordgren <haraldnordgren@gmail.com> Several install and uninstall recipes embed "echo" calls that fire as part of the recipe itself, so the install banners (DEST, INSTALL, LINK, REMOVE) were visible whenever the variables expand non-empty. Guard the whole "ifndef V" block on "-s" so the loud variants are selected only when "-s" is absent and V=1 is unset. The existing "-s" check also had its findstring arguments in the wrong order (needle "-s" never fit in haystack "s"), so swap them while moving the check to wrap the block. Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com> Submitted-As: https://lore.kernel.org/git/pull.2318.v4.git.git.1780742303298.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2318.git.git.1780477489662.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2318.v2.git.git.1780510415838.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2318.v3.git.git.1780555730228.gitgitgadget@gmail.com
prio-queue: fold lazy_queue into prio_queue for automatic get+put fusion
Rene's lazy_queue wrapper in describe.c was a clever optimization -- by
deferring the get, a following put becomes a simple replace, avoiding a full
remove-rebalance-insert cycle.
It turns out this pattern is so common in git's traversal code that it makes
sense to fold it into prio_queue itself. Gets and puts are interleaved in
virtually every commit walk, so the fusion is essentially always a win.
This is mostly a code simplification -- three callers had independently
reimplemented the same optimization, and they all collapse to plain get+put
now. The 3-6% speedup on traversal-heavy workloads is a nice bonus.
More details and benchmark numbers in the commit message. Benchmarks were
run on next which includes kk/commit-reach-optim -- those results represent
the more realistic end state.
Related to but independent of the cascade sift-down work in
kk/prio-queue-cascade-sift -- the two can land in either order.
Changes since v1:
* Added a second commit that renames .nr to .nr_internal so that direct
access from outside prio-queue.c is a compile error. Verified that after
the rename, only prio-queue.c references nr_internal.
* Added prio_queue_for_each() macro for callers that need to walk all
elements (describe.c, show-branch.c, commit-reach.c, revision.c,
negotiator/skipping.c).
* Converted remaining .nr loop conditions to use
prio_queue_get()/prio_queue_peek() as the loop condition, or
prio_queue_size() where get/peek isn't suitable.
* Fixed several callers missed in v1 (object-name.c, fetch-pack.c,
path-walk.c, pack-bitmap-write.c, negotiator/default.c,
negotiator/skipping.c, revision.c, builtin/last-modified.c).
Kristofer Karlsson (2):
prio-queue: fold lazy_queue into prio_queue for automatic get+put
fusion
prio-queue: rename .nr to .nr_internal to prevent direct access
builtin/describe.c | 70 ++++++++-------------------------
builtin/last-modified.c | 7 ++--
builtin/show-branch.c | 24 +++++-------
commit-reach.c | 24 ++++++------
commit.c | 11 +-----
fetch-pack.c | 4 +-
negotiator/default.c | 4 +-
negotiator/skipping.c | 12 +++---
object-name.c | 2 +-
pack-bitmap-write.c | 10 ++---
path-walk.c | 8 ++--
prio-queue.c | 77 ++++++++++++++++++++-----------------
prio-queue.h | 19 +++++----
revision.c | 16 ++++----
t/unit-tests/u-prio-queue.c | 6 +--
walker.c | 4 +-
16 files changed, 129 insertions(+), 169 deletions(-)
base-commit: 9ac3f19
Submitted-As: https://lore.kernel.org/git/pull.2140.v2.git.1780772477.gitgitgadget@gmail.com
In-Reply-To: https://lore.kernel.org/git/pull.2140.git.1780757885582.gitgitgadget@gmail.com
prio-queue: fold lazy_queue into prio_queue for automatic get+put fusion From: Kristofer Karlsson <krka@spotify.com> Defer the actual removal in prio_queue_get() until the next operation. If that next operation is a prio_queue_put(), the removal and insertion are fused into a single replace — writing the new element at the root and sifting it down — which avoids a full remove-rebalance-insert cycle. This matches the dominant usage pattern in git's commit traversal: get a commit, then put its parents. The first parent insertion after each get is now a replace operation automatically. This generalizes the lazy_queue pattern from builtin/describe.c (introduced in 08bb69d) into prio_queue itself. Three callers independently implemented the same get+put fusion: - builtin/describe.c had a full lazy_queue wrapper - commit.c:pop_most_recent_commit() reimplements the same get_pending flag with peek+replace - builtin/show-branch.c:join_revs() used the same peek+replace pattern All three now collapse to plain _get() and _put(), with the data structure handling the fusion internally. Remove prio_queue_replace() since no external callers remain. Add prio_queue_size() for callers that need the logical element count, since the physical nr may temporarily include a pending-removal element. Benchmarked on a large monorepo (10-15 interleaved runs, 1 warmup): Command base patched speedup merge-base --all A A~1000 3.88s 3.77s 1.03x rev-list --count A~1000..A 3.57s 3.43s 1.04x log --oneline A~1000..A 3.70s 3.49s 1.06x rev-parse :/pattern 365ms 364ms 1.00x describe HEAD (linux.git) 184ms 190ms 1.00x No regressions in any scenario. Signed-off-by: Kristofer Karlsson <krka@spotify.com> Submitted-As: https://lore.kernel.org/git/pull.2140.git.1780757885582.gitgitgadget@gmail.com
worktree: copy-on-write creation and shared-branch worktrees
When many worktrees share one repository -- e .g. a fleet of agents each
needing an isolated checkout -- "git worktree add" is costly at scale.
Objects are shared via the common dir, but the working tree is not: each add
rewrites every tracked file, so N worktrees cost N full checkouts of disk
and I/O. And a branch can only be checked out in one worktree.
Patch 1 adds "git worktree add --reflink": on a copy-on-write filesystem it
populates the new worktree by reflinking the current worktree's files and
index, then "git reset --hard" rewrites only the paths that differ from . A
reflink_file() helper in copy.c uses FICLONE (Linux) and clonefile()
(macOS); elsewhere (other filesystems, Windows) it is probed up front and
falls back to a normal checkout. Defaulting is via the worktree.reflink
config (true/false/auto); --no-reflink overrides.
Patch 2 lets a branch be checked out in several worktrees, for parallel work
on one checkout. A branch mid-rebase or mid-bisect elsewhere is still
refused.
Benchmark (Linux-kernel fork, 93k files, ~33 GB tree incl. build output,
btrfs): a normal add allocates ~0.9 GB of real disk per worktree (~5.3 GB
for four, linear); --reflink allocates ~0 at any count and also carries the
untracked build tree. ("Real disk" = btrfs exclusive bytes.)
worktree-reflink-bench
[https://github.com/user-attachments/assets/e3e721c8-2206-4b78-ad08-21677ef30753]
Note: patch 2 changes a default (same-branch checkout now allowed); two
t2400 assertions were updated accordingly.
Jason Newton (2):
worktree: add --reflink for copy-on-write worktree creation
worktree: allow sharing a checked-out branch across worktrees
Documentation/config/worktree.adoc | 10 ++
Documentation/git-worktree.adoc | 47 +++++-
builtin/worktree.c | 257 ++++++++++++++++++++++++++++-
copy.c | 65 ++++++++
copy.h | 13 ++
t/t2400-worktree-add.sh | 119 ++++++++++++-
6 files changed, 493 insertions(+), 18 deletions(-)
base-commit: c69baaf
Submitted-As: https://lore.kernel.org/git/pull.2317.git.git.1780685368.gitgitgadget@gmail.com
branch: prune-merged * Reworked --forked into a real ref-filter applied in apply_ref_filter() instead of a post-pass, so non-matching branches are never allocated. * Match exact --forked patterns on full refnames (only globs use the abbreviated upstream), and dropped the old helper machinery, forward declaration, and string_list in favor of a strvec. * Replaced the boolean parameters of delete_branches()/check_branch_commit() with a single unsigned int flags. * --prune-merged now collects candidates via filter_refs() rather than its own branch walk. * --prune-merged now takes its <branch> patterns as positional arguments (e.g. git branch --prune-merged origin/main 'feature*') instead of repeating the option. Harald Nordgren (6): branch: add --forked filter for --list mode branch: let delete_branches warn instead of error on bulk refusal branch: prepare delete_branches for a bulk caller branch: add --prune-merged <branch> branch: add branch.<name>.pruneMerged opt-out branch: add --dry-run for --prune-merged Documentation/config/branch.adoc | 7 + Documentation/git-branch.adoc | 41 +++- builtin/branch.c | 182 ++++++++++++--- ref-filter.c | 70 ++++++ ref-filter.h | 10 + t/t3200-branch.sh | 367 +++++++++++++++++++++++++++++++ 6 files changed, 650 insertions(+), 27 deletions(-) base-commit: 9ac3f19 Submitted-As: https://lore.kernel.org/git/pull.2285.v13.git.git.1780684553.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2285.git.git.1777671337839.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2285.v2.git.git.1777919250.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2285.v3.git.git.1777965747.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2285.v4.git.git.1778009038.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2285.v5.git.git.1778482708.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2285.v6.git.git.1778492691.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2285.v7.git.git.1778574229.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2285.v8.git.git.1778605658.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2285.v9.git.git.1778700883.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2285.v10.git.git.1779403204.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2285.v11.git.git.1779449498.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2285.v12.git.git.1780477479.gitgitgadget@gmail.com
git-gui: silence install recipes under "make -s" From: Harald Nordgren <haraldnordgren@gmail.com> Several install and uninstall recipes embed "echo" calls that fire as part of the recipe itself, so the install banners (DEST, INSTALL, LINK, REMOVE) were visible whenever the variables expand non-empty. Guard the whole "ifndef V" block on "-s" so the loud variants are selected only when "-s" is absent and V=1 is unset. The existing "-s" check also had its findstring arguments in the wrong order (needle "-s" never fit in haystack "s"), so swap them while moving the check to wrap the block. Signed-off-by: Harald Nordgren <harald.nordgren@kostdoktorn.se> Submitted-As: https://lore.kernel.org/git/pull.2318.v3.git.git.1780555730228.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2318.git.git.1780477489662.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2318.v2.git.git.1780510415838.gitgitgadget@gmail.com
Makefile: dedup archives in $(LIBS) so link recipes don't repeat them From: Harald Nordgren <haraldnordgren@gmail.com> A handful of link recipes listed archive files twice: once explicitly via $(filter %.a,$^) and again implicitly through $(LIBS), which expanded to $(filter-out %.o,$(GITLIBS)) $(EXTLIBS). On macOS the linker warned about the duplicates: ld: warning: ignoring duplicate libraries: 'libgit.a', 'target/release/libgitcore.a' Redefine $(LIBS) to list archive prerequisites from $^ first, then the rest of the library list with those archives filtered out so each appears only once. Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com> Submitted-As: https://lore.kernel.org/git/pull.2314.v2.git.git.1780610623006.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2314.git.git.1780269406949.gitgitgadget@gmail.com
Support hashing objects larger than 4GB on Windows Philip Oakley has contributed these patches ~4.5 years ago, and they have been carried in Git for Windows ever since. Now that there are already other patch series flying around that try to address various aspects about >4GB objects (which aren't handled well by Git until it stops forcing unsigned long to do size_t's job), it seems a good time to upstream these patches, too, at long last. Philip Oakley (6): hash-object: demonstrate a >4GB/LLP64 problem object-file.c: use size_t for header lengths hash algorithms: use size_t for section lengths hash-object --stdin: verify that it works with >4GB/LLP64 hash-object: add another >4GB/LLP64 test case hash-object: add a >4GB/LLP64 test case using filtered input object-file.c | 18 +++++++++--------- object-file.h | 4 ++-- sha1dc_git.c | 3 +-- sha1dc_git.h | 2 +- t/t1007-hash-object.sh | 39 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 52 insertions(+), 14 deletions(-) base-commit: 9ac3f19 Submitted-As: https://lore.kernel.org/git/pull.2138.git.1780593313.gitgitgadget@gmail.com
More work supporting objects larger than 4GB on Windows This patch series tries to address the problems pointed out by the expensive tests that now run in CI: t5608 and t7508 verify various aspects about objects larger than 4GB, which Git does not currently handle correctly when run on a platform where size_t is 64-bit and unsigned long is 32-bit. Unfortunately, this conflicts heavily with ps/odb-source-loose. I rebased the branch onto seen and pushed the result to https://github.com/dscho/git/tree/refs/heads/objects-larger-than-4gb-on-windows-pt2-seen, to make it easier to resolve merge conflicts. Here is the relevant range-diff: 1: f3aeae9 ! 1: 62adeb9 odb: use size_t for object_info.sizep and the size APIs @@ builtin/log.c: static int show_blob_object(const struct object_id *oid, struct r ## builtin/ls-files.c ## @@ builtin/ls-files.c: static void expand_objectsize(struct repository *repo, struct strbuf *line, - const enum object_type type, unsigned int padded) - { + size_t len; + if (type == OBJ_BLOB) { - unsigned long size; + size_t size; @@ builtin/ls-files.c: static void expand_objectsize(struct repository *repo, struc ## builtin/ls-tree.c ## @@ builtin/ls-tree.c: static void expand_objectsize(struct strbuf *line, const struct object_id *oid, - const enum object_type type, unsigned int padded) - { + size_t len; + if (type == OBJ_BLOB) { - unsigned long size; + size_t size; @@ notes.c: static void format_note(struct notes_tree *t, const struct object_id *o if (!t) ## object-file.c ## -@@ object-file.c: static int parse_loose_header(const char *hdr, struct object_info *oi) +@@ object-file.c: int parse_loose_header(const char *hdr, struct object_info *oi) } if (oi->sizep) @@ object-file.c: static int parse_loose_header(const char *hdr, struct object_info /* * The length must be followed by a zero byte -@@ object-file.c: static int read_object_info_from_path(struct odb_source *source, - void *map = NULL; - git_zstream stream, *stream_to_end = NULL; - char hdr[MAX_HEADER_LEN]; -- unsigned long size_scratch; -+ size_t size_scratch; - enum object_type type_scratch; - struct stat st; - @@ object-file.c: int force_object_loose(struct odb_source *source, - { + struct odb_source_files *files = odb_source_files_downcast(source); const struct git_hash_algo *compat = source->odb->repo->compat_hash_algo; void *buf; - unsigned long len; @@ object-file.c: int read_loose_object(struct repository *repo, fd = git_open(path); if (fd >= 0) -@@ object-file.c: int odb_source_loose_read_object_stream(struct odb_read_stream **out, - struct object_info oi = OBJECT_INFO_INIT; - struct odb_loose_read_stream *st; - unsigned long mapsize; -- unsigned long size_ul; - void *mapped; - - mapped = odb_source_loose_map_object(source, oid, &mapsize); -@@ object-file.c: int odb_source_loose_read_object_stream(struct odb_read_stream **out, - goto error; - } - -- /* -- * object_info.sizep is unsigned long* (32-bit on Windows), but -- * st->base.size is size_t (64-bit). Use temporary variable. -- * Note: loose objects >4GB would still truncate here, but such -- * large loose objects are uncommon (they'd normally be packed). -- */ -- oi.sizep = &size_ul; -+ oi.sizep = &st->base.size; - oi.typep = &st->base.type; - - if (parse_loose_header(st->hdr, &oi) < 0 || st->base.type < 0) - goto error; -- st->base.size = size_ul; - - st->mapped = mapped; - st->mapsize = mapsize; ## object.c ## @@ object.c: struct object *parse_object_with_flags(struct repository *r, @@ odb.h: int odb_read_object_info_extended(struct object_database *odb, enum odb_has_object_flags { /* Retry packed storage after checking packed and loose storage */ + ## odb/source-loose.c ## +@@ odb/source-loose.c: static int read_object_info_from_path(struct odb_source_loose *loose, + void *map = NULL; + git_zstream stream, *stream_to_end = NULL; + char hdr[MAX_HEADER_LEN]; +- unsigned long size_scratch; ++ size_t size_scratch; + enum object_type type_scratch; + struct stat st; + +@@ odb/source-loose.c: static int odb_source_loose_read_object_stream(struct odb_read_stream **out, + struct object_info oi = OBJECT_INFO_INIT; + struct odb_loose_read_stream *st; + unsigned long mapsize; +- unsigned long size_ul; + void *mapped; + + mapped = odb_source_loose_map_object(loose, oid, &mapsize); +@@ odb/source-loose.c: static int odb_source_loose_read_object_stream(struct odb_read_stream **out, + goto error; + } + +- /* +- * object_info.sizep is unsigned long* (32-bit on Windows), but +- * st->base.size is size_t (64-bit). Use temporary variable. +- * Note: loose objects >4GB would still truncate here, but such +- * large loose objects are uncommon (they'd normally be packed). +- */ +- oi.sizep = &size_ul; ++ oi.sizep = &st->base.size; + oi.typep = &st->base.type; + + if (parse_loose_header(st->hdr, &oi) < 0 || st->base.type < 0) + goto error; +- st->base.size = size_ul; + + st->mapped = mapped; + st->mapsize = mapsize; + ## odb/streaming.c ## @@ odb/streaming.c: static int open_istream_incore(struct odb_read_stream **out, .base.read = read_istream_incore, Johannes Schindelin (7): compat/msvc: use _chsize_s for ftruncate patch-delta: use size_t for sizes pack-objects(check_pack_inflate()): use size_t instead of unsigned long packfile: widen unpack_entry()'s size out-parameter to size_t pack-objects: use size_t for in-core object sizes packfile,delta: drop the `cast_size_t_to_ulong()` wrappers odb: use size_t for object_info.sizep and the size APIs apply.c | 8 ++-- archive.c | 4 +- attr.c | 2 +- bisect.c | 2 +- blame.c | 15 +++++-- builtin/cat-file.c | 39 ++++++++++++------- builtin/difftool.c | 2 +- builtin/fast-export.c | 7 +++- builtin/fast-import.c | 29 ++++++++++---- builtin/fsck.c | 2 +- builtin/grep.c | 12 +++--- builtin/index-pack.c | 10 ++--- builtin/log.c | 2 +- builtin/ls-files.c | 2 +- builtin/ls-tree.c | 4 +- builtin/merge-tree.c | 6 +-- builtin/mktag.c | 2 +- builtin/notes.c | 6 +-- builtin/pack-objects.c | 73 +++++++++++++++++++++-------------- builtin/repo.c | 4 +- builtin/tag.c | 4 +- builtin/unpack-file.c | 2 +- builtin/unpack-objects.c | 8 ++-- bundle.c | 2 +- combine-diff.c | 4 +- commit.c | 10 ++--- compat/msvc-posix.h | 24 +++++++++++- config.c | 2 +- delta.h | 20 +++------- diff.c | 5 ++- dir.c | 2 +- entry.c | 4 +- fmt-merge-msg.c | 4 +- fsck.c | 2 +- grep.c | 4 +- http-push.c | 2 +- list-objects-filter.c | 2 +- mailmap.c | 2 +- match-trees.c | 4 +- merge-blobs.c | 6 +-- merge-blobs.h | 2 +- merge-ort.c | 2 +- notes-cache.c | 2 +- notes-merge.c | 2 +- notes.c | 8 ++-- object-file.c | 18 +++------ object.c | 2 +- odb.c | 12 +++--- odb.h | 10 ++--- odb/streaming.c | 13 +------ pack-bitmap.c | 4 +- pack-check.c | 5 +-- pack-objects.h | 2 +- packfile.c | 54 ++++++++++---------------- packfile.h | 5 ++- patch-delta.c | 8 ++-- path-walk.c | 2 +- protocol-caps.c | 5 ++- read-cache.c | 6 +-- ref-filter.c | 2 +- reflog.c | 2 +- rerere.c | 2 +- submodule-config.c | 2 +- t/helper/test-delta.c | 10 +++-- t/helper/test-pack-deltas.c | 3 +- t/helper/test-partial-clone.c | 2 +- t/unit-tests/u-odb-inmemory.c | 2 +- tag.c | 4 +- tree-walk.c | 10 +++-- tree.c | 2 +- xdiff-interface.c | 2 +- 71 files changed, 296 insertions(+), 253 deletions(-) base-commit: 9ac3f19 Submitted-As: https://lore.kernel.org/git/pull.2137.git.1780570272.gitgitgadget@gmail.com
PreviousNext