Git добавить * (звездочка) vs git добавить. (Период)
Я новичок в git, и у меня вопрос о добавлении файлов в git. Я обнаружил несколько вопросов о stackoverflow о разнице между git add .
и git add -a
, git add --all
, git add -a
и т.д. Но мне не удалось найти место, объясняющее, что делает git add *
. Я даже посмотрел на git добавить man-страницу, но это не помогло. Я использовал его вместо git add .
, и мой коллега спросил меня, почему. У меня не было ответа. Я всегда использовал git add *
.
Являются ли git add .
и git add *
одинаковыми? Добавляет ли измененные файлы только из текущего каталога, а другой добавляет файлы из текущего каталога и подкаталогов (рекурсивно)?
Там есть большая диаграмма, указанная в одном из других вопросов стека, которая показывает разницу между git add -a
git add .
и git add -u
, но у нее нет git add *
.
![enter image description here]()
Примечание. Я понимаю, что означает использовать звездочку в качестве подстановочного знака (добавить все файлы с заданным расширением). Например, git add *.html
будет добавлять все файлы с расширением .html
(но игнорировать .css
, .js
и т.д.).
Спасибо за помощь!
Ответы
Ответ 1
add *
означает добавление всех файлов в текущем каталоге, кроме файлов, имена которых начинаются с точки. Это функциональность вашей оболочки, и Git только когда-либо получает список файлов.
add.
не имеет особого значения в вашей оболочке, и поэтому Git рекурсивно добавляет весь каталог, который почти одинаков, но включает файлы, имена которых начинаются с точки.
Ответ 2
*
не является частью git - это подстановочный знак, интерпретируемый оболочкой. *
расширяется до всех файлов в текущем каталоге и только затем передается в git, который add
их всех.
.
- это текущий каталог, а git add
ing он добавит его и все файлы под ним.
Ответ 3
Использование точки .
в оболочке обычно означает "текущий каталог".
При использовании звездочки *
в оболочке используется функция с именем file-globbing
. Например. на bash функция glob()
делает именно это. В manpage для glob (man 7 glob
) указано:
ОПИСАНИЕ
Long ago, in UNIX V6, there was a program /etc/glob that would expand
wildcard patterns. Soon afterward this became a shell built-in.
These days there is also a library routine glob(3) that will perform this
function for a user program.
Подстановочный знак
A string is a wildcard pattern if it contains one of the characters '?', '*' or '['.
Глобулинг
Globbing is the operation that expands a wildcard pattern
into the list of pathnames matching the pattern.
Это означает, что когда вы передаете аргументы любой программе в командной строке, содержащей '?'
, '*'
или '['
, первое globbing расширяет шаблон шаблона в список файлов, а затем дает эти файлы в качестве аргумента для самой программы.
Разница в значении между 'git add .'
и 'git add *'
четко описана Denis:
git add
ожидает список файлов, которые нужно добавить. В приведенном выше примере оболочка расширяет *
или .
соответственно и дает результат в качестве параметра git add. Теперь разница в том, что с git add .
git будет расширяться до текущей директории, тогда как git add *
запускает файловое globbing и такие расширения для всех файлов и каталогов, которые не начинаются с точки.
Ответ 4
Для наглядности я положил ответ в таблице ниже:
![enter image description here]()
Дополнительные примечания (вдохновленные комментарием @reka18):
Примечание 1. git add -A
и git add -u
выполняемые без дополнительных параметров, будут дополнительным уточнением (указание подкаталога или маски для имени файла) в диапазоне всего рабочего каталога (также если мы выполним команду в рабочий подкаталог каталога).
Примечание 2. .
и *
- соответственно путь к каталогу (текущий каталог) и подстановочный знак, которые уточняют путь к команде. Например, если git add.
или команда git add *
выполняется в некотором подкаталоге рабочего каталога, тогда их действие используется только в этом подкаталоге, а не во всем рабочем каталоге.
Примечание 3. git add -A
и git add -u
могут быть уточнены путем добавления пути или маски для файлов, например, git add -A app/controllers
или git add -u app\styles\*