Как упомянуто в « git: Как я могу рекурсивно добавить все файлы в поддереве каталога, которые соответствуют шаблону glob? », Если вы правильно экранируете или цитируете свой globbing pathspec (например,'*.java'
), тогда да, git add'*.java'
Git 2.13 (второй квартал 2017 года) улучшает это для интерактивного добавления
Смотрите коммит 7288e12 (14 марта 2017 г.) Джеффа Кинга ( peff
) .
(Слиты Junio C Hamano - gitster
- в фиксации 153e0d7 , 17 марта 2017)
add --interactive
: не расширяйте pathspecs с помощью ls-files
Когда мы хотим получить список измененных файлов, мы сначала расширяем любые предоставленные пользователем пути с помощью « ls-files
», а затем передаем полученный список путей в качестве аргументов « diff-index
» и « diff-files
».
Если ваша спецификация пути распространяется на большое количество путей, вы можете столкнуться с одной из двух проблем:
ОС может пожаловаться на размер списка аргументов и отказать в запуске. Например:
$ (ulimit -s 128 && git add -p drivers)
Can't exec "git": Argument list too long at .../git-add--interactive line 177.
Died at .../git-add--interactive line 177.
Это находится в linux.git
хранилище, в котором находится около 20 КБ файлов в каталоге «drivers» (в этом случае ни один из них не был изменен). ulimit -s
Трюк " " необходим, чтобы показать проблему в Linux даже для такого гигантского набора путей.
Другие операционные системы имеют гораздо меньшие ограничения (например, в реальных случаях было замечено только 5K файлов на OS X).
Даже когда это работает, это действительно медленно. Код pathspec не оптимизирован для огромного количества путей. Вот тот же случай без предела:
$ time git add -p drivers
No changes.
real 0m16.559s
user 0m53.140s
sys 0m0.220s
Мы можем улучшить это, полностью пропустив " ls-files
", и просто введя исходные спецификации путей в команды diff.
Исторически язык pathspec, поддерживаемый " diff-index
", был слабее, но это уже не так.