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

[Outreachy PATCH v7 0/3] store repo specific config values in new `struct repo_config_values`

From
Olamide Caleb Bello <belkid98@gmail.com>
Date
Feb 16, 2026, 16:38 UTC
Message-ID
<cover.1771258573.git.belkid98@gmail.com>
In-Reply-To
<cover.1769256839.git.belkid98@gmail.com>

Hi Git Community, Over the course of my ongoing internship, which focused on moving repo specific global variables in environment.h into local scope, I have attempted to move some variables into the struct repo-settings. However there has been some design concerns as regards the use of `prepare_repo_settings()` with respect to when and where to call the function, and also the change in behaviours when the variable is lazily loaded as discussed in [1] and [2].

After different deliberations, Phillip Wood proposed creating a new config struct [3], adding it to the repository struct and passing the repo struct to `git_default_config()` to store parsed repo specific config values per repo. This ensures the current behaviours will be retained.

In version v6, the fuzz-commit-graph failed due to the test being run multiples times in the same process. This makes us get a BUG due to the repository being reinitialized in the same process. But now resetting the initialization using memset before rerunning the test, the failure is not longer experienced.

1. https://lore.kernel.org/git/43aaec10-2696-44c9-8728-2045b83dc5d3@gmail.com/
2. https://lore.kernel.org/git/a881499d-e236-4f8e-a217-b6bce69e3e3c@gmail.com/
3. https://lore.kernel.org/git/8899016f-eeef-404b-8da6-ff3a90e81cea@gmail.com
4. https://github.com/git/git/actions/runs/21633462506/job/62352191148?pr=2166
5. https://gitlab.com/gitlab-community/gitlab-org/git/-/pipelines/2303203992
Changes in v7:
==============
- Added the code to reset the initialization of the_repository
  in the fuzz-commit-graph test in Patch 1.
- Changed the call to rep_config_values_init() in
  initialze_repository() by passing it the repo config_values_private_
  struct instead of the accessor function in Patch 1.
- Modified the commit message in Patch 1
- Added extra lines between variable declarations and code
Olamide Caleb Bello (3):
  environment: stop storing `core.attributesFile` globally
  environment: stop using core.sparseCheckout globally
  environment: move "branch.autoSetupMerge" into `struct
    repo_config_values`
 attr.c                       |  7 ++++---
 branch.h                     |  2 --
 builtin/backfill.c           |  3 ++-
 builtin/branch.c             |  3 ++-
 builtin/checkout.c           |  3 ++-
 builtin/clone.c              |  4 +++-
 builtin/grep.c               |  2 +-
 builtin/mv.c                 |  3 ++-
 builtin/push.c               |  3 ++-
 builtin/sparse-checkout.c    | 31 ++++++++++++++++++++-----------
 builtin/submodule--helper.c  |  3 ++-
 builtin/worktree.c           |  3 ++-
 dir.c                        |  4 +++-
 environment.c                | 28 ++++++++++++++++++----------
 environment.h                | 17 +++++++++++++++--
 oss-fuzz/fuzz-commit-graph.c |  1 +
 repository.c                 | 14 ++++++++++++++
 repository.h                 |  7 +++++++
 sparse-index.c               |  7 +++++--
 unpack-trees.c               |  3 ++-
 wt-status.c                  |  4 +++-
 21 files changed, 110 insertions(+), 42 deletions(-)
Range diff versus v6:
=====================
1:  7e3082125d ! 1:  48821a3848 environment: stop storing `core.attributesFile` globally
    @@ Commit message
         The `core.attributeFile` config value is parsed in
         git_default_core_config(), loaded eagerly and stored in the global
    -    variable `git_attributes_file`. Storing this value in a global variable
    -    can lead to it being overwritten by another repository when more than one
    -    Git repository run in the same Git process.
    +    variable `git_attributes_file`. Storing this value in a global
    +    variable can lead to it being overwritten by another repository when
    +    more than one Git repository run in the same Git process.
         Create a new struct `repo_config_values` to hold this value and
         other repository dependent values parsed by `git_default_config()`.
         This will ensure the current behaviour remains the same while also
         enabling the libification of Git.
    -    An accessor function 'repo_config_values()' is created and used to access
    -    the new struct member of the repository struct.
    -    This is to ensure that we detect if the struct repository has been
    -    initialized and also prevent double initialization of the repository.
    -
    -    It is important to note that `git_default_config()` is a wrapper to other
    -    `git_default_*_config()` functions such as `git_default_core_config()`.
    -    Therefore to access and modify this global variable,
    -    the change has to be made `git_default_core_config()`.
    +    An accessor function 'repo_config_values()' to ensure that we do not
    +    access an uninitialized repository, or an instance of a different
    +    repository than the current one.
         Suggested-by: Phillip Wood <phillip.wood123@gmail.com>
         Mentored-by: Christian Couder <christian.couder@gmail.com>
    @@ environment.h: extern int assume_unchanged;
      extern int pack_compression_level;
      extern unsigned long pack_size_limit_cfg;
    + ## oss-fuzz/fuzz-commit-graph.c ##
    +@@ oss-fuzz/fuzz-commit-graph.c: int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
    + {
    + 	struct commit_graph *g;
    +
    ++	memset(the_repository, 0, sizeof(*the_repository));
    + 	initialize_repository(the_repository);
    +
    + 	/*
    +
      ## repository.c ##
     @@ repository.c: static void set_default_hash_algo(struct repository *repo)
      	repo_set_hash_algo(repo, algo);
    @@ repository.c: static void set_default_hash_algo(struct repository *repo)
     +struct repo_config_values *repo_config_values(struct repository *repo)
     +{
    ++	if (repo != the_repository)
    ++		BUG("trying to read config from wrong repository instance");
     +	if(!repo->initialized)
     +		BUG("config values from uninitialized repository");
     +	return &repo->config_values_private_;
    @@ repository.c: static void set_default_hash_algo(struct repository *repo)
      	ALLOC_ARRAY(repo->index, 1);
      	index_state_init(repo->index, repo);
      	repo->check_deprecated_config = true;
    -+	repo_config_values_init(repo_config_values(repo));
    ++	repo_config_values_init(&repo->config_values_private_);
      	/*
      	 * When a command runs inside a repository, it learns what
2:  8645b4f595 ! 2:  7d33f1ef0f environment: stop using core.sparseCheckout globally
    @@ builtin/clone.c: static int git_sparse_checkout_init(const char *repo)
      	struct child_process cmd = CHILD_PROCESS_INIT;
      	int result = 0;
     +	struct repo_config_values *cfg = repo_config_values(the_repository);
    ++
      	strvec_pushl(&cmd.args, "-C", repo, "sparse-checkout", "set", NULL);
      	/*
    @@ dir.c: enum pattern_match_result path_matches_pattern_list(
      {
     -	if (!core_apply_sparse_checkout)
     +	struct repo_config_values *cfg = repo_config_values(the_repository);
    ++
     +	if (!cfg->apply_sparse_checkout)
      		return 1;
      	if (istate->sparse_checkout_patterns)
    @@ sparse-index.c: static int index_has_unmerged_entries(struct index_state *istate
      {
     -	if (!core_apply_sparse_checkout || !core_sparse_checkout_cone)
     +	struct repo_config_values *cfg = repo_config_values(the_repository);
    ++
     +	if (!cfg->apply_sparse_checkout || !core_sparse_checkout_cone)
      		return 0;
3:  60451b93a5 = 3:  c3ecfa63b9 environment: move "branch.autoSetupMerge" into `struct repo_config_values`
-- 
2.34.1
Previous: Phillip WoodNext: Olamide Caleb Bello
Message 61 of 71 in “store git_default_config() parsed values in new config struct”
  1. 0/3 store git_default_config() parsed values in new config structOlamide Caleb Bello, Jan 12, 2026
  2. 1/3 environment: stop storing `core.attributesFile` globallyOlamide Caleb Bello, Jan 12, 2026
  3. Phillip WoodJan 12, 2026
  4. Bello OlamideJan 12, 2026
  5. 2/3 environment: stop using core.sparseCheckout globallyOlamide Caleb Bello, Jan 12, 2026
  6. 3/3 environment: move "branch.autoSetupMerge" into `struct config_values`Olamide Caleb Bello, Jan 12, 2026
  7. 0/3 store git_default_config() parsed values in new config structOlamide Caleb Bello, Jan 13, 2026
  8. 1/3 environment: stop storing `core.attributesFile` globallyOlamide Caleb Bello, Jan 13, 2026
  9. Junio C HamanoJan 13, 2026
  10. Bello OlamideJan 14, 2026
  11. 2/3 environment: environment: stop using core.sparseCheckout globallyOlamide Caleb Bello, Jan 13, 2026
  12. Junio C HamanoJan 13, 2026
  13. Bello OlamideJan 14, 2026
  14. 3/3 environment: move "branch.autoSetupMerge" into `struct repo_config_values`Olamide Caleb Bello, Jan 13, 2026
  15. Junio C HamanoJan 13, 2026
  16. Bello OlamideJan 14, 2026
  17. Bello OlamideJan 15, 2026
  18. 0/3 store repo specific config values in new `struct repo_config_values`Olamide Caleb Bello, Jan 17, 2026
  19. 1/3 environment: stop storing `core.attributesFile` globallyOlamide Caleb Bello, Jan 17, 2026
  20. Toon ClaesJan 22, 2026
  21. Bello OlamideJan 22, 2026
  22. Phillip WoodJan 22, 2026
  23. Bello OlamideJan 22, 2026
  24. 2/3 environment: environment: stop using core.sparseCheckout globallyOlamide Caleb Bello, Jan 17, 2026
  25. Toon ClaesJan 22, 2026
  26. Bello OlamideJan 22, 2026
  27. Phillip WoodJan 22, 2026
  28. Bello OlamideJan 22, 2026
  29. Phillip WoodJan 23, 2026
  30. Bello OlamideJan 23, 2026
  31. 3/3 environment: move "branch.autoSetupMerge" into `struct repo_config_values`Olamide Caleb Bello, Jan 17, 2026
  32. Phillip WoodJan 22, 2026
  33. Bello OlamideJan 22, 2026
  34. Bello OlamideJan 20, 2026
  35. 0/3 store repo specific config values in new `struct repo_config_values`Olamide Caleb Bello, Jan 24, 2026
  36. 1/3 environment: stop storing `core.attributesFile` globallyOlamide Caleb Bello, Jan 24, 2026
  37. 2/3 environment: stop using core.sparseCheckout globallyOlamide Caleb Bello, Jan 24, 2026
  38. 3/3 environment: move "branch.autoSetupMerge" into `struct repo_config_values`Olamide Caleb Bello, Jan 24, 2026
  39. 0/3 store repo specific config values in new `struct repo_config_values`Olamide Caleb Bello, Jan 24, 2026
  40. 1/3 environment: stop storing `core.attributesFile` globallyOlamide Caleb Bello, Jan 24, 2026
  41. Junio C HamanoJan 29, 2026
  42. 2/3 environment: stop using core.sparseCheckout globallyOlamide Caleb Bello, Jan 24, 2026
  43. Junio C HamanoJan 29, 2026
  44. 3/3 environment: move "branch.autoSetupMerge" into `struct repo_config_values`Olamide Caleb Bello, Jan 24, 2026
  45. Junio C HamanoJan 29, 2026
  46. Junio C HamanoJan 30, 2026
  47. Junio C HamanoJan 30, 2026
  48. Bello OlamideJan 29, 2026
  49. 0/3 store repo specific config values in new `struct repo_config_values`Olamide Caleb Bello, Feb 3, 2026
  50. 1/3 environment: stop storing `core.attributesFile` globallyOlamide Caleb Bello, Feb 3, 2026
  51. Phillip WoodFeb 4, 2026
  52. Bello OlamideFeb 9, 2026
  53. Junio C HamanoFeb 7, 2026
  54. Phillip WoodFeb 8, 2026
  55. Bello OlamideFeb 9, 2026
  56. Bello OlamideFeb 10, 2026
  57. 2/3 environment: stop using core.sparseCheckout globallyOlamide Caleb Bello, Feb 3, 2026
  58. Phillip WoodFeb 4, 2026
  59. 3/3 environment: move "branch.autoSetupMerge" into `struct repo_config_values`Olamide Caleb Bello, Feb 3, 2026
  60. Phillip WoodFeb 4, 2026
  61. 0/3 store repo specific config values in new `struct repo_config_values`Olamide Caleb Bello, Feb 16, 2026
  62. 1/3 environment: stop storing `core.attributesFile` globallyOlamide Caleb Bello, Feb 16, 2026
  63. 2/3 environment: stop using core.sparseCheckout globallyOlamide Caleb Bello, Feb 16, 2026
  64. Christian CouderFeb 26, 2026
  65. Junio C HamanoFeb 26, 2026
  66. Bello OlamideFeb 26, 2026
  67. 3/3 environment: move "branch.autoSetupMerge" into `struct repo_config_values`Olamide Caleb Bello, Feb 16, 2026
  68. Junio C HamanoFeb 17, 2026
  69. Bello OlamideFeb 18, 2026
  70. Christian CouderFeb 26, 2026
  71. Junio C HamanoFeb 26, 2026

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.