One unresolved issue with the commit-graph feature is that it can cause issues 
when combined with replace objects, commit grafts, or shallow clones. These are 
not 100% incompatible, as one could be reasonably successful writing a 
commit-graph after replacing some objects and not have issues. The problems 
happen when commits that are already in the commit-graph file are replaced, or 
when git is run with the `--no-replace-objects` option; this can cause 
incorrect parents or incorrect generation numbers. Similar things occur with 
commit grafts and shallow clones, especially when running `git fetch 
--unshallow` in a shallow repo.

Instead of trying (and probably failing) to make these features work together, 
default to making the commit-graph feature unavailable in these situations. 
Create a new method 'commit_graph_compatible(r)' that checks if the repository 
'r' has any of these features enabled.

I will send a follow-up patch that shows how I tested these interactions by 
computing the commit-graph on every 'git commit'.

This approach works for most cases, but I found one nagging test case that was 
causing problems. This led to the commit "commit-graph: close_commit_graph 
before shallow walk" and is the patch I am least confident about. Please take a 
close look at that one and suggest alternatives.

This approach is very different from the previous RFC on the subject [1].

While building this series, I got some test failures in the non-the_repository 
tests. These issues are related to missing references to an arbitrary 
repository (instead of the_repository) and some uninitialized values in the 
tests. Stefan already sent a patch to address this [2], and I've included those 
commits (along with a small tweak [3]). These are only included for convenience.

Thanks,
-Stolee

[1] https://public-inbox.org/git/20180531174024.124488-1-dsto...@microsoft.com/
     [RFC PATCH 0/6] Fix commit-graph/graft/replace/shallow combo

[2] https://public-inbox.org/git/20180717224935.96397-1-sbel...@google.com/T/#t
    [PATCH 0/2] RFC ref store to repository migration

[3] 
https://public-inbox.org/git/20180717224935.96397-1-sbel...@google.com/T/#m966eac85fd58c66523654ddaf0bec72877d3295a
    [PATCH] TO-SQUASH: replace the_repository with arbitrary r

Based-On: jt/commit-graph-per-object-store
Cc: jonathanta...@google.com
Cc: sbel...@google.com

Derrick Stolee (6):
  commit-graph: update design document
  test-repository: properly init repo
  commit-graph: not compatible with replace objects
  commit-graph: not compatible with grafts
  commit-graph: not compatible with uninitialized repo
  commit-graph: close_commit_graph before shallow walk

Stefan Beller (2):
  refs.c: migrate internal ref iteration to pass thru repository
    argument
  refs.c: upgrade for_each_replace_ref to be a each_repo_ref_fn callback

 Documentation/technical/commit-graph.txt | 18 ++++++--
 builtin/replace.c                        |  8 ++--
 commit-graph.c                           | 34 ++++++++++++--
 commit-graph.h                           |  1 +
 commit.c                                 |  2 +-
 commit.h                                 |  1 +
 refs.c                                   | 48 +++++++++++++++++---
 refs.h                                   | 12 ++++-
 refs/iterator.c                          |  6 +--
 refs/refs-internal.h                     |  5 +-
 replace-object.c                         |  7 +--
 replace-object.h                         |  2 +
 t/helper/test-repository.c               | 10 +++-
 t/t5318-commit-graph.sh                  | 58 ++++++++++++++++++++++++
 upload-pack.c                            |  2 +
 15 files changed, 184 insertions(+), 30 deletions(-)


base-commit: dade47c06cf849b0ca180a8e6383b55ea6f75812
Published-As: 
https://github.com/gitgitgadget/git/releases/tags/pr-11%2Fderrickstolee%2Fshallow%2Fupstream-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git 
pr-11/derrickstolee/shallow/upstream-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/11
-- 
gitgitgadget

Reply via email to