Git add -A:/on git 2.X и связь с pathspec

Я прочитал в несколько мест, что поведение git add -A немного изменилось со временем.

Как и 2.x(например, Git 2.5.0), что делает git add -A :/ точно? Я не смог найти вариант : или :/ в документации. Это pathspec? Как так? В примерах документация содержит только шаблоны glob (например, *.c) или простые спецификации пути (например, dir, чтобы добавить что-либо в dir).

Ответ 1

Так как git 2.0, git add -A и git add -A :/ совпадают.
Но волшебный путь :/ не является новым и восходит к git 1.7.6 (апрель 2011). См. commit 8a42c98. Это описано в Documentation/glossary-content.txt

Спецификация пути, начинающаяся с двоеточия :, имеет особое значение.
В короткой форме за ведущим двоеточием : следует ноль или более "магия" подписи "(который необязательно завершается другим двоеточием :), а остаток - это шаблон, который будет соответствовать пути.

:top: or :/

Волшебное слово top (магическая подпись: /) делает шаблон совпадающим с корнем рабочего дерева, даже когда вы запускаете команду изнутри подкаталога.


Обратите внимание, что если вы хотите добавить папку с именем ":/" (git add -A :/), это будет возможно только в git 2.7 (Nov 2015)
См. передать 29abb33 (25 октября 2015 г.) Junio ​​C Hamano (gitster).

Так как git 2.0, "add -u" и "add -A" запускаются из подкаталога без какого-либо знака пути, означающего "все в рабочем дереве" (до 2.0, они были ограничены текущим каталогом).
Ограничение для текущего каталога было реализовано путем вставки "." в командную строку, когда конечный пользователь не предоставил нам никакого пути.
В версии 2.0 мы обновили код, чтобы вставить ":/" (вместо "." ), чтобы рассмотреть все, начиная с верхнего уровня, с помощью волшебства пути "top".

(Это больше не требуется и исправлено в объявлении commit 29abb33: реализация git add -A больше не использует :/ для предстоящего git 2.7)

Кстати, такое упрощение также устраняет ошибку в угловом регистре, которая проистекает из того факта, что ":/" не обязательно означает любую магию.
Пользователь сказал бы "git --literal-pathspecs add -u :/" из командной строки, когда у нее есть каталог ":" и хочет добавить все в нее (и она знает, что ее :/ будет восприниматься как "все под солнцем" магии pathspec, если она отключает магию с помощью --literal-pathspecs).

Внутреннее использование ':/' будет вести себя так же, как при явном указании ":/" при запуске с "-literal-pathspecs" и не будет добавлять все под солнцем, поскольку исходный код.

Так как это внутреннее использование :/ больше не будет, то git --literal-pathspecs add -u :/ действительно будет работать и добавить файлы под папкой с именем "column" ( ":" ).

Ответ 2

git add -A :/ добавит все изменения в индекс, даже если вы не находитесь в папке проекта верхнего уровня. Но в более поздних версиях git он совпадает с git add -A

Скажите, что у вас есть свой проект:

➜  top git:(master) tree .
.
├── b.c
└── subfolder
    └── a.c

Затем вы изменили код в b.c, но в настоящее время находитесь в subfolder

➜  subfolder git:(master) ✗ git st
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   ../b.c

no changes added to commit (use "git add" and/or "git commit -a")

Запуск git add . теперь будет НЕ добавить b.c в ваш индекс, а старый git add -A будет NOT. Но в более старых git, git add -A :/ сделает трюк.

Если для параметра -A не задан pathspec, все файлы в            обновляется полное рабочее дерево (старые версии git используются для ограничения            обновление текущего каталога и его подкаталогов).

За дополнительной информацией, пожалуйста, прочитайте git help add git help gitglossary