diff options
author | Junio C Hamano <gitster@pobox.com> | 2010-12-04 01:10:35 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-12-04 01:10:35 +0100 |
commit | 63ae595c6d60ac238e8a785bd811db41de74e93d (patch) | |
tree | 06a8969c011b95bea88ee34ccae75b1c5ff6dda0 | |
parent | Merge branch 'jj/icase-directory' (diff) | |
parent | core.abbrevguard: Ensure short object names stay unique a bit longer (diff) | |
download | git-63ae595c6d60ac238e8a785bd811db41de74e93d.tar.xz git-63ae595c6d60ac238e8a785bd811db41de74e93d.zip |
Merge branch 'jc/abbrev-guard'
* jc/abbrev-guard:
core.abbrevguard: Ensure short object names stay unique a bit longer
-rw-r--r-- | Documentation/config.txt | 9 | ||||
-rw-r--r-- | cache.h | 1 | ||||
-rw-r--r-- | config.c | 7 | ||||
-rw-r--r-- | environment.c | 1 | ||||
-rw-r--r-- | sha1_name.c | 4 |
5 files changed, 21 insertions, 1 deletions
diff --git a/Documentation/config.txt b/Documentation/config.txt index 6b7279f883..ad5eb5f21d 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -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, @@ -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; @@ -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; diff --git a/environment.c b/environment.c index de5581fe51..92e16b19b2 100644 --- a/environment.c +++ b/environment.c @@ -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; diff --git a/sha1_name.c b/sha1_name.c index 3e856b8036..b48b91c507 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -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++; |