Из-за внешних странных ограничений я не могу изменить .gitignore
моего репозитория. Есть ли способ игнорировать файлы и каталоги, кроме изменения .gitignore
? Даже если это глобальное решение, подобное глобальной конфигурации, которое будет применяться ко всем моим репозиториям.
Как сделать Git игнорировать файлы без использования .gitignore?
Ответ 1
Не забывайте, согласно gitignore, что существует порядок приоритета в разных "источниках игнорирования шаблонов", которые Git рассмотрим:
- Шаблоны, считываемые из командной строки для тех команд, которые их поддерживают.
- Шаблоны, считанные из файла .gitignore в том же каталоге, что и путь, или в любом родительском каталоге, с шаблонами в файлах более высокого уровня (до корня), которые переопределяются теми, которые находятся в файлах нижнего уровня, до каталога содержащий файл.
- Шаблоны читаются с
$GIT_DIR/info/exclude
. - Шаблоны, считанные из файла, указанного переменной конфигурации
core.excludesfile
.
Последние два могут быть решением вашей проблемы, но:
- они не реплицируются для удаленного хранилища.
- они могут иметь свои шаблоны, переопределенные другими источниками
(См. также этот вопрос SO)
Другие два решения включают обновление индекса (git update-index
):
-
git update-index --assume-unchanged
: см. "Git: отсканировать файл только в локальном репо и сохранить его в удаленном репо.
В комментариях упоминается Элайджа Линн.- Вы даже можете игнорировать содержимое папки: "
git update-index --assume-unchanged
в каталоге". - Используйте
--no-assume-unchange
для изменения эффекта: См. " Возможно лиgit add
файл, который в настоящее время защищенassume-unchanged
?".
- Вы даже можете игнорировать содержимое папки: "
Однако, когда вы проверяете другую ветку или когда вы git pull
, статус "игнорировать" может быть reset. Отсюда и другой вариант:
-
git update-index --skip-worktree
; видеть:
Разница между двумя объясняется в "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
Ответ 8
Вы можете использовать глобальный метод gitignore вместо того, чтобы изменять его в проекте https://help.github.com/articles/ignoring-files/#create-a-global-gitignore