-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
commit-graph: allow cross-alternate chains
In an environment like a fork network, it is helpful to have a commit-graph chain that spans both the base repo and the fork repo. The fork is usually a small set of data on top of the large repo, but sometimes the fork is much larger. For example, git-for-windows/git has almost double the number of commits as git/git because it rebases its commits on every major version update. To allow cross-alternate commit-graph chains, we need a few pieces: 1. When looking for a graph-{hash}.graph file, check all alternates. 2. When merging commit-graph chains, do not merge across alternates. 3. When writing a new commit-graph chain based on a commit-graph file in another object directory, do not allow success if the base file has of the name "commit-graph" instead of "commit-graphs/graph-{hash}.graph". Signed-off-by: Derrick Stolee <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
- Loading branch information
1 parent
1771be9
commit c523035
Showing
4 changed files
with
123 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -266,6 +266,42 @@ The merge strategy values (2 for the size multiple, 64,000 for the maximum | |
number of commits) could be extracted into config settings for full | ||
flexibility. | ||
|
||
## Chains across multiple object directories | ||
|
||
In a repo with alternates, we look for the `commit-graph-chain` file starting | ||
in the local object directory and then in each alternate. The first file that | ||
exists defines our chain. As we look for the `graph-{hash}` files for | ||
each `{hash}` in the chain file, we follow the same pattern for the host | ||
directories. | ||
|
||
This allows commit-graphs to be split across multiple forks in a fork network. | ||
The typical case is a large "base" repo with many smaller forks. | ||
|
||
As the base repo advances, it will likely update and merge its commit-graph | ||
chain more frequently than the forks. If a fork updates their commit-graph after | ||
the base repo, then it should "reparent" the commit-graph chain onto the new | ||
chain in the base repo. When reading each `graph-{hash}` file, we track | ||
the object directory containing it. During a write of a new commit-graph file, | ||
we check for any changes in the source object directory and read the | ||
`commit-graph-chain` file for that source and create a new file based on those | ||
files. During this "reparent" operation, we necessarily need to collapse all | ||
levels in the fork, as all of the files are invalid against the new base file. | ||
|
||
It is crucial to be careful when cleaning up "unreferenced" `graph-{hash}.graph` | ||
files in this scenario. It falls to the user to define the proper settings for | ||
their custom environment: | ||
|
||
1. When merging levels in the base repo, the unreferenced files may still be | ||
referenced by chains from fork repos. | ||
|
||
2. The expiry time should be set to a length of time such that every fork has | ||
time to recompute their commit-graph chain to "reparent" onto the new base | ||
file(s). | ||
|
||
3. If the commit-graph chain is updated in the base, the fork will not have | ||
access to the new chain until its chain is updated to reference those files. | ||
(This may change in the future [5].) | ||
|
||
Related Links | ||
------------- | ||
[0] https://bugs.chromium.org/p/git/issues/detail?id=8 | ||
|
@@ -292,3 +328,7 @@ Related Links | |
|
||
[4] https://public-inbox.org/git/[email protected]/T/#u | ||
A patch to remove the ahead-behind calculation from 'status'. | ||
|
||
[5] https://public-inbox.org/git/[email protected]/ | ||
A discussion of a "two-dimensional graph position" that can allow reading | ||
multiple commit-graph chains at the same time. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters