Ефективність git-статусу повинна покращитися завдяки Git 2.13 (Q2 2017).
Див. Коміт 950a234 (14 квітня 2017 р.) Джеффа Хостелера ( jeffhostetler
) .
(Об’єднано Junio C Hamano - gitster
- у комітеті 8b6bba6 , 24 квітня 2017)
> string-list
: використовувати ALLOC_GROW
макрос при перерозподіліstring_list
Використовуйте ALLOC_GROW()
макрос при перерозподілі string_list
масиву, а не просто збільшуючи його на 32.
Це оптимізація продуктивності.
Під час статусу на дуже великому репо та багато змін, значний відсоток від загального часу запуску витрачається на перерозподіл wt_status.changes
масиву .
Ця зміна зменшує час wt_status_collect_changes_worktree()
із 125 до 45 секунд у моєму дуже великому сховищі.
Крім того, Git 2.17 (Q2 2018) запровадить новий слід для вимірювання того, де витрачається час на важкі операції.
Див. Коміт ca54d9b (27 січня 2018 р.) Нгуен pclouds
Тхая Нгюка Дуя ( ) .
(Об’єднано Junio C Hamano - gitster
- у комітеті 090dbea , 15 лютого 2018)
trace
: вимірювання, де витрачається час на важкі операції
Всі відомі блоки важкого коду вимірюються (крім доступу до бази даних об’єкта). Це має допомогти визначити, чи є оптимізація ефективною чи ні.
Неоптимізований git-статус дасть щось подібне нижче:
0.001791141 s: read cache ...
0.004011363 s: preload index
0.000516161 s: refresh index
0.003139257 s: git command: ... 'status' '--porcelain=2'
0.006788129 s: diff-files
0.002090267 s: diff-index
0.001885735 s: initialize name hash
0.032013138 s: read directory
0.051781209 s: git command: './git' 'status'
Той самий Git 2.17 (Q2 2018) покращується git status
завдяки:
revision.c
: зменшити кількість запитів до бази даних об’єктів
В mark_parents_uninteresting()
, ми перевірити наявність об'єктного файлу , щоб побачити , якщо ми повинні ставитися до фіксації , як розібраний. Результат - встановити біт "синтаксичний аналіз" для коміту.
Змініть умову, щоб перевірити лише, has_object_file()
чи змінить результат проаналізований біт.
Коли локальна гілка відрізняється від попереднього посилання, " git status
" буде обчислювати рахунки вперед / позаду.
Це використовує paint_down_to_common()
і потрапляє mark_parents_uninteresting()
.
На копії репозиторію Linux з локальним екземпляром "master", що стоїть за віддаленою гілкою " origin/master
" на ~ 60000 комітів, ми виявляємо, що ефективність " git status
" зросла з 1,42 секунди до 1,32 секунди, для відносної різниці -7,0%.
Git 2.24 (Q3 2019) пропонує ще один параметр для підвищення git status
продуктивності:
Див. Коміт aaf633c , коміт c6cc4c5 , коміт ad0fb65 , коміт 31b1de6 , коміт b068d9a , коміт 7211b9e (13 серпня 2019 р.) Деррік Столі ( derrickstolee
) .
(Об’єднано Junio C Hamano - gitster
- у комітеті f4f8dfe , 09 вересня 2019 р.)
repo-settings: створити feature.manyFiles налаштування
feature.manyFiles
Установка підходить для угод РЕПО з великою кількістю файлів в робочому каталозі.
Встановивши index.version=4
та core.untrackedCache=true
, такі команди, як ' git status
', повинні покращитися.
Але:
З Git 2.24 (Q4 2019), шлях до коду, який читає index.version
конфігурацію, був порушений під час нещодавнього оновлення, яке було виправлено.
Див. Коміт c11e996 (23 жовтня 2019 р.) Дерріка Столі ( derrickstolee
) .
(Об’єднано Junio C Hamano - gitster
- у комітеті 4d6fb2b , 24 жовтня 2019)
repo-settings
: прочитати int для index.version
Підписав: Деррік Столі
Кілька параметрів конфігурації були об'єднані в repo_settings
структуру в ds / feature-macros, включаючи переміщення налаштування конфігурації "index.version" у 7211b9e (" repo-settings
: консолідація деяких налаштувань конфігурації", 2019-08-13, Git v2.24.0-rc1 - злиття, зазначене в партії №0 ).
На жаль, цей файл виглядав багато як шаблон, і що, безумовно, є фактором перевантаження copy-paste, налаштування конфігурації аналізується repo_config_ge_bool()
замістьrepo_config_get_int()
. Це означає, що параметр "index.version = 4" не буде реєструватися належним чином і повернеться до версії 3 за замовчуванням.
Я зрозумів це, включивши v2.24.0-rc0 до кодової бази VFS для Git, де нам дуже важливо, щоб індекс був у версії 4.
Це не було виявлено кодовою базою, оскільки перевірки версій, розміщені в t1600-index.sh
, недостатньо перевіряли "базовий" сценарій. Тут ми модифікуємо тест, щоб включити ці звичайні налаштування, щоб не замінити їх на features.manyFiles
або GIT_INDEX_VERSION
.
Хоча "типовою" версією є 3, вона знижується до версії 2, do_write_index()
коли це не потрібно.