Як зробити Git ігнорувати файли без використання .gitignore?


132

Через зовнішні дивні обмеження я не можу змінити .gitignoreсвоє сховище. Чи є спосіб ігнорувати файли та каталоги, окрім модифікації .gitignore? Навіть якщо це глобальне рішення на зразок глобальної конфігурації, яке буде застосовано до всіх моїх сховищ.

Відповіді:


178

На думку gitignore , не забувайте, що в різних "джерелах ігнорування шаблону" існує порядок пріоритетності, який Git вважає:

  • Шаблони читаються з командного рядка для тих команд, які їх підтримують.
  • Шаблони читаються з .gitignore-файлу в тому самому каталозі, що і шлях, або в будь-якому батьківському каталозі, при цьому шаблони у файлах вищого рівня (до кореня) перекриваються тими файлами нижчого рівня, аж до каталогу, що містить файл.
  • Шаблони, прочитані з $GIT_DIR/info/exclude.
  • Шаблони зчитуються з файлу, визначеного змінною конфігурації core.excludesfile.

Останні два можуть бути вирішенням вашої проблеми, але:

  • вони не тиражуються для віддаленого сховища
  • вони можуть перекрити свої зразки іншими джерелами

(Дивіться також це питання ТАК )


Інші два рішення включають оновлення індексу ( git update-index):

Однак, коли ви перевіряєте іншу філію або коли ви git pull, статус "ігнорувати" може бути скинутий. Звідси інший варіант:

Різниця між ними пояснюється у " Git - різниця між ' assume-unchanged' та ' skip-worktree' ".


Ви можете використовувати update-index --assume-unchanged@see stackoverflow.com/a/25253144/292408
Елайджа Lynn

1
@ElijahLynn впевнений. У вас теж є update-index --skip-work-tree. Я Джев відредагував відповідь, щоб додати кілька посилань на старі мої відповіді, що ілюструють ці дві update-indexкоманди.
VonC

140

Якщо ви можете змінити, .git/info/excludeви можете помістити ті самі правила. Але цей файл є лише у вашому місцевому репо-репо.


Здається, це найкраще ставка; давайте виключатимемо файли з локального сховища.
Абізерн

1
Як це працює з підмодулями? У .gitпідмодулі немає жодного каталогу ...
zakdances

10
@yourfriendzak .gitпапка підмодуля насправді знаходиться parent_repo/.git/modules/submodule_name. Отже, ви б редагувалиparent_repo/.git/modules/submodule_name/info/exclude
Кара Брайтвелл

25

Є три способи сказати GIT, які файли ігнорувати:

  • .gitignore файли
  • $GIT_DIR/.git/info/exclude
  • Файли вказували на core.excludesfileналаштування

Останні два моменти можуть вирішити вашу проблему.

Для отримання додаткової інформації див. Gitignore (5) .


5

Якщо ви просто хочете, щоб у сховищі були деякі локальні файли, і місце розташування підкаталогу було гнучким, ви можете помістити свої файли, tracked_dir1/tracked_dir2/untracked_dir/а потім додати tracked_dir1/tracked_dir2/untracked_dir/.gitignoreвміст, як-от:

*

Тобто

$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
*
<Ctrl+D>

4

Я був у подібних ситуаціях, тому я додаю своє вподобане рішення, яке не бачу згаданого. Проблема git update-index --assume-unchangedв цьому випадку полягає в тому, що ви не можете зробити це для відслідковуваного файлу. Ти сказав

Я не можу змінити .gitignore мого сховища.

Я припускаю, що ви маєте на увазі, що ви не можете підштовхувати жодні зміни .gitignoreдо походження. Якщо це так, ви можете додати незавершений файл до свого локального .gitignore, тоді зробіть git update-index --assume-unchanged .gitignoreтак, щоб ваша зміна .gitignoreніколи не була натиснута. Тепер ви ігноруєте (можливо) файл без відстеження і не впливаєте на віддалений .gitignoreфайл.


3

Ігноруйте локальні зміни відсліджених файлів: git update-index --assume-unchanged my-file.php

Видаліть локальні зміни відсліджених файлів: git update-index --no-assume-unchanged my-file.php

джерело: git help update-index

--[no-]assume-unchanged
           ...
           This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked
           files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to
           modify this file in the index e.g. when merging in a commit; thus, in case the assumed-untracked file is
           changed upstream, you will need to handle the situation manually.


1

Інший спосіб:

  • редагувати місцеві .gitignore
  • тоді git update-index --assume-unchanged .gitignore
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.