Как заставить Git игнорировать файлы без использования .gitignore?

133

Из-за внешних странных ограничений я не могу изменить .gitignoreсвой репозиторий. Есть ли способ игнорировать файлы и каталоги, кроме изменения .gitignore? Даже если это глобальное решение, такое как глобальная конфигурация, которая будет применяться ко всем моим репозиториям.

pupeno
источник

Ответы:

179

Не забывайте, согласно gitignore , что существует порядок приоритета в различных «источниках игнорирования шаблонов», которые учитывает Git:

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

Последние два могут быть решением вашей проблемы, но:

  • они не реплицируются для удаленного репозитория
  • они могут переопределить свои шаблоны другими источниками

(См. Также этот вопрос SO )


Два других решения включают обновление index ( git update-index):

Однако, когда вы проверяете другую ветку или когда вы git pull, этот статус «игнорировать» может быть сброшен. Отсюда другой вариант:

Разница между ними объясняется в « Git - разница между ' assume-unchanged' и ' skip-worktree' ».

VonC
источник
Вы можете использовать update-index --assume-unchanged@see stackoverflow.com/a/25253144/292408
Элайджа Линн
1
@ElijahLynn конечно. У вас тоже есть update-index --skip-work-tree. Я отредактировал ответ, чтобы добавить несколько ссылок на мои старые ответы, иллюстрирующие эти две update-indexкоманды.
VonC,
141

Если вы можете изменить, .git/info/excludeвы можете поместить туда те же правила. Но этот файл находится только в вашем локальном репо.

Олафур Вааге
источник
Похоже, это ваш лучший выбор; позвольте вам исключить файлы из вашего локального репозитория.
Abizern
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в origin. Если это так, то вы можете добавить неотслеживаемый файл на свой локальный компьютер .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
langpavel
источник