Как мне настроить git на локальное игнорирование некоторых файлов?
Могу ли я игнорировать файлы локально, не загрязняя глобальные настройки git для всех остальных? У меня есть неотслеживаемые файлы, которые являются спамом, в моем состоянии git, но я не хочу фиксировать изменения в git config для каждого небольшого случайного неотслеживаемого файла, который есть в моих локальных ветках.
18 ответов
Из соответствующей документации Git:
Шаблоны, которые являются специфическими для конкретного репозитория, но которые не должны использоваться совместно с другими связанными репозиториями (например, вспомогательные файлы, которые находятся внутри репозитория, но специфичны для рабочего процесса одного пользователя), должны войти в
$GIT_DIR/info/exclude
файл.
.git/info/exclude
файл имеет тот же формат, что и любой .gitignore
файл. Другой вариант - установить core.excludesFile
к имени файла, содержащего глобальные шаблоны.
Обратите внимание, что если у вас уже есть нетегированные изменения, вы должны выполнить следующее после редактирования шаблонов игнорирования:
git update-index --assume-unchanged [<file>...]
Обратите внимание на$GIT_DIR
: Эта нотация используется во всем руководстве git просто для указания пути к хранилищу git. Если задана переменная окружения, она переопределяет местоположение любого репо, в котором вы находитесь, что, вероятно, не то, что вам нужно.
Обновление: рассмотрите возможность использования git update-index --skip-worktree [<file>...]
вместо этого, спасибо @danShumway! См. Объяснение Бореалида о различии двух вариантов.
Старый ответ:
Если вам нужно игнорировать локальные изменения в отслеживаемых файлах (у нас это происходит с локальными изменениями в конфигурационных файлах), используйте git update-index --assume-unchanged [<file>...]
,
Добавьте следующие строки в раздел [alias] вашего файла.gitconfig
ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"
Теперь вы можете использовать git ignore my_file
игнорировать изменения в локальном файле, и git unignore my_file
перестать игнорировать изменения. git ignored
список игнорируемых файлов.
Этот ответ был получен с http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html.
У вас есть несколько вариантов:
- Оставить грязным (или незафиксированным)
.gitignore
файл в рабочем каталоге (или примените его автоматически с помощью topgit или другого такого инструмента исправления). - Поместите исключения в ваш
$GIT_DIR/info/exclude
файл, если это относится к одному дереву. - Бежать
git config --global core.excludesfile ~/.gitignore
и добавить шаблоны к вашему~/.gitignore
, Этот параметр применяется, если вы хотите игнорировать определенные шаблоны для всех деревьев. Я использую это для.pyc
а также.pyo
файлы, например.
Кроме того, убедитесь, что вы используете шаблоны, а не явно перечислите файлы, если это применимо.
Я думаю, что вы ищете:
git update-index --skip-worktree FILENAME
которые игнорируют изменения, сделанные локально
Вот http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/ более подробное описание этих решений!
Вы можете просто добавить файл.gitignore в свой домашний каталог, т.е. $HOME/.gitignore
или же ~/.gitignore
, Затем скажите git использовать этот файл с командой:
git config --global core.excludesfile ~/.gitignore
Это обычный файл.gitignore, на который ссылаются git, когда решают, что игнорировать. Поскольку он находится в вашем домашнем каталоге, он применяется только к вам и не загрязняет файлы проекта.gitignore.
Я использовал этот подход в течение многих лет с отличными результатами.
Вы можете установить некоторые псевдонимы git, чтобы упростить этот процесс. Это редактирует [alias]
узел вашего .gitconfig
файл.
git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'
Ярлыки, которые это устанавливает для вас, следующие:
git ignore config.xml
- Git сделает вид, что не видит никаких изменений
config.xml
- предотвращение случайного совершения этих изменений.
- Git сделает вид, что не видит никаких изменений
git unignore config.xml
- Git возобновит подтверждение ваших изменений
config.xml
- позволяя вам снова совершить эти изменения.
- Git возобновит подтверждение ваших изменений
git ignored
- git перечислит все файлы, которые вы "игнорируете", как описано выше.
Я построил их, ссылаясь на ответ Phatmann - который представляет --assume-unchanged
версия такая же.
Версия, которую я представляю, использует --skip-worktree
для игнорирования локальных изменений. См . Ответ Бореалида для полного объяснения разницы, но по существу --skip-worktree
Цель разработчиков - изменить файлы без риска их изменения.
git ignored
представленная здесь команда использует git ls-files -v
и фильтрует список, чтобы показать только те записи, начинающиеся с S
тег. S
тег обозначает файл со статусом "пропустить рабочее дерево". Полный список статусов файлов показан git ls-files
: см. документацию для -t
вариант на git ls-files
,
Это своего рода краткое решение, которое добавляет строку в локальный файл исключения.
echo YOURFILE_OR_DIRECTOY >> .git/info/exclude
И --assume-unchanged, и --skip-worktree НЕ ПРАВИЛЬНЫЙ СПОСОБ игнорировать файлы локально... Пожалуйста, проверьте этот ответ и примечания в документации git update-index. Файлы, которые по какой-либо причине продолжают часто меняться (и / или переходить от клона к другому), и их изменения не должны фиксироваться, тогда эти файлы НЕ СЛЕДУЕТ отслеживать в первую очередь.
Однако есть два правильных способа игнорировать файлы локально (оба работают с неотслеживаемыми файлами). Либо поместить имена файлов в файл.git / info / exclude, который является локальной альтернативой.gitignore, но специфичен для текущего клона. Или использовать глобальный.gitignore (который следует правильно использовать только для общих вспомогательных файлов, например pyz, pycache и т. Д.), И файл будет проигнорирован в любом репозитории git на вашем компьютере.
Чтобы сделать это как бы автоматизированным (добавление для исключения или глобального.gitignore), вы можете использовать следующие команды (добавить в свой профиль bash):
- Локальное исключение для каждого клона (обратите внимание, что вы должны находиться в корне репозитория при вызове команды из-за использования относительного пути), измените ##FILE-NAME## на
.git/info/exclude
- Глобальный.gitignore, сначала сделайте глобальный.gitignore здесь, затем измените ##FILE-NAME## на
~/.gitignore
Linux
alias git-ignore='echo $1 >> ##FILE-NAME##'
alias git-show-ignored='cat ##FILE-NAME##'
git-unignore(){
GITFILETOUNIGNORE=${1//\//\\\/}
sed -i "/$GITFILETOUNIGNORE/d" ##FILE-NAME##
unset GITFILETOUNIGNORE
}
MacOS (вам нужен.bak дляsed
изменения на месте (т.е. вы вынуждены добавить расширение файла для inplace sed. т.е. сделать резервную копию перед заменой чего-либо), поэтому для удаления файла.bak я добавил rm filename.bak)
alias git-ignore='echo $1 >> ##FILE-NAME##'
alias git-show-ignored='cat ##FILE-NAME##'
git-unignore(){
GITFILETOUNIGNORE=${1//\//\\\/}
sed -i.bak "/$GITFILETOUNIGNORE/d" ##FILE-NAME##
rm ##FILE-NAME##.bak
unset GITFILETOUNIGNORE
}
Тогда вы сможете:
git-ignore example_file.txt
git-unignore example_file.txt
Чтобы игнорировать неотслеживаемые файлы, особенно если они находятся в (нескольких) папках, которые не отслеживаются, простое решение - добавить .gitignore
файл в каждую неотслеживаемую папку и введите в одной строке, содержащей *
с новой строкой. Это действительно простое и понятное решение, если неотслеживаемые файлы находятся в нескольких папках. Для меня все файлы были из одной неотслеживаемой папкиvendor
и вышеупомянутое просто сработало.
Не забудьте подтвердить один факт ответом @joss lee.
git update-index --assume-unchanged directory/
Обратите внимание на косую черту (/) в конце.
TL;DR — фильтровать вывод, чтобы игнорировать файлы
Не делай этого. Есть отличные ответы на технические способы сделать это. Тем не менее, я несколько раз находил эту страницу вопросов и ответов. Как видите, решений несколько. Проблема в том, что каждый заставит git игнорировать файл; это может быть то, что вы хотите сейчас, но, возможно, не в будущем.
Дьявол в деталях,
-
больше не будет сообщать о файлах. - Нужно вспомнить, какой из механизмов вы использовали.
Либо добавьте его в .gitignore , либо напишите фильтр в
Просто добавьте путь к файлу, который вы хотите удалить из коммитов в любой ветке текущего репо:
- Показать скрытые файлы в настройках каталогов Windows
- Открытый путь REPO_MAIN_PATH/.git/info/exclude
- Добавьте, например, **/toExcludeFile.bat
Вот и все ! Для меня ответы выше слишком длинные. ПОЦЕЛУЙ - Держи это глупо просто
Для тех, кто хочет игнорировать файлы локально в подмодуле:
Редактировать
my-parent-repo/.git/modules/my-submodule/info/exclude
в том же формате, что и
.gitignore
файл.
Я использую git версии 2.17.1, я добавил имя файла в .git/info/exclude, и он не отслеживает файл.
Принятый ответ помог мне, в репозитории проекта .git добавил следующее кexclude
файл:
wp-content/plugins
wp-content/uploads
Если вы хотите игнорировать все файлы в каталоге, а не только один файл, используяskip-worktree
Используйте -->git update-index --skip-worktree path/to/directory/*
Но нетgit update-index --skip-worktree path/to/directory
Ниgit update-index --skip-worktree path/to/directory/
Однако я не мог сделать это для вложенных каталогов!
Если в вашем репо еще нет файла.gitignore, то простое решение - создать файл.gitignore и добавить в него .gitignore
в список файлов, которые следует игнорировать.