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

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

Ответ 1

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

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

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

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

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


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

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

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

Ответ 2

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

Ответ 3

Есть три способа сообщить GIT, какие файлы игнорировать:

  • .gitignore файлы
  • $GIT_DIR/.git/info/exclude
  • Файлы, на которые указывает настройка core.excludesfile

Последние два пункта могут решить вашу проблему.

Для получения дополнительной информации см. gitignore (5).

Ответ 4

Если вы просто хотите, чтобы в репозитории были локальные файлы, а расположение подкаталога было гибким, вы можете поместить свои файлы в tracked_dir1/tracked_dir2/untracked_dir/, а затем добавить tracked_dir1/tracked_dir2/untracked_dir/.gitignore с содержимым, например:

*

т.е.

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

Ответ 5

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

Я не могу изменить .gitignore моего хранилища.

Я собираюсь предположить, что вы имеете в виду, что вы не можете вносить какие-либо изменения в .gitignore в origin. В этом случае вы можете добавить неотслеживаемый файл в локальный .gitignore, а затем выполнить git update-index --assume-unchanged.gitignore чтобы ваше изменение в .gitignore никогда не выдвигалось. Теперь вы игнорируете (возможно) неотслеживаемый файл и не затрагивает удаленный файл .gitignore.

Ответ 6

Игнорировать локальные изменения в отслеживаемых файлах: 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.

Ответ 7

По-другому:

  • редактировать локальный .gitignore
  • затем git update-index --assume-unchanged.gitignore