Skip to content

Commit

Permalink
core.abbrevguard: Ensure short object names stay unique a bit longer
Browse files Browse the repository at this point in the history
Even though git makes sure that it uses enough hexdigits to show an
abbreviated object name unambiguously, as more objects are added to the
repository over time, a short name that used to be unique will stop being
unique.  Git uses this many extra hexdigits that are more than necessary
to make the object name currently unique, in the hope that its output will
stay unique a bit longer.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Oct 29, 2010
1 parent 7ebee44 commit 72a5b56
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 1 deletion.
9 changes: 9 additions & 0 deletions Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,15 @@ core.warnAmbiguousRefs::
If true, git will warn you if the ref name you passed it is ambiguous
and might match multiple refs in the .git/refs/ tree. True by default.

core.abbrevguard::
Even though git makes sure that it uses enough hexdigits to show
an abbreviated object name unambiguously, as more objects are
added to the repository over time, a short name that used to be
unique will stop being unique. Git uses this many extra hexdigits
that are more than necessary to make the object name currently
unique, in the hope that its output will stay unique a bit longer.
Defaults to 0.

core.compression::
An integer -1..9, indicating a default compression level.
-1 is the zlib default. 0 means no compression,
Expand Down
1 change: 1 addition & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,7 @@ extern int assume_unchanged;
extern int prefer_symlink_refs;
extern int log_all_ref_updates;
extern int warn_ambiguous_refs;
extern int unique_abbrev_extra_length;
extern int shared_repository;
extern const char *apply_default_whitespace;
extern const char *apply_default_ignorewhitespace;
Expand Down
7 changes: 7 additions & 0 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,13 @@ static int git_default_core_config(const char *var, const char *value)
return 0;
}

if (!strcmp(var, "core.abbrevguard")) {
unique_abbrev_extra_length = git_config_int(var, value);
if (unique_abbrev_extra_length < 0)
unique_abbrev_extra_length = 0;
return 0;
}

if (!strcmp(var, "core.bare")) {
is_bare_repository_cfg = git_config_bool(var, value);
return 0;
Expand Down
1 change: 1 addition & 0 deletions environment.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ int prefer_symlink_refs;
int is_bare_repository_cfg = -1; /* unspecified */
int log_all_ref_updates = -1; /* unspecified */
int warn_ambiguous_refs = 1;
int unique_abbrev_extra_length;
int repository_format_version;
const char *git_commit_encoding;
const char *git_log_output_encoding;
Expand Down
4 changes: 3 additions & 1 deletion sha1_name.c
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,9 @@ const char *find_unique_abbrev(const unsigned char *sha1, int len)
if (exists
? !status
: status == SHORT_NAME_NOT_FOUND) {
hex[len] = 0;
int cut_at = len + unique_abbrev_extra_length;
cut_at = (cut_at < 40) ? cut_at : 40;
hex[cut_at] = 0;
return hex;
}
len++;
Expand Down

0 comments on commit 72a5b56

Please sign in to comment.