В моем репо, как долго должен быть самый длинный префикс хэша, чтобы предотвратить перекрытие?

Флаг --abbrev-commit может использоваться совместно с git log и git rev-list, чтобы показать частичные префиксы вместо полных 40-символьных SHA-1 хэшей объектов фиксации. Согласно Pro Git book,

он по умолчанию использует семь символов, но делает их дольше, если необходимо, чтобы сохранить SHA-1 однозначным [...]

Кроме того, короткие SHA имеют длину не менее 4 символов. Тем не менее, согласно книге Pro Git,

Как правило, от восьми до десяти символов более чем достаточно, чтобы быть уникальным в рамках проекта.

В качестве примера ядро ​​Linux, представляющее собой довольно большой проект с более чем 450 тыс. транзакциями и 3,6 миллиона объектов, не имеет двух объектов, SHA-1 которых перекрываются больше, чем первые 11 символов.

Поскольку длина самого длинного префикса, необходимого для предотвращения любого перекрытия между всеми префиксными хешами объектов фиксации (11, в случае ядра Linux), является грубым индикатором размера репо, я хотел бы программно определить соответствующее количество в моем собственном локальном репозитории. Как я могу это сделать?

Ответ 1

Следующая оболочка script, при запуске в локальном репо, печатает длину самого длинного префикса, необходимого для предотвращения любого совпадения между всеми префиксными хешами объектов фиксации этого репозитория.

MAX_LENGTH=4;

git rev-list --abbrev=4 --abbrev-commit --all | \
  ( while read -r line; do
      if [ ${#line} -gt $MAX_LENGTH ]; then
        MAX_LENGTH=${#line};
      fi
    done && printf %s\\n "$MAX_LENGTH"
  )

В последний раз, когда я отредактировал этот ответ, script напечатал

Ответ 2

Jubob script отлично, поддерживается.

Если вы хотите получить представление о распределении минимальной фиксации-хэш-длины, вы можете запустить этот однострочный файл:

git rev-list --abbrev=4 --abbrev-commit --all | ( while read -r line; do echo ${#line}; done; ) | sort -n | uniq -c

Для git project сегодня (git -on- git), это дает что-то вроде:

 1788 4
35086 5
 7881 6
  533 7
   39 8
    4 9

... дает 1788, который может быть представлен однозначно с хешем 4 - char (или ниже, это Git минимальное сокращение) и 4, для чего требуется 9 -of-40 символов хэша для однозначного выбора.

Для сравнения, гораздо более крупный проект, такой как ядро ​​Linux, имеет это распределение сегодня:

6179   5
446463 6
139247 7
10018  8
655    9
41    10
3     11

Таким образом, с базой данных из почти 5 миллионов объектов и фиксацией 600 тыс., в настоящее время 3 коммита требуют 11 из 40 шестнадцатеричных цифр, чтобы отличить их от всех других коммитов.