Как игнорировать файлы и папки в Git — файл .gitignore

Git – это популярная система контроля версий. Благодаря Git разработчики могут сотрудничать и без проблем работать над проектами совместно.

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

Git работает по следующему принципу: вы размещаете файлы в проекте с помощью команды git add, а затем фиксируете (коммитите) их с помощью команды git commit.

При совместной работе над проектами могут возникнуть ситуации, когда вы не захотите, чтобы какие-то файлы или части проекта были видны всем участникам команды.

Как же сделать так, чтобы Git игнорировал и не отслеживал определенные файлы?

С помощью файла .gitignore.

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

Что такое файл .gitignore? Для чего он нужен?

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

  • Отслеживаемые – это все файлы и каталоги, о которых знает Git. Это файлы и каталоги, которые были недавно размещены (добавлены с помощью git add) и зафиксированы (закоммичены с помощью git commit) в главном репозитории.
  • Неотслеживаемые – это новые файлы и каталоги, которые созданы в рабочем каталоге, но еще не размещены (или добавлены с помощью команды git add).
  • Игнорируемые – это все файлы и каталоги, которые полностью исключаются и игнорируются, и никто о них в репозитории Git не знает. По сути, это способ сообщить Git о том, какие неотслеживаемые файлы так и должны остаться неотслеживаемыми и не должны фиксироваться.

Все файлы, которые должны быть проигнорированы, сохраняются в файле .gitignore.

Файл .gitignore – это обычный текстовый файл, который содержит список всех указанных файлов и папок проекта, которые Git должен игнорировать и не отслеживать.

Как создать файл .gitignore?

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

Тем не менее, вы можете поместить этот файл в любую папку в репозитории. Если на то пошло, то у вас может быть несколько файлов .gitignore.

Для того, чтобы создать файл .gitignore в Unix-подобной системе, такой как macOS или Linux, с помощью командной строки, откройте приложение терминала (например, в macOS это Terminal.app). Затем для того, чтобы создать файл .gitignore для вашего каталога, перейдите в корневую папку, которая содержит проект, и при помощи команды cd введите следующую команду:

touch .gitignore

Файлы, перед именем которых стоит точка ., по умолчанию скрыты.

Скрытые файлы нельзя просмотреть, используя только команду ls. для того, чтобы иметь возможность просмотреть все файлы, включая скрытые, используйте флаг -a с командой ls следующим образом:

ls –a

Что добавлять в файл .gitignore?

В файл .gitignore должны быть добавлены файлы любого типа, которые не нужно фиксировать.

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

Вот некоторые файлы, которые могут быть включены:

Файлы операционной системы. Каждая операционная система, будь то macOS, Windows или Linux, создает системные скрытые файлы, которые не нужны другим разработчикам, так как их система создает такие же файлы. Например, в macOS Finder создает файл .DS_Store, который содержит пользовательские настройки внешнего вида и отображения папок, такие как размер и положение иконок.
Файлы конфигурации, создаваемые такими приложениями, как редакторы кода и IDE (Integrated Development Environment – интегрированная среда разработки). Эти файлы настроены под вас, ваши конфигурации и ваши настройки, например папка .idea.
Файлы, которые автоматически генерируются языком программирования или средой разработки, которую вы используете для своего проекта, и в процессе компиляции специфичных для кода файлов, такие как файлы .o.
Папки, созданные диспетчерами пакетов, например, папка npm node_modules. Это папка, которая используется для сохранения и отслеживания зависимостей для каждого пакета, который вы устанавливаете локально.
Файлы, которые содержат конфиденциальные данные и личную информацию. Примерами таких файлов могут послужить файлы с вашими учетными данными (имя пользователя и пароль) и файлы с переменными среды, такие как файлы .env (файлы .env содержат ключи API, которые должны оставаться защищенными и закрытыми).
Файлы среды выполнения, такие как файлы .log. Они предоставляют информацию об использовании операционной системы и ошибках, а также историю событий, произошедших в рамках ОС.

Как игнорировать файл или папку в Git ?

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

Например, если вы хотите игнорировать файл text.txt, который расположен в корневом каталоге, то вы должны сделать следующее:

/text.txt

А если вы хотите игнорировать файл text.txt, который расположен в папке test корневого каталоге, вы должны сделать следующее:

/test/text.txt

Вы можете это записать иначе:

test/text.txt

Если вы хотите игнорировать все файлы с определенным именем, то вам нужно написать точное имя файла.

Например, если вы хотите игнорировать любые файлы text.txt, то вы должны добавить в .gitignore следующее:

text.txt

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

Для того, чтобы игнорировать весь каталог со всем его содержимым, вам нужно указать имя каталога со слешем в конце:

test/

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

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

# соответствует любым файлам и каталогам с именем test
test

Что делать, если вы хотите игнорировать любые файлы и каталоги, которые начинаются с определенного слова?

Допустим, вы хотите игнорировать все файлы и каталоги, имя которых начинается с img. Для этого вам необходимо указать имя, а затем селектор подстановочного символа *:

img*

Эта команда позволит игнорировать все файлы и каталоги, имя которых начинается с img.

Но что делать, если вы хотите игнорировать любые файлы и каталоги, которые заканчиваются определенным набором символов?

Если вы хотите игнорировать все файлы с определенным расширением, то вам необходимо будет использовать селектор подстановочного знака *, за которым последует расширение файла.

Например, если вы хотите игнорировать все файлы разметки, которые заканчиваются расширением .md, то вы должны в файл .gitignore добавить следующее:

*.md

Этот шаблон будет соответствовать любому файлу с расширением .md, расположенному в любой папке проекта.

Мы разобрали, как игнорировать все файлы, которые оканчиваются одинаково. Но что делать, если вы хотите сделать исключение для одного из этих файлов?

Допустим, вы добавили в свой файл .gitignore следующее:

.md

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

Для этого вам нужно будет воспользоваться шаблоном с отрицанием (с восклицательным знаком), чтобы исключить файл, который в противном случае был бы проигнорирован, как и все остальные:

# игнорирует все файлы .md
.md

# не игнорирует файл README.md
!README.md

Учитывая эти два шаблона в файле .gitignore, все файлы, оканчивающиеся на .md будут игнорироваться, кроме файла README.md.

Стоит отметить, что данный шаблон не будет работать, если вы игнорируете весь каталог.

Допустим, что вы игнорируете все каталоги test:

test/

И допустим, внутри папки test у вас есть файл example.md, который вы не хотите игнорировать.

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

# игнорировать все каталоги с именем test
test/

# попытка отрицания файла внутри игнорируемого каталога не сработает
!test/example.md

Как игнорировать ранее закоммиченый файл

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

Git может игнорировать только неотслеживаемые файлы, которые еще не были зафиксированы в репозитории.

Что же делать, если вы уже закоммитили файл, но хотели бы, чтобы он все-таки не был закоммичен?

Допустим, что вы случайно закоммитили файл .env, в котором хранятся переменные среды.

Для начала вам необходимо обновить файл .gitignore, чтобы включить файл .env:

# добавить файл .env в .gitignore
echo ".env" >> .gitignore

Теперь, вам нужно указать Git не отслеживать этот файл, удалив его из перечня:

git rm --cached .env

Команда git rm вместе с параметром --cached удаляет файл из репозитория, но не фактический файл. Это значит, что файл остается в вашей локальной системе и в вашем рабочем каталоге в качестве файла, который игнорируется.

Команда git status покажет, что файла в репозитории больше нет, а ввод команды ls покажет, что файл существует в вашей локальной файловой системе.

Если вы хотите удалить файл из репозитория и вашей локальной системы, то не используйте параметр --cached.

Затем добавьте .gitignore в область подготовленных файлов с помощью команды git add:

git add .gitignore

И наконец, закоммитте файл .gitignore с помощью команды git commit:

git commit -m "update ignored files"

Вот и все – теперь вы знаете, как игнорировать файлы и папки в Git.

источник