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

Какую модель выполняет .gitignore?

Вот содержимое моего текущего каталога.

$ ls
foo.foo
$ ls -a
.  ..  .bar.foo  .foo  foo.foo  .gitignore

Затем я превращаю этот каталог в репозиторий git.

$ git init
Initialized empty Git repository in /home/lone/foo/.git/
$ ls -a
.  ..  .bar.foo  .foo  foo.foo  .git  .gitignore

Вот содержание .gitignore.

$ cat .gitignore 
*.foo

Я вижу, что шаблон в .gitignore ведет себя иначе, чем тот же шаблон в оболочке. В оболочке *.foo соответствуют только не скрытые файлы, то есть имена файлов, которые не начинаются с периода.

$ echo *.foo
foo.foo

Но *.foo в .gitignore похоже соответствует любым файлам, скрытым или не скрытым, заканчивающимся .foo.

$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .gitignore

nothing added to commit but untracked files present (use "git add" to track)

Где я могу узнать больше о точном определении шаблонов, которые следует за .gitignore, чтобы я мог понять, где и почему его поведение отличается от поведения шаблонов оболочки оболочки?

4b9b3361

Ответ 1

gitignore использование < * "следует соглашение о шарах:

Git рассматривает шаблон как оболочку, подходящую для потребления, fnmatch (3) с FNM_PATHNAME flag: подстановочные знаки в шаблоне не будут соответствовать / в пути.

Например, "Documentation/*.html" соответствует "Documentation/git.html", но не "Documentation/ppc/ppc.html" или "tools/perf/Documentation/perf.html".

OP Lone Learner запрашивает в комментариях:

Использует ли оболочка fnmatch (3) для обработки шаблонов глобусов?
В этом случае почему * не соответствует нулевым символам. (т.е. скрытые файлы), но gitignore делает?

Потому что это выбор конфигурации оболочки.

Тип (используя shopt, который относится к bash):

shopt -s dotglob
echo *.foo
.foo foo.foo

Это использование dotglob

Если установлено, Bash включает имена файлов, начинающиеся с '.' в результатах расширение имени файла. (для соответствие шаблонов)

Ответ 2

.gitignore просто содержит записи для шаблона, который вы хотите сообщить git, чтобы не отслеживать (поддержка подстановочных знаков).

Эта конфигурация сохраняется на уровне папки.
Там вы можете указать, какой файл игнорировать.
Этот файл будет применяться ко всем подпапкам внутри рекурсивным способом.

.gitignore собирает информацию коммутативным способом:

  • Уровень системы - (глобальный), например, если вы пользователь unix и желаете чтобы игнорировать все файлы *.so для всех ваших проектов, вы поместите их в глобальный файл

  • Локальный - обычно будет на уровне проекта, применяя все содержимое данного проекта.

  • В папке - конкретные определения для данной папки (например, игнорировать файл паролей, файл журнала и т.д. или любой другой ресурс, который вы хотите игнорировать)

Существует также свойство конфигурации core.excludesfile, которое также позволяет вам использовать игнорируемый файл.

git config --global core.excludesfile ~/.gitignore

Вы также можете указать, какие файлы не игнорировать, добавив ! перед файлом, чтобы он игнорировался не (подробнее читайте ниже о подстановочных знаках, которые могут).

Чтобы узнать о синтаксисе, вы можете прочитать об этом здесь.
Вы можете использовать инструменты третьей части для создания этого файла для вас gitignore.io.


Я не мог найти то, что на странице объясняет, что * соответствует нулю или нескольким символам и также соответствует скрытым файлам

Каждая строка в файле может содержать любой шаблон со следующими подстановочными знаками:

?= Соответствует нулю или одному вхождению данных шаблонов.
*= Соответствует нулю или более вхождений данных шаблонов.
+= Соответствует одному или нескольким вхождениям данных шаблонов.
@= Соответствует одному из заданных шаблонов.
!= Соответствует чему-либо, кроме одного из указанных шаблонов.


В своем комментарии вы запросили информацию о шаблоне *.

Здесь вы можете видеть, что * игнорировать все файлы. git не волнует, есть ли его скрытый файл или нет. его просто ищет согласованный шаблон.

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

Как объяснялось выше git попробуйте сопоставить шаблон, который вы поставляете в файле .gitignore, поэтому, если вы хотите игнорировать файлы во внутренней папке, вам нужно будет указать внутреннюю папку. Ниже приведена демонстрация содержимого папки и игнорирование внутренних файлов. Вы можете видеть, что внутренняя папка aa содержит файл внутри, но поскольку файл игнорирования содержит шаблон **/, он будет игнорировать все внутренние папки и файлы.

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