Ефективність 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()коли це не потрібно.