Вопрос по git – gitignore все файлы расширения в каталоге

140

Есть ли способ игнорировать все файлы типа в каталоге?

** очевидно, что это бессмысленно, так что это не работает:

/public/static/**/*.js

Идея состоит в том, чтобы соответствовать произвольным вложенным папкам.

возможный дубликатGit-ignore certain files in sub-directories, but not all Chris Moschini

Ваш Ответ

5   ответов
94

git help ignore предполагает, что если вы положите.gitignore с*.js в/public/static, он будет делать то, что вы хотите.

Примечание. Обязательно ознакомьтесь с Joeys & apos; ответ ниже: если вы хотите игнорировать файлы в определенном подкаталоге, то локальное .gitignore является правильным решением (локальность хорошая). Однако если вам нужен один и тот же шаблон для применения ко всему репо, тогда ** решение лучше.

Это не обязательно лучшее решение. Потенциально людям нужно будет копаться в разных файлах .gitignore, чтобы выяснить, почему их файл игнорируется. Некоторые предпочитают хранить всю эту информацию в одном файле .gitignore, хранящемся в корневом каталоге репо.
@haren это не единственное решение - ответ Джои, безусловно, также действителен. Выберите то, что работает лучше для вас. Я утверждаю, что правила игнорирования, локальные для каталога, должны находиться в этом каталоге, и что глобальные правила должны быть глобальными. (Кроме того, этот ответ является древним, и я не думаю, что ** был поддержан в то время).
61

@ Джои ответ: Git теперь поддерживает** синтаксис в шаблонах. Оба подхода должны работать нормально.

gitignore (5) справочная страница состояния:

Patterns read from a .gitignore file in the same directory as the path, or in any parent directory, with patterns in the higher level files (up to the toplevel of the work tree) being overridden by those in lower level files down to the directory containing the file.

Это означает, что шаблоны в.gitignore файл в любом каталоге вашего репо будет влиятьthat directory а такжеall subdirectories.

Образец вы предоставили

/public/static/**/*.js

не совсем правильно, во-первых, потому что (как вы правильно заметили)** синтаксис не используется Git. Также ведущий/ привязывает этот шаблон к началу пути. (Так,/public/static/*.js будет соответствовать/public/static/foo.js ноnot /public/static/foo/bar.js.) Removing the leading / won't work either, matching paths like public/static/foo.js and foo/public/static/bar.js. РЕДАКТИРОВАТЬ: простое удаление начального слеша также не сработает & # x2014; поскольку шаблон по-прежнему содержит косую черту, Git рассматривает его как обычный нерекурсивный глобус оболочки (спасибо@ Джои Хоер за указание на это).

Как подсказывает @ptyx, вам нужно создать файл<repo>/public/static/.gitignore и включите только этот шаблон:

*.js

Нет ведущих/поэтому он будет совпадать с любой частью пути, и этот шаблон будет применяться только к файлам в/public/static каталог и его подкаталоги.

Это не совсем так & # x2013; в частности, часть "Удаление ведущих/ тоже не будет работать, соответствующие пути, такие какpublic/static/foo.js а такжеfoo/public/static/bar.js. & Quot; ложно Цитироватьthe documentation & quot; Если шаблон не содержит косую черту /, Git обрабатывает его как шаблон глобуса оболочки и проверяет совпадение с именем пути относительно расположения файла .gitignore (относительно верхнего уровня рабочего дерева, если не из файл .gitignore). & quot;foo/public/static/bar.js не будет соответствовать, потому что шаблон содержит/.
@JoeyHoer, спасибо за подсказку, я соответственно обновил свой ответ.
164

** синтаксис поддерживаетсяgit по версии1.8.2.1 в соответствии сдокументация.

Two consecutive asterisks ("**") in patterns matched against full pathname may have special meaning:

A leading "**" followed by a slash means match in all directories. For example, "**/foo" matches file or directory "foo" anywhere, the same as pattern "foo". "**/foo/bar" matches file or directory "bar" anywhere that is directly under directory "foo".

A trailing "/**" matches everything inside. For example, "abc/**" matches all files inside directory "abc", relative to the location of the .gitignore file, with infinite depth.

A slash followed by two consecutive asterisks then a slash matches zero or more directories. For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b" and so on.

Other consecutive asterisks are considered invalid.

& quot; Другие последовательные звездочки считаются недействительными. & quot; подводит итоги
xxx/** предназначается для всех файлов и каталогов внутриxxx в то время какxxx/ нацелен наxxx каталог напрямую. Это действительно имеет значение только при отрицании! as & quot; Невозможно повторно включить файл, если исключен родительский каталог этого файла. & quot ;, поэтому используйтеxxx/* или жеxxx/** будет необходимо в этом случае.
в чем разница междуxxx/** а такжеxxx/?
Все файлы с окончанием .meta должны игнорироваться git. Как это работает?**.js ?
2

find, Я не люблю иметь несколько.gitignore слоняться в подкаталогах и я предпочитаю управлять уникальным, на высшем уровне.gitignore, Для этого вы можете просто добавить найденные файлы к вашему.gitignore, Если предположить, что/public/static/ Ваш проект / Git Home я бы использовал что-то вроде:

find . -type f -name *.js | cut -c 3- >> .gitignore

Я обнаружил, что вырезать./ в начале часто необходимо, чтобы git понимал, каких файлов следует избегать. Следовательноcut -c 3-.

9

просто перейдите в .git / info / exclude. Исключить - это файл со списком игнорируемых расширений или файлов.

Это не переносится на другие клоны хранилища, как .gitignore (конечно, после фиксации).

Похожие вопросы