Примітка. Ви можете попросити git rev-parse --short
найкоротший і в той же час унікальний SHA1.
Див. " Git отримати короткий хеш із звичайного хешу "
git rev-parse --short=4 921103db8259eb9de72f42db8b939895f5651489
92110
Як ви бачите в моєму прикладі, SHA1 має довжину 5, навіть якщо я вказав довжину 4.
Для великих репостів 7 недостатньо з 2010 року, і виконувати dce9648 самим Лінусом Торвальдсом (git 1.7.4.4, жовтень 2010):
За замовчуванням 7 приходить досить рано в розробці git, коли семи шістнадцяткових цифр було багато (він охоплює близько 250+ мільйонів хеш-значень).
Тоді я подумав, що 65k редакцій було багато (це те, що ми збиралися потрапити в BK), і кожна редакція, як правило, становить близько 5-10 нових об'єктів або близько того, тому мільйон об'єктів було великою кількістю.
(BK = BitKeeper)
У наші дні ядро не є навіть найбільшим проектом git, і навіть ядро має близько 220k ревізій ( набагато більше, ніж дерево BK коли-небудь було), і ми наближаємось до двох мільйонів об'єктів.
На даний момент сім шестигранних цифр все ще є унікальними для багатьох з них, але коли ми говоримо лише про два порядки різниці величин між кількістю об'єктів та розміром хешу, відбудуться зіткнення в усічених хеш-значень.
Це вже навіть не близьке до нереального - це відбувається постійно.
Ми повинні збільшити скорочення за замовчуванням, яке було нереально мало, і додати спосіб, щоб люди могли встановити свій власний проект за замовчуванням у файлі git config .
core.abbrev
Встановити імена об’єктів довжини скорочено до.
Якщо не вказано, багато команд скорочують до 7 шестизнак, що може бути недостатньо, щоб скорочені імена об’єктів залишалися унікальними протягом досить тривалого часу.
environment.c
:
int minimum_abbrev = 4, default_abbrev = 7;
Примітка. Як зазначається нижче в marco.m , він core.abbrevLength
був перейменований core.abbrev
в той самий Git 1.7.4.4 в команді a71f09f
Перейменувати core.abbrevlength
назад наcore.abbrev
--abbrev=$n
Зрештою, це відповідає параметру командного рядка.
Зовсім недавно, Лінус додав зробити e6c587c (для Git 2.11, Q4 2016):
(як зазначено в Матьє Moy «s відповідь )
У досить ранні дні ми якось вирішили скоротити імена об’єктів до 7-шестнадцяткових цифр, але в міру зростання проектів стає все більш імовірним бачити такі короткі назви об'єктів, зроблені в попередні дні і записані в журналі повідомлень, вже не унікальними.
Наразі проект ядра Linux потребує від 11 до 12 гексадигітів, тоді як самому Git потрібно 10 гексадигітів, щоб однозначно ідентифікувати об'єкти, які вони мають, в той час як для багатьох більш дрібних проектів все ще може бути добре з початковим 7-шестнадцатеричним дефіцитом. Однорозмірний підходить не для всіх проектів.
Введіть механізм, де ми оцінюємо кількість об'єктів у сховищі за першим запитом скоротити ім'я об'єкта за замовчуванням та придумати для репозиторію здоровий за замовчуванням. Виходячи з очікування, що ми побачимо зіткнення у сховищі з 2^(2N)
об'єктами при використанні імен об'єктів, скорочених до перших N бітів, використовуйте достатню кількість шестизнак, щоб покрити кількість об’єктів у сховищі.
Кожен гексдигіт (4-бітний), який ми додаємо до скороченого імені, дозволяє нам мати чотири рази (2 біти) стільки об'єктів у сховищі.
Див. Комісію e6c587c (01 жовтня 2016 р.) Від Лінуса Торвальда ( torvalds
) .
Див. Команду 7b5b772 , вчинення 65acfea (01 жовтня 2016 р.) Хуніо С Хамано ( gitster
) .
(Об’єднав Хуніо С Хамано - gitster
- в комітеті bb188d0 , 03 жовтня 2016 р.)
Це нове властивість (вгадуючи обґрунтовану за замовчуванням значення абревіатури SHA1) має прямий вплив на те, як Git обчислює власний номер версії для випуску .