Если вы собираетесь построить, скажем, структуру каталогов, в которой каталог называется коммитом в репозитории Git, и вы хотите, чтобы он был достаточно коротким, чтобы ваши глаза не кровоточили, но достаточно длинным, чтобы вероятность его столкновения было бы незначительным, сколько подстроки SHA обычно требуется?
Допустим, я хочу уникально идентифицировать это изменение: https://github.com/wycats/handlebars.js/commit/e62999f9ece7d9218b9768a908f8df9c11d7e920
Я могу использовать только первые четыре символа: https://github.com/wycats/handlebars.js/commit/e629
Но я чувствую, что это было бы рискованно. Но если исходить из кодовой базы, которая за пару лет может иметь, скажем, 30 тыс. Изменений, каковы шансы столкновения, если я использую 8 символов? 12? Есть ли номер, который обычно считается приемлемым для такого рода вещей?
Ответы:
На этот вопрос фактически дан ответ в главе 7 книги Pro Git :
7 цифр - это Git по умолчанию для короткого SHA, так что это подходит для большинства проектов. Как уже упоминалось, команда Kernel увеличила свою команду в несколько раз, потому что имеет несколько сотен тысяч коммитов. Так что для ваших ~ 30k коммитов 8 или 10 цифр должно быть идеально.
источник
git
это довольно умно, когда дело доходит до этого. Вы можете установить короткое сокращение, скажем, 4, иgit
использовать 4 цифры для максимально возможного числа хэшей, но переключайтесь на 5 или более, когдаПримечание: вы можете запросить
git rev-parse --short
самый короткий и в то же время уникальный SHA1.Смотрите " git получи короткий хеш из обычного хэша "
Для больших репозиториев 7 недостаточно с 2010 года, а коммит dce9648 сам Линус Торвальдс (git 1.7.4.4, октябрь 2010):
(BK = BitKeeper)
environment.c
:Примечание: Как прокомментировал ниже по marco.m ,
core.abbrevLength
был переименован вcore.abbrev
в том же Git 1.7.4.4 в фиксации a71f09fСовсем недавно, Линус добавил совершить e6c587c (для Git 2.11, Q4 2016):
(как указано в Матьё Moy «s ответ )
Смотрите коммит e6c587c (01.10.2016) Линуса Торвальдса (
torvalds
) .Смотрите коммит 7b5b772 , коммит 65acfea (01 октября 2016 г.) от Junio C Hamano (
gitster
) .(Слиты Junio C Hamano -
gitster
- в фиксации bb188d0 , 3 октября 2016)Это новое свойство (предполагающее разумное значение по умолчанию для значения аббревиатуры SHA1) напрямую влияет на то, как Git вычисляет свой собственный номер версии для выпуска .
источник
core.abbrevLength
был переименован вcore.abbrev
.core.abbrev
.git rev-parse --short=10 --verify HEAD
чтобы генерировать 10 символов. Мы использовалиgit log -1 --format=%h
, но это только сгенерировало 7 символов, и мы получили столкновение.Это известно как проблема дня рождения.
Для вероятностей меньше 1/2 вероятность столкновения может быть аппроксимирована как
p ~ = (n 2 ) / (2 м)
Где n - количество предметов, а m - количество возможностей для каждого предмета.
Количество возможностей для шестнадцатеричной строки равно 16 c, где c - количество символов.
Так что для 8 символов и 30K коммитов
30K ~ = 2 15
р ~ = (п 2 ) / (2m) ~ = ((2 15 ) 2 ) / (2 * 16 8 ) = 2 30 /2 33 = ⅛
Увеличение до 12 символов
р ~ = (п 2 ) / (2m) ~ = ((2 15 ) 2 ) / (2 * 16 12 ) = 2 30 /2 49 = 2 -19
источник
На этот вопрос ответили, но для тех, кто ищет математику позади - это называется проблема дня рождения ( Википедия ).
Речь идет о вероятности того, что 2 (или более) человека из группы из N человек будут иметь день рождения в один и тот же день в году. Что аналогично вероятности 2 (или более) git коммитов из репозитория с N коммитами в общей сложности с одинаковым хеш-префиксом длины X.
Посмотрите на таблицу вероятностей . Например, для шестнадцатеричной строки хеша длиной 8 вероятность столкновения достигает 1%, когда в хранилище всего около 9300 элементов (git commit). Для 110 000 коммитов вероятность составляет 75%. Но если у вас есть хеш-строка длиной 12, вероятность столкновения в 100 000 коммитов будет ниже 0,1%.
источник
Git версии 2.11 (или, возможно, 2.12?) Будет содержать функцию, которая адаптирует количество символов, используемых в коротких идентификаторах (например
git log --oneline
), к размеру проекта. После того, как вы используете такую версию Git, ответом на ваш вопрос может быть «выбрать любую длину, которую Git дает вамgit log --oneline
, это достаточно безопасно».Для получения дополнительной информации см. Изменение по умолчанию для «core.abbrev»? обсудите в Git Rev News издание 20 и передайте bb188d00f7 .
источник