предупреждения от git add.против мерзавца добавить * - PullRequest
0 голосов
/ 19 февраля 2019

Я немного озадачен по поводу различного поведения, демонстрируемого git add . и git add *.

Я добавляю веб-сайт CodeIgniter в свое репо (в качестве начального добавления - репо в настоящее время пусто).

Когда я использую git add ., все файлы добавляются, и мой .gitignore уважается.Если я тогда попробую git add * (после сброса), я получу предупреждение:

The following paths are ignored by one of your .gitignore files:
contributing.md

Однако, это не предупреждает меня о других файлах, которые правильно игнорируются;например, в моем .gitignore у меня есть

**/config/development/*

Этот каталог содержит только database.php, а этот файл игнорируется .Разве я не получаю предупреждение об ошибке в git или есть рациональное объяснение?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Когда вы говорите git add * в приглашении bash (или в основном в любом приглашении оболочки в стиле UNIX), оболочка расширяет *.(Расширение globs считается обязанностью оболочки в UNIX, которая имеет ряд незначительных симптомов, таких как этот.)

Это означает, что, насколько может судить git, вы набрали что-то вроде

git add aDiretory aFile anotherFile contributing.md someOtherDirectory

То есть он думает, что вы специально попросили добавить contributing.md.Когда вы специально просите git add файл, который игнорировать d, он этого не делает (если вы не указали опцию -f), и выдает предупреждение, объясняющее, почему он этого не сделалсделайте это.

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

И когда вы говорите git add ., выявно не называете никаких файлов - вы просто неявно говорите, что хотите, чтобы все файлы находились в каталоге ..Так что никаких предупреждений.

Поскольку git фактически не добавляет игнорируемый файл по умолчанию, это обычно не имеет значения.Однако более важное различие между этими двумя командами заключается в том, что когда bash раскрывает *, он пропускает имена файлов, начинающиеся с ., например, .gitignore.Так что, если вы хотите добавить все, использование . (или что-то вроде :/:., чтобы убедиться, что вы говорите о корне рабочего дерева) часто является более правильной командой.

0 голосов
/ 19 февраля 2019

Вы выполняете два разных действия с помощью одной и той же команды, и это расширение имени файла , что является ключевым здесь.Мой репозиторий имеет довольно стандартный корневой каталог;

$ ls
db/  docs/  packages/  reports/  scripts/  src/

$ ls .
db/  docs/  packages/  reports/  scripts/  src/

Пока все разумно.

$ ls * | head
db:
Company.Data.Migrations/

docs:
ProjectX/
wiki/

packages:
Company.ProjectA.1.0.1/
Company.ProjectB.1.0.17/
... # and so on for every file

Так что поведение меняется между ls . и ls *, почему так?См. здесь , чтобы узнать, как вспомнить расширение файла.

$ echo ls .
ls .

$ echo ls *
ls db docs packages reports scripts src

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...