Skip to content

Commit

Permalink
Merge branch 'bc/clone-with-git-default-hash-fix'
Browse files Browse the repository at this point in the history
"git clone" that clones from SHA-1 repository, while
GIT_DEFAULT_HASH set to use SHA-256 already, resulted in an
unusable repository that half-claims to be SHA-256 repository
with SHA-1 objects and refs.  This has been corrected.

* bc/clone-with-git-default-hash-fix:
  builtin/clone: avoid failure with GIT_DEFAULT_HASH
  • Loading branch information
gitster committed Sep 29, 2020
2 parents 288ed98 + 47ac970 commit b28919c
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 4 deletions.
2 changes: 1 addition & 1 deletion builtin/clone.c
Original file line number Diff line number Diff line change
Expand Up @@ -1233,7 +1233,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
* Now that we know what algorithm the remote side is using,
* let's set ours to the same thing.
*/
initialize_repository_version(hash_algo);
initialize_repository_version(hash_algo, 1);
repo_set_hash_algo(the_repository, hash_algo);

mapped_refs = wanted_peer_refs(refs, &remote->fetch);
Expand Down
6 changes: 4 additions & 2 deletions builtin/init-db.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ static int needs_work_tree_config(const char *git_dir, const char *work_tree)
return 1;
}

void initialize_repository_version(int hash_algo)
void initialize_repository_version(int hash_algo, int reinit)
{
char repo_version_string[10];
int repo_version = GIT_REPO_VERSION;
Expand All @@ -195,6 +195,8 @@ void initialize_repository_version(int hash_algo)
if (hash_algo != GIT_HASH_SHA1)
git_config_set("extensions.objectformat",
hash_algos[hash_algo].name);
else if (reinit)
git_config_set_gently("extensions.objectformat", NULL);
}

static int create_default_files(const char *template_path,
Expand Down Expand Up @@ -277,7 +279,7 @@ static int create_default_files(const char *template_path,
free(ref);
}

initialize_repository_version(fmt->hash_algo);
initialize_repository_version(fmt->hash_algo, 0);

/* Check filemode trustability */
path = git_path_buf(&buf, "config");
Expand Down
2 changes: 1 addition & 1 deletion cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -629,7 +629,7 @@ int path_inside_repo(const char *prefix, const char *path);
int init_db(const char *git_dir, const char *real_git_dir,
const char *template_dir, int hash_algo,
const char *initial_branch, unsigned int flags);
void initialize_repository_version(int hash_algo);
void initialize_repository_version(int hash_algo, int reinit);

void sanitize_stdfds(void);
int daemonize(void);
Expand Down
14 changes: 14 additions & 0 deletions t/t5601-clone.sh
Original file line number Diff line number Diff line change
Expand Up @@ -631,6 +631,20 @@ test_expect_success CASE_INSENSITIVE_FS 'colliding file detection' '
test_i18ngrep "the following paths have collided" icasefs/warning
'

test_expect_success 'clone with GIT_DEFAULT_HASH' '
(
sane_unset GIT_DEFAULT_HASH &&
git init --object-format=sha1 test-sha1 &&
git init --object-format=sha256 test-sha256
) &&
test_commit -C test-sha1 foo &&
test_commit -C test-sha256 foo &&
GIT_DEFAULT_HASH=sha1 git clone test-sha256 test-clone-sha256 &&
GIT_DEFAULT_HASH=sha256 git clone test-sha1 test-clone-sha1 &&
git -C test-clone-sha1 status &&
git -C test-clone-sha256 status
'

partial_clone_server () {
SERVER="$1" &&

Expand Down

0 comments on commit b28919c

Please sign in to comment.