git add -A:/ на Git 2.X и взаимосвязь с pathspec

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

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

2 ответа

Решение

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

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

:top: or :/

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


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

С Git 2.0 "add -u" а также "add -A"запуск из подкаталога без указания пути означает" все в рабочем дереве "(до версии 2.0 они были ограничены текущим каталогом).
Ограничение текущего каталога было реализовано путем вставки "."в командной строке, когда конечный пользователь не дал нам никакой спецификации пути.
На 2.0 мы обновили код для вставки ":/" (вместо '.') рассмотреть все с верхнего уровня, используя магию pathspec "top".

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

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

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

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

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 тоже не будет. Но в старших мерзавцах, git add -A :/ сделает свое дело.

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

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

Другие вопросы по тегам