Подтвердить что ты не робот

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 и т.д.).

Спасибо за помощь!

4b9b3361

Ответ 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\*