From: Patrick Steinhardt <ps@pks.im>
To: git@vger.kernel.org
Subject: [PATCH 3/3] setup: fix reinit of repos with incompatible GIT_DEFAULT_HASH
Date: Thu, 30 Jan 2025 17:24:19 +0100 [thread overview]
Message-ID: <20250130-b4-pks-reinit-default-ref-format-v1-3-d2769ca01207@pks.im> (raw)
In-Reply-To: <20250130-b4-pks-reinit-default-ref-format-v1-0-d2769ca01207@pks.im>
The exact same issue as described in the preceding commit also exists
for GIT_DEFAULT_HASH. Thus, reinitializing a repository that e.g. uses
SHA1 with `GIT_DEFAULT_HASH=sha256 git init` will cause the object
format of that repository to change to SHA256. This is of course bogus
as any existing objects and refs will not be converted, thus causing
repository corruption:
$ git init repo
Initialized empty Git repository in /tmp/repo/.git/
$ cd repo/
$ git commit --allow-empty -m message
[main (root-commit) 35a7344] message
$ GIT_DEFAULT_HASH=sha256 git init
Reinitialized existing Git repository in /tmp/repo/.git/
$ git show
fatal: your current branch appears to be broken
Fix the issue by ignoring the environment variable in case the repo has
already been initialized with an object hash.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
setup.c | 4 +++-
t/t0001-init.sh | 12 ++++++++++++
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/setup.c b/setup.c
index 53ffeabc5b..7da7aa8984 100644
--- a/setup.c
+++ b/setup.c
@@ -2517,7 +2517,9 @@ static void repository_format_configure(struct repository_format *repo_fmt,
int env_algo = hash_algo_by_name(env);
if (env_algo == GIT_HASH_UNKNOWN)
die(_("unknown hash algorithm '%s'"), env);
- repo_fmt->hash_algo = env_algo;
+ if (repo_fmt->version < 0 ||
+ repo_fmt->hash_algo == GIT_HASH_UNKNOWN)
+ repo_fmt->hash_algo = env_algo;
} else if (cfg.hash != GIT_HASH_UNKNOWN) {
repo_fmt->hash_algo = cfg.hash;
}
diff --git a/t/t0001-init.sh b/t/t0001-init.sh
index 6dff8b75f1..c49d9e0d38 100755
--- a/t/t0001-init.sh
+++ b/t/t0001-init.sh
@@ -586,6 +586,18 @@ test_expect_success 'GIT_DEFAULT_HASH overrides init.defaultObjectFormat' '
echo sha256 >expected
'
+for hash in sha1 sha256
+do
+ test_expect_success "reinit repository with GIT_DEFAULT_HASH=$hash does not change format" '
+ test_when_finished "rm -rf repo" &&
+ git init repo &&
+ git -C repo rev-parse --show-object-format >expect &&
+ GIT_DEFAULT_HASH=$hash git init repo &&
+ git -C repo rev-parse --show-object-format >actual &&
+ test_cmp expect actual
+ '
+done
+
test_expect_success 'extensions.objectFormat is not allowed with repo version 0' '
test_when_finished "rm -rf explicit-v0" &&
git init --object-format=sha256 explicit-v0 &&
--
2.48.1.468.gbf5f394be8.dirty
next prev parent reply other threads:[~2025-01-30 16:24 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-30 16:24 [PATCH 0/3] setup: fix reinit of repos with different formats Patrick Steinhardt
2025-01-30 16:24 ` [PATCH 1/3] t0001: remove duplicate test Patrick Steinhardt
2025-01-30 16:24 ` [PATCH 2/3] setup: fix reinit of repos with incompatible GIT_DEFAULT_REF_FORMAT Patrick Steinhardt
2025-01-30 22:40 ` Junio C Hamano
2025-01-31 22:38 ` Junio C Hamano
2025-02-03 5:29 ` Patrick Steinhardt
2025-02-03 14:01 ` Junio C Hamano
2025-02-03 15:02 ` Patrick Steinhardt
2025-01-30 16:24 ` Patrick Steinhardt [this message]
2025-01-31 22:40 ` [PATCH 3/3] setup: fix reinit of repos with incompatible GIT_DEFAULT_HASH Junio C Hamano
2025-01-30 23:58 ` [PATCH 0/3] setup: fix reinit of repos with different formats brian m. carlson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250130-b4-pks-reinit-default-ref-format-v1-3-d2769ca01207@pks.im \
--to=ps@pks.im \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).