diff options
| -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++; | 
