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

Останнє оновлення 2024-06-04 | Редагувати цю сторінку

Приблизний час: 5 хвилин

Огляд

Питання

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

Цілі

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

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

BASH

$ mkdir results
$ touch a.csv b.csv c.csv results/a.out results/b.out

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

BASH

$ git status

ВИХІД

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

	a.csv
	b.csv
	c.csv
	results/

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

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

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

BASH

$ nano .gitignore
$ cat .gitignore

ВИХІД

*.csv
results/

Це шаблони, які наказують Git ігнорувати будь-який файл, ім’я якого закінчується на .dat, а також усе, що знаходиться у каталозі results. (Якщо будь-які з цих файлів вже відстежуються, то 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 data files and the results folder"
$ git status

ВИХІД

On branch main
nothing to commit, working tree clean

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

BASH

$ git add a.csv

ВИХІД

The following paths are ignored by one of your .gitignore files:
a.csv
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.csv
        b.csv
        c.csv
        results/

nothing to commit, working tree clean

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

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

BASH

results/data
results/plots

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

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

ВИХІД

results/plots/

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

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

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

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

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

ВИХІД

*.csv           # ігнорувати усі файли з даними
!final.csv      # окрім final.csv

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

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

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

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

BASH

results/data
results/images
results/plots
results/analysis

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

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

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

ВИХІД

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

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

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

BASH

results/data/position/gps/a.csv
results/data/position/gps/b.csv
results/data/position/gps/c.csv
results/data/position/gps/info.txt
results/plots

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

Додавання results/data/position/gps/*.csv призведе до ігнорування усіх файлів у results/data/position/gps, які закінчуються на .csv. Файл results/data/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 про те, які файли треба ігнорувати.