завершение: улучшена обработка указанных путей в выводе git ls-files
Если какой-либо путь содержит обратную косую черту, двойную кавычку, символ табуляции, новую строку или любой другой
управляющие символы, 'git ls-files
' и 'git diff-index
' будут заключены
этот путь в двойных кавычках и экранировать эти специальные символы
использование односимвольных escape-последовательностей в стиле C или восьмеричных значений \nnn
.
Это предотвращает перечисление этих файлов во время пути git -ware
завершение, потому что из-за цитирования они никогда не будут соответствовать
текущее слово должно быть завершено.
завершение: удалить повтор dirnames
с 'awk
' во время завершения пути
Во время завершения пути с учетом git, после всего конечного пути
компоненты были удалены из вывода «git ls-files» и
'git diff-index', каждое имя каталога повторяется
столько раз, сколько в нем содержится перечисленных путей.
Это может быть много повторений, особенно при закрытии пути завершения
в корне большого рабочего дерева.
Список всех отслеживаемых файлов (12) и каталогов (23) в верхней части
worktree в linux.git (более 62 тыс. файлов), т. е. что делает все трудное
Работа с «git ls-files»:
До этого патча, лучший из пяти, с использованием GNU awk в Linux:
real 0m0.069s
user 0m0.089s
sys 0m0.026s
После того, как:
real 0m0.052s
user 0m0.072s
sys 0m0.014s
Difference: -24.6%
завершение: пусть 'ls-files
' и 'diff-index
' фильтруют совпадающие пути
Во время завершения пути с помощью git, например 'git rm dir/fil<TAB>
', оба
'git ls-files
' и 'git diff-index
' перечисляют все пути в данном 'dir/
'
соответствие определенным критериям (кешируется, модифицируется, не отслеживается и т. д.)
подходит для данной команды git, даже пути, чьи имена не
начать с 'fil'.
Это приводит к значительному снижению производительности, когда рассматриваемый каталог содержит много путей, но текущее слово может быть уникально заполнено или когда только несколько из этих путей соответствуют текущему слову.
Уменьшите количество итераций в этом кодовом пути из числа
пути к числу совпадающих путей, указав соответствующий
шаблон "git ls-files
" и "git diff-index
" в списке только
пути, которые соответствуют текущему слову, которое будет завершено.
Это значительно ускоряет завершение пути, когда есть много
несоответствующие пути должны быть отфильтрованы.
Уникальное завершение отслеживаемого имени файла в верхней части рабочего дерева в linux.git (более 62 тыс. Файлов), т. Е. Что делает всю тяжелую работу за «git ls-files Mak» для завершения «Makefile»:
До этого патча, лучший из пяти, в Linux:
$ time cur=Mak __git_complete_index_file
real 0m2.159s
user 0m1.299s
sys 0m1.089s
После того, как:
real 0m0.033s
user 0m0.023s
sys 0m0.015s
Difference: -98.5%
Speedup: 65.4x
завершение: заполните COMPREPLY
непосредственно при заполнении путей
Это ускоряет завершение пути, когда есть много подходящих путей
текущее слово должно быть завершено.
В патологическом репозитории с 100k файлами в одном каталоге, перечисляя все эти файлы:
До этого патча, лучший из пяти, с использованием GNU awk в Linux:
$ time cur=dir/ __git_complete_index_file
real 0m0.983s
user 0m1.004s
sys 0m0.033s
После того, как:
real 0m0.313s
user 0m0.341s
sys 0m0.029s
Difference: -68.2%
Speedup: 3.1x