Почему «git ls-files» не отображается на вкладке «Завершение»? - PullRequest
9 голосов
/ 27 марта 2012

Недавно я нашел команду

git ls-files

и считаю ее очень полезной (см. Параметр -h).Почему он не появляется, если я набираю git, а затем нажимаю Tab?

Я имею в виду - где находится список «других» команд git?

Ответы [ 4 ]

6 голосов
/ 18 июля 2012

Посмотрите на свои ~/.git-completion.sh и функцию __git_list_porcelain_commands(). Здесь перечислены команды, которые поддерживает git, но не завершает табуляции. Большинство из этих команд являются так называемыми командами «слесарного дела», включая ls-files. Вы можете легко завершить их, прокомментировав соответствующую строку. Как это:

#ls-files)         : plumbing;;
#ls-remote)        : plumbing;;
#ls-tree)          : plumbing;;
4 голосов
/ 27 марта 2012

git ls-files - это сантехническая команда, и многие из этих команд являются «скрытыми» и вполне справедливо. Со временем многие были добавлены в завершение bash, но многие все еще "скрыты"

0 голосов
/ 04 июня 2018

С Git 2.18 (Q2 2018) завершение командной строки (в contrib/) научилось лучше заполнять пути для различных команд.
И это включает в себя git ls-files!

См. commit 7d31407 , commit 8b4c2e0 (18 мая 2018 г.) и commit 7b00342 , commit 193757f , commit c1bc0a0 , коммит 9703797 , коммит 105c0ef , коммит a364e98 , коммит f12785a , коммит 3dfe23b , коммит 6bf0ced , коммит 722e31c , коммит 5bb534a (16 апреля 2018) СЕДЕР Габор (szeder) .
(Объединено с Junio ​​C Hamano - gitster - в коммит 4ce7218 , 30 мая 2018 г.)

завершение: улучшена обработка указанных путей в выводе 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
0 голосов
/ 27 марта 2012

При установке по умолчанию, завершение табуляции перечисляет только имена команд, которые отображаются в /bin, /usr/bin и т. Д. Нет файла /usr/bin/git ls-files.

ls-files является подкомандойчто вам придется учить свою оболочку.Предполагая, что вы используете bash, вы можете запустить help complete, чтобы увидеть, какие команды вы можете поместить в ваш .bashrc.

Если ваш дистрибутив содержит пакет завершения bash, вы можете установить его, чтобы сэкономить многоtime:

apt-get install bash-completion  # on Debian/Ubuntu/etc.
yum install bash-completion      # on Fedora/Red Hat/etc.

Но, как указывает manojlds, это не сработает для менее часто используемых команд git, таких как ls-files, потому что bash-creation скрывает их от вас.Вам нужно отредактировать /etc/bash_completion.d/git, чтобы изменить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...