Как мне настроить 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 unignore config.xml
    • Git возобновит подтверждение ваших изменений config.xml - позволяя вам снова совершить эти изменения.
  • 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 , либо напишите фильтр вкоторый будет активно фильтровать текст. Каждый будет игнорировать файл, но ответ, почему он игнорируется, более очевиден. Второй случай скрипта-оболочки (или отзыв командной строки) делает совершенно очевидным то, что вы предпочитаете игнорировать, и что ваш рабочий процесс нестандартен.

Просто добавьте путь к файлу, который вы хотите удалить из коммитов в любой ветке текущего репо:

  1. Показать скрытые файлы в настройках каталогов Windows
  2. Открытый путь REPO_MAIN_PATH/.git/info/exclude
  3. Добавьте, например, **/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 в список файлов, которые следует игнорировать.

Другие вопросы по тегам