Подробнее о файле .gitignore

.gitignore служит для указания в нём файлов и папок, которые необходимо скрыть от системы контроля версий git.

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

Приведу простой пример: у вас имеется файл " /config/db.php", в нём прописаны параметры подключения к БД, причём на вашей локальной машине и на сервере эти параметры будут разниться.
А если эти файлы различны, то git будет при каждом pull/push ругаться на то, что имеется конфликт.

Другой пример: если вы используете NetBeans и настройки своего проекта храните непосредственно в папке с проектом, то вам необходимо закрыть от git`а директорию "nbproject", чтобы другие участники вашего проекта не страдали от того, что вы случайно закомитили эту директорию.

Данная ситуация легко разрешатся использованием файла .gitignore, который можно разместить в папке "/config/.gitignore" со следующим содержимым:
  1. /db.php

Одна эта строчка укажет git, что необходимо игнорировать файл " db.php", который лежит в этой директории.

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

Вот некоторые правила синтаксиса этого файла:
  • Одна строчка - одно правило,
  • Пустые строки игнорируются,
  • Комментарии доступны через решётку(#) в начале строки,
  • Символ "/" в начале строки указывает, что правило применяется только к файлам и папкам, которые располагаются в той же папке, что и сам файл .gitignore,
  • Доступно использовать спецсимволы: звёздочка(*) заменяет любое количество символов(ноль или больше), вопросик(?) заменяет от нуля до одного символа. Можно размещать в любом месте правила,
  • Две звёздочки(**) используются для указания любого количества поддиректорий, подробнее смотри ниже в примерах,
  • Восклицательный знак(!) в начале строки означает инвертирование правила, необходим для указания исключений из правил игнорирования,
  • Символ "\" используется для экранирования спецсимволов, например, чтобы игнорировать файл с именем "!readme!.txt", нужно написать такое правило: "\!readme!.txt",
  • Для игнорирования всей директории, правило должно оканчиваться на слэш(/), в противном случае правило считается именем файла.

Привожу наглядный пример файла .gitignore:
  1. # Игнор-лист файлов проекта
  2. # Игнорировать ВСЕ файлы и директории, включая поддиректории и файлы в них
  3. *
  4. # ---- ФАЙЛЫ ----
  5. # Игнорирование по типу файла, будут игнорироваться в АБСОЛЮТНО всех директориях
  6. # Например /files/data.zip, /server.log, /uploads/users/data/info.xls
  7. *.zip
  8. *.log
  9. *.pdf
  10. *.xls
  11. # Игнорирование файла во ВСЕХ директориях
  12. # Например /params/db/config.php, /config.php
  13. config.php
  14. # Игнорирование конкретного файла ТОЛЬКО в корне проекта
  15. # (корнём считается расположение файла .gitignore)
  16. # Например НЕ БУДЕТ проигнорирован файл /db/config.php
  17. /config.php
  18. # Игнорирование конкретного файла ТОЛЬКО в указанной директории
  19. # Например НЕ БУДЕТ проигнорирован файл /prod/params/config.php
  20. /params/config.php
  21. # ---- ДИРЕКТОРИИ ----
  22. # Игнорирование всех файлов и папок ТОЛЬКО в конкретной директории(включая поддиректории и файлы в них)
  23. # Например /images/user.jpg, /images/company/logo.png
  24. # НЕ БУДУТ проигнорированы файлы и папки /prod/images/user.jpg
  25. /images/*
  26. # Игнорирование всех файлов и папок в ЛЮБЫХ директориях с указанным именем
  27. # Например /images/user.jpg, /core/images/user.jpg
  28. images/*
  29. # Игнорирование ВСЕХ html-файлов в ОДНОЙ КОНКРЕТНОЙ директории(НЕ ВКЛЮЧАЯ поддиректории)
  30. # Например /private/index.html
  31. # НЕ БУДУТ проигнорированы файлы в /private/ivan/index.html
  32. /private/*.html
  33. # Игнорирование ВСЕХ html-файлов в КОНКРЕТНОЙ директории ВКЛЮЧАЯ поддиректории
  34. # Например /private/info.html, /private/users/ivan/info.html
  35. /private/**/*.html
  36. # ---- РАЗНОЕ ----
  37. # Исключение из игнорирования
  38. # Игнорирование ВСЕХ файлов и папок внутри директории /secret,
  39. # за исключением файла /secret/free.txt, он не будет проигнорирован
  40. /secret/*
  41. !/secret/free.txt
  42. # Игнорирование файла с именем, содержащим спецсимволы
  43. # Например !readme!.txt
  44. \!readme!.txt
  45. # Игнорирование всех JPG и JPEG файлов внутри директорий,
  46. # которые начинаются на "h" и МОГУТ содержать ещё один символ после
  47. # Например /images/h4/user.jpg, /images/h/company.jpeg
  48. /images/h?/*.jp?g

В репозитории https://github.com/github/gitignore вы можете найти примеры .gitignore-файлов для своего проекта. Например, если вы используете Yii framework, то вам следует обратить внимание на файл https://github.com/github/gitignore/blob/master/Yii.gitignore, в нём перечислены основные директории, которые следует исключить из git-репозитория.

У некоторых может возникнуть вопрос:
"Я добавил в .gitignore файл/директорию, но после пуша в репозиторий там сохранился игнорируемый файл/директория, и если сделать git clone, то файл/директория так же склонируются".
Ответ таков: Нужно удалить из репозитория игнорируемые файлы/директории, делается это командой:
  1. git rm --cached <file>

После этого файл окончательно пропадёт из отслеживаемых git`ом.

Comments (5)

  • Роман
    Роман Reply #

    Сделал git rm --cached fail.php
    В gitignor вставил значение !fail.php
    Теперь там куда я делаю pull, файл исчезает.

    • Ivan Orlov
      Ivan Orlov Reply #

      Это нормальное поведение, нельзя закомитить файл, сделать его игнорируемым и чтобы он тянулся с репозитория, т.к. это нарушает логику работы git =)
      В репозитории файла нет - значит и при pull он не появится сам.

  • Arkanum
    Arkanum Reply #

    Спасибо, понятно теперь :)

  • Андрей
    Андрей Reply #

    Спасибо, очень емкая и дельная статья. Идея с вынесением гитигнора в корень сайта - простая и эффективная идея ;)

  • ???
    ??? Reply #

    Шапка сайта жутко глючит, не дает нормально скролить страницу.
    У меня последний яндекс браузер.


Leave a comment