Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sparse Index: Integrate with 'git add' #999

Commits on Jul 29, 2021

  1. t1092: test merge conflicts outside cone

    Conflicts can occur outside of the sparse-checkout definition, and in
    that case users might try to resolve the conflicts in several ways.
    Document a few of these ways in a test. Make it clear that this behavior
    is not necessarily the optimal flow, since users can become confused
    when Git deletes these files from the worktree in later commands.
    
    Reviewed-by: Elijah Newren <newren@gmail.com>
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    derrickstolee committed Jul 29, 2021
    Configuration menu
    Copy the full SHA
    5e96df4 View commit details
    Browse the repository at this point in the history
  2. add: allow operating on a sparse-only index

    Disable command_requires_full_index for 'git add'. This does not require
    any additional removals of ensure_full_index(). The main reason is that
    'git add' discovers changes based on the pathspec and the worktree
    itself. These are then inserted into the index directly, and calls to
    index_name_pos() or index_file_exists() already call expand_to_path() at
    the appropriate time to support a sparse-index.
    
    Add a test to check that 'git add -A' and 'git add <file>' does not
    expand the index at all, as long as <file> is not within a sparse
    directory. This does not help the global 'git add .' case.
    
    We can measure the improvement using p2000-sparse-operations.sh with
    these results:
    
    Test                                  HEAD~1           HEAD
    ------------------------------------------------------------------------------
    2000.6: git add -A (full-index-v3)    0.35(0.30+0.05)  0.37(0.29+0.06) +5.7%
    2000.7: git add -A (full-index-v4)    0.31(0.26+0.06)  0.33(0.27+0.06) +6.5%
    2000.8: git add -A (sparse-index-v3)  0.57(0.53+0.07)  0.05(0.04+0.08) -91.2%
    2000.9: git add -A (sparse-index-v4)  0.58(0.55+0.06)  0.05(0.05+0.06) -91.4%
    
    While the 91% improvement seems impressive, it's important to recognize
    that previously we had significant overhead for expanding the
    sparse-index. Comparing to the full index case, 'git add -A' goes from
    0.37s to 0.05s, which is "only" an 86% improvement.
    
    This modification to 'git add' creates some behavior change depending on
    the use of a sparse index. We modify a test in t1092 to demonstrate
    these changes which will be remedied in future changes.
    
    Reviewed-by: Elijah Newren <newren@gmail.com>
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    derrickstolee committed Jul 29, 2021
    Configuration menu
    Copy the full SHA
    defab1b View commit details
    Browse the repository at this point in the history
  3. pathspec: stop calling ensure_full_index

    The add_pathspec_matches_against_index() focuses on matching a pathspec
    to file entries in the index. This already works correctly for its only
    use: checking if untracked files exist in the index.
    
    The compatibility checks in t1092 already test that 'git add <dir>'
    works for a directory outside of the sparse cone. That provides coverage
    for removing this guard.
    
    This finalizes our ability to run 'git add .' without expanding a sparse
    index to a full one. This is evidenced by an update to t1092 and by
    these performance numbers for p2000-sparse-operations.sh:
    
    Test                                    HEAD~1            HEAD
    --------------------------------------------------------------------------------
    2000.10: git add . (full-index-v3)      0.37(0.28+0.07)   0.36(0.27+0.06) -2.7%
    2000.11: git add . (full-index-v4)      0.33(0.26+0.06)   0.32(0.28+0.05) -3.0%
    2000.12: git add . (sparse-index-v3)    0.57(0.53+0.07)   0.06(0.06+0.07) -89.5%
    2000.13: git add . (sparse-index-v4)    0.57(0.53+0.07)   0.05(0.03+0.09) -91.2%
    
    While the ~90% improvement is shown by the test results, it is worth
    noting that expanding the sparse index was adding overhead in previous
    commits. Comparing to the full index case, we see the performance go
    from 0.33s to 0.05s, an 85% improvement.
    
    Reviewed-by: Elijah Newren <newren@gmail.com>
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    derrickstolee committed Jul 29, 2021
    Configuration menu
    Copy the full SHA
    9fc4313 View commit details
    Browse the repository at this point in the history
  4. add: ignore outside the sparse-checkout in refresh()

    Since b243012 (refresh_index(): add flag to ignore SKIP_WORKTREE
    entries, 2021-04-08), 'git add --refresh <path>' will output a warning
    message when the path is outside the sparse-checkout definition. The
    implementation of this warning happened in parallel with the
    sparse-index work to add ensure_full_index() calls throughout the
    codebase.
    
    Update this loop to have the proper logic that checks to see if the
    pathspec is outside the sparse-checkout definition. This avoids the need
    to expand the sparse directory entry and determine if the path is
    tracked, untracked, or ignored. We simply avoid updating the stat()
    information because there isn't even an entry that matches the path!
    
    Reviewed-by: Elijah Newren <newren@gmail.com>
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    derrickstolee committed Jul 29, 2021
    Configuration menu
    Copy the full SHA
    0ec03ab View commit details
    Browse the repository at this point in the history
  5. add: remove ensure_full_index() with --renormalize

    The --renormalize option updates the EOL conversions for the tracked
    files. However, the loop already ignores files marked with the
    SKIP_WORKTREE bit, so it will continue to do so with a sparse index
    because the sparse directory entries also have this bit set.
    
    Reviewed-by: Elijah Newren <newren@gmail.com>
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    derrickstolee committed Jul 29, 2021
    Configuration menu
    Copy the full SHA
    adf5b15 View commit details
    Browse the repository at this point in the history