Ігнорування файлів

Останнє оновлення 2025-01-24 | Редагувати цю сторінку

Огляд

Питання

  • Як зробити так, щоб Git ігнорував файли, які я не хочу відстежувати?

Цілі

  • Налаштувати Git для ігнорування певних файлів.
  • Зрозуміти чому ігнорування файлів може бути корисним.

Що робити, якщо у нас є файли, які ми не хочемо відстежувати у Git, наприклад, резервні файли, створені нашим редактором або проміжні файли, створені під час аналізу даних? Створімо декілька фіктивних файлів:

BASH

$ mkdir receipts
$ touch a.png b.png c.png receipts/a.jpg receipts/b.jpg

і подивимося, що скаже Git:

BASH

$ git status

ВИХІД

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

	a.png
	b.png
	c.png
	receipts/

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

Відстеження цих файлів за допомогою контролю версій буде марною тратою місця на диску. Що гірше, висвітлення змін в них під час перегляду історії або статусу проєкту може відвернути нас від змін, які насправді важливі, Тож скажімо Git, що ці файли треба ігнорувати.

Ми можемо зробити це, створюючи у кореневому каталозі нашого проєкту файл під назвою .gitignore:

BASH

$ nano .gitignore
$ cat .gitignore

ВИХІД

*.png
receipts/

Ці шаблони наказують Git ігнорувати будь-який файл, ім’я якого закінчується на .png, і все в каталозі receipts. (Якщо будь-які з цих файлів вже відстежуються, то Git продовжить їх відстежувати.)

Як тільки ми створили цей файл, результат команди git status стає набагато зрозумілішим:

BASH

$ git status

ВИХІД

On branch main
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)

Єдина річ, яку Git помічає зараз - це новостворений файл .gitignore. Ви можете подумати, що його не треба відстежувати, але всі, з ким ми ділимося нашим репозиторієм, ймовірно, захочуть ігнорувати ті самі речі, які ігноруємо ми. Додамо до репозиторію та здійснимо коміт файлу .gitignore:

BASH

$ git add .gitignore
$ git commit -m "Ignore png files and the receipts folder."
$ git status

ВИХІД

On branch main
nothing to commit, working tree clean

Як бонус, використання .gitignore допомагає нам уникнути випадкового додавання до репозиторію файлів, які ми не хочемо відстежувати:

BASH

$ git add a.png

ВИХІД

The following paths are ignored by one of your .gitignore files:
a.png
Use -f if you really want to add them.

Якщо ми дійсно хочемо змінити наші налаштування ігнорування, ми можемо використати git add -f, щоб змусити Git щось додати. Наприклад, git add -f a.csv. Якщо потрібно, можна також побачити статус ігнорованих файлів:

BASH

$ git status --ignored

ВИХІД

On branch main
Ignored files:
 (use "git add -f <file>..." to include in what will be committed)

        a.png
        b.png
        c.png
        receipts/

nothing to commit, working tree clean

Ігнорування вкладених файлів

Враховуючи структуру каталогу, яка виглядає так:

BASH

receipts/data
receipts/plots

Як зробити так, щоб Git ігнорував тільки receipts/plots, а не receipts/data?

Якщо ви хочете ігнорувати лише вміст receipts/plots, ви можете зробити це шляхом додавання наступного рядка до вашого .gitignore:

ВИХІД

receipts/plots/

Цей рядок забезпечить ігнорування лише вмісту receipts/plots, але не вмісту receipts/data.

Як і в більшості питань програмування, є ще кілька альтернативних способів, які можуть забезпечити виконання цього правила ігнорування. Вправа “Варіант ігнорування вкладених файлів” нижче має трохи іншу структуру каталогів, та пояснює альтернативну відповідь. Крім того, сторінка обговорення має більш детальну інформацію про правила ігнорування.

Додавання конкретних файлів

Як ігнорувати всі файли .png у кореневому каталозі, за винятком final.png? Підказка: дізнайтеся, що робить ! (оператор знаку оклику).

Треба додати наступні два рядки до вашого файлу .gitignore:

ВИХІД

*.png           # ignore all png files
!final.png      # except final.png

Знак оклику призведе до включення раніше виключеного запису.

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

Варіант ігнорування вкладених файлів

Нехай ми маємо структуру каталогів, яка виглядає подібно до попередньої вправи “Ігнорування файлів у підкаталогах”, проте дещо відрізняється:

BASH

receipts/data
receipts/images
receipts/plots
receipts/analysis

Як би ви проігнорували весь вміст у каталозі receipts, крім receipts/data?

Підказка: подумайте про те, як ви раніше зробили виняток за допомогою оператору !.

Щоб проігнорувати все в каталозі receipts/ без receipts/data/, можна змінити ваш.gitignore, щоб ігнорувати вміст каталогу receipts, але створити виняток для вмісту підкаталогу receipts/data. Ваш .gitignore буде виглядати так:

ВИХІД

receipts/*               # ігнорувати все в каталозі receipts
!receipts/data/          # не ігнорувати вміст каталогу receipts/data/

Ігнорування всіх файлів з даними у каталозі

Припустимо, що у вас порожній файл .gitignore, і ви бачите структуру каталогів, яка виглядає так:

BASH

receipts/data/market_position/gps/a.dat
receipts/data/market_position/gps/b.dat
receipts/data/market_position/gps/c.dat
receipts/data/market_position/gps/info.txt
receipts/plots

Яке найкоротше правило ви можете додати до .gitignore, щоб ігнорувати всі файли з розширенням .dat у каталозі result/data/market_position/gps? При цьому, не ігноруйте info.txt.

Додавання receipts/data/market_position/gps/*.dat призведе до ігнорування усіх файлів у receipts/data/market_position/gps, які закінчуються на .dat. Файл receipts/data/market_position/gps/info.txt не буде проігноровано.

Ігнорування всіх файлів з даними у репозиторії

Припустимо тепер, що у вас є багато файлів з розширенням .csv в різних підкаталогах вашого репозиторію. Наприклад, ви можете мати:

BASH

results/a.csv
data/experiment_1/b.csv
data/experiment_2/c.csv
data/experiment_2/variation_1/d.csv

Як ігнорувати всі файли .csv без явного переліку усіх відповідних каталогів?

Додайте наступний рядок до файлу .gitignore:

ВИХІД

**/*.csv

Це призведе до ігнорування усіх файлів .csv, незалежно від їх розташування у дереві каталогів. Ви все ще можете робити певні винятки з цього правила за допомогою знаку оклику.

Порядок застосування правил

Нехай нам дано файл .gitignore з наступним вмістом:

BASH

*.csv
!*.csv

Який вплив це буде мати на ігнорування файлів?

Оператор ! скасує запис з попередньо визначеного шаблону ігнорування. Оскільки запис ! *.csv скасовує всі попередні файли .csv в .gitignore, жоден з них не буде проігноровано, і всі файли .csv будуть відстежуватися.

Log-файли

Ви написали скрипт, який створює багато проміжних log-файлів з назвами log_01, log_02, log_03 тощо. Ви хочете зберегти їх, але не бажаєте відстежувати їх за допомогою git.

  1. Додайте до .gitignore один рядок, який виключає файли log_01, log_02 тощо.

  2. Перевірте свій “шаблон ігнорування”, створивши деякі фіктивні файли з назвами log_01, log_02 тощо.

  3. Уявіть тепер, що файл log_01 дуже важливий, та додайте його до відстежуваних файлів, не змінюючи .gitignore.

  4. Обговоріть з сусідом, які інші типи файлів можуть перебувати у вашому проєкті, які ви не бажаєте відстежувати і тому бажаєте проігнорувати за допомогою .gitignore.

  1. додайте або log_* або log* як новий рядок до вашого .gitignore

  2. відстежуйте log_01 за допомогою git add -f log_01

Ключові моменти

  • Текстовий файл .gitignore інформує Git про те, які файли треба ігнорувати в репозиторії.
  • Ви можете вказати певні файли або каталоги, які Git буде ігнорувати, або вказати типи файлів, які зазвичай ігноруються.