git add * (звездочка) vs git add. (Период)

132

Я новичок в git, и у меня есть вопрос о добавлении файлов в git. Я нашел несколько вопросов StackOverflow о разнице между git add .и git add -a, git add --all, git add -Aи т.д. Но я не смог найти место , которое объясняет , что git add *делает. Я даже посмотрел справочную страницу git add , но это не помогло. Я использовал его вместо, git add .и мой коллега спросил меня, почему. У меня не было ответа. Я просто всегда использовал git add *.

Есть git add .и git add *то же? Добавляет ли один измененные файлы только из текущего каталога, а другой добавляет файлы из текущего каталога и подкаталогов (рекурсивно)?

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

введите описание изображения здесь

Примечание. Я понимаю, что значит использовать звездочку в качестве подстановочного знака (добавлять все файлы с заданным расширением). Например, git add *.htmlможно добавить все файлы с .htmlрасширением (но игнорировать .css, .jsи т. Д.).

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

Тайлер Янгблад
источник
1
Откуда этот график? Я просто попытался git add .снова, и он без проблем создал удаленный файл, в отличие от того X, что предлагалось в этой строке.
Дэвид
@David Это изображение взято из этого ответа и относится к более старым версиям git.
Джерри
4
Картинка устарела! Git 2.x отличается: i.stack.imgur.com/KwOLu.jpg
Ханнес Шнайдермайер

Ответы:

134

add *означает добавить все файлы в текущий каталог, кроме файлов, имена которых начинаются с точки. Это функция вашей оболочки, и Git всегда получает только список файлов.

add . не имеет особого значения в вашей оболочке, поэтому Git рекурсивно добавляет весь каталог, что почти то же самое, но включает файлы, имена которых начинаются с точки.

Денис
источник
6
поэтому git add .добавляет все файлы, папки и подпапки, включая .gitignore и все остальное, начинающееся с точки, в то время как git add *добавлял бы любые файлы, папки и подпапки, кроме тех, которые начинаются с точки? Это точно?
Тайлер Янгблад
10
Это действительно так. Кроме того, git add *все равно будут добавляться файлы, начинающиеся с точки, если они находятся в подкаталоге.
Денис
4
git add .также уважает .gitignore, тогда как выдает git add *ошибку, если какие-либо файлы, отличные от точек, gitignored. Намного лучше использовать, git add .чем git add *.
rosuav
2
Стоит отметить: при вызове Git в DOS / Windows из CMD.EXE именно Git , а не оболочка расширяет *. В этом случае Git найдет точечные файлы.
torek
2
@ Thor84no: Git найдет точечные файлы даже в системе Linux, если вы процитируете, *чтобы защитить их от оболочки. Дело не в скрытом бите, просто правила компиляции Git отличаются.
Торек
30

*не является частью git - это подстановочный знак, интерпретируемый оболочкой. *расширяется до всех файлов в текущем каталоге и только после этого передается в git, который addих всех. .- это сам текущий каталог, и git addон добавит его и все файлы в нем.

Mureinik
источник
1
Так есть ли причины использовать звездочку? Есть ли преимущества в использовании его вместо точки? Или наоборот? Я уверен, что видел это в учебнике. В противном случае я бы и не подумал использовать его. Я не особо разбираюсь в командной строке (как вы, несомненно, догадались).
Тайлер Янгблад
5
*избегает скрытых файлов (т.е. файлов, имена которых начинаются с символа a .). В любом случае, если вы не добавляете определенные файлы, я бы просто использовал git add -u(или git add -Aесли вы создаете новые файлы).
Mureinik
3
Поскольку вы оба ответили на мой вопрос, мне было трудно решить, кому отдать должное. Я выбрал Дениса ниже, потому что у него меньше репутации, чем у вас. Поэтому я решил, что зеленый чек принесет ему больше пользы, чем вам. Надеюсь это имеет смысл? Но я очень ценю оба объяснения. Спасибо!
Тайлер Янгблад
7

Использование точки . в оболочке обычно означает «текущий каталог».

Когда вы используете звездочку *в оболочке, используется функция, называемая file-globbing. Например, в bash функция именно glob()это и делает. На странице руководства для 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.

Это означает, что когда вы передаете аргументы любой программе в командной строке, которая содержит '?', '*'или '[', сначала подстановка расширяет шаблон подстановки в список файлов, а затем передает эти файлы в качестве аргумента самой программе.

Разницу между 'git add .'и 'git add *'четко описывает Денис :

git addожидает добавления списка файлов. В приведенном выше примере оболочка расширяется *или, .соответственно, и выдает результат в качестве параметра для git add. Теперь разница в том, что с git add .git будет расширяться до текущего каталога, тогда как git add *запускается подстановка файлов и т.д., расширяется до всех файлов и каталогов, которые не начинаются с точки.

codingdave
источник
5

Для наглядности я поместил ответ в таблицу ниже:

введите описание изображения здесь

Дополнительные примечания (по мотивам комментария @ 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\*.

simhumileco
источник
3
Так что же из Git v2.x git add -Aи git add .идентичны?
reka18
Спасибо @ reka18, за очень хороший вопрос. Это вдохновило меня завершить свой ответ ... Ответ на ваш вопрос: если вы вызываете его в рабочем каталоге, нет, но если в подкаталоге, то да ( git add -Aприменяется ко всему рабочему каталогу и git add .всегда к текущему каталогу).
simhumileco
2
  • git add -A (--all) Добавляет все, чтобы все, что находится в вашей папке на диске, было представлено в промежуточной области

  • git add . Все ставит, но не удаляет файлы, которые были удалены с диска

  • git add * Помещает все, кроме файлов, начинающихся с точки, и не удаляет файлы, которые были удалены с диска.

  • git add -u (--update) Помещает только измененные файлы, удаляет файлы, которые были удалены с диска, не добавляет новые

  • git add <file name 1> <file name 2> Добавляет только определенные файлы

Штеффен
источник