git add * (зірочка) vs git add. (період)


130

Я новачок у git, і у мене є питання щодо додавання файлів у git. Я знайшов кілька питань StackOverflow про різницю між git add .і git add -a, git add --all, git add -Aі т.д. Але я не зміг знайти місце , яке пояснює , що git add *робить. Я навіть переглянув сторінку git add man , але це не допомогло. Я використовував його замість, 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
Hannes Schneidermayer

Відповіді:


132

add *означає додавання всіх файлів у поточну директорію, крім файлів, ім’я яких починається з крапки. Це ваша функція оболонки, і Git отримує лише список файлів.

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


6
тому git add .додає всі файли, папки та підпапки, включаючи .gitignore та все, що починається з крапки, при цьому git add *додаватиме будь-які файли, папки та папки, крім тих, що починаються з крапки? Це точно?
Тайлер Янгблуд

9
Це дійсно правильно. Крім того, 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він додасть його та всі файли в ньому.


1
Тож чи буде кожен привід використовувати зірочку? Чи є якась перевага використовувати його замість періоду? Або навпаки? Я впевнений, що бачив це в підручнику. Я б не знав, як використовувати його інакше. Я не дуже хлопець з командного рядка (як ви, безперечно, здогадалися).
Тайлер Янгблуд

5
*уникає прихованих файлів (тобто файлів, назва яких починається з а .). У будь-якому випадку, якщо ви не додаєте конкретні файли, я б просто використовував git add -u(або git add -Aякщо ви створюєте нові файли).
Мурейник

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 *'чітко описано Denis :

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


5

Для наочності я ставлю відповідь у таблицю нижче:

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

Додаткові замітки (натхненний коментарем @ reka18):

Примітка 1. git add -A і git add -uкоманди, виконані без додаткових параметрів, будуть додатковим уточненням (підкаталог або вказівка ​​маски для імені файлу) робота в діапазоні всього робочого каталогу (також якщо ми виконуємо команду в робочому підкаталозі каталогу).

Примітка 2. Значення .і *є відповідно до каталогу до поточного каталогу (поточного каталогу) та підстановки, які пояснюють шлях команди. Наприклад, якщо команда git add .or git add *виконується в якомусь підкаталозі робочого каталогу, то їх дія використовується лише в цьому підкаталозі, а не у всьому робочому каталозі.

Примітка 3. Команди git add -Aта git add -uкоманди можна додатково уточнити, додавши шлях або маску для файлів, наприклад, git add -A app/controllersабо git add -u app\styles\*.


2
Тож як у Git v2.x git add -Aі git add .однакові?
reka18

Дякую @ reka18, за дуже гарне запитання. Це надихнуло мене на завершення моєї відповіді ... Відповідь на ваше запитання: Якщо ви називаєте це у робочому каталозі, ні, але якщо у підкаталозі, то так ( git add -Aстосується всього робочого каталогу та git add .завжди поточного каталогу).
simhumileco

2
  • git add -A (- всі) Додає все, щоб усе, що знаходиться у вашій папці на диску, було представлене в області постановки

  • git add . Постановляє все, але не видаляє файли, видалені з диска

  • git add * Поетапно все, але не файли, які починаються з крапки & не видаляє файли, видалені з диска

  • git add -u (--оновлення) Етапи лише Змінені файли, видаляє файли, які були видалені з диска, не додає нових

  • git add <file name 1> <file name 2> Додає лише певні файли

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.