Git
Игнорирование файлов и папок
Поиск…
Вступление
В этом разделе показано, как избежать добавления нежелательных файлов (или изменений файлов) в репозитории Git. Существует несколько способов (глобальный или локальный .gitignore
, .git/exclude
, git update-index --assume-unchanged
и git update-index --skip-tree
), но имейте в виду, что Git управляет контентом , что означает: игнорирование фактически игнорирует содержимое папки (то есть файлы). По умолчанию пустая папка будет проигнорирована, так как она не может быть добавлена в любом случае.
Игнорирование файлов и каталогов с помощью файла .gitignore
Вы можете заставить Git игнорировать определенные файлы и каталоги, то есть исключить их от отслеживания Git - путем создания одного или нескольких файлов .gitignore
в вашем репозитории.
В проектах программного обеспечения .gitignore
обычно содержит список файлов и / или каталогов, которые генерируются во время процесса сборки или во время выполнения. Записи в файле .gitignore
могут включать имена или пути, указывающие на:
- временные ресурсы, например, кэши, файлы журналов, скомпилированный код и т. д.
- файлы локальной конфигурации, которые не должны использоваться совместно с другими разработчиками
- файлы, содержащие секретную информацию, такие как пароли входа, ключи и учетные данные
При создании в каталоге верхнего уровня правила будут применяться рекурсивно ко всем файлам и подкаталогам во всем репозитории. При создании в подкаталоге правила будут применяться к этому конкретному каталогу и его подкаталогам.
Когда файл или каталог игнорируются, это не будет:
- отслеживается Git
- сообщается командами, такими как
git status
илиgit diff
- с такими командами, как
git add -A
В необычном случае, когда вам нужно игнорировать отслеживаемые файлы, следует соблюдать особую осторожность. См .: Игнорировать файлы, которые уже были переданы в репозиторий Git .
Примеры
Вот некоторые общие примеры правил в файле .gitignore
, основанные на шаблонах файлов glob :
# Lines starting with `#` are comments.
# Ignore files called 'file.ext'
file.ext
# Comments can't be on the same line as rules!
# The following line ignores files called 'file.ext # not a comment'
file.ext # not a comment
# Ignoring files with full path.
# This matches files in the root directory and subdirectories too.
# i.e. otherfile.ext will be ignored anywhere on the tree.
dir/otherdir/file.ext
otherfile.ext
# Ignoring directories
# Both the directory itself and its contents will be ignored.
bin/
gen/
# Glob pattern can also be used here to ignore paths with certain characters.
# For example, the below rule will match both build/ and Build/
[bB]uild/
# Without the trailing slash, the rule will match a file and/or
# a directory, so the following would ignore both a file named `gen`
# and a directory named `gen`, as well as any contents of that directory
bin
gen
# Ignoring files by extension
# All files with these extensions will be ignored in
# this directory and all its sub-directories.
*.apk
*.class
# It's possible to combine both forms to ignore files with certain
# extensions in certain directories. The following rules would be
# redundant with generic rules defined above.
java/*.apk
gen/*.class
# To ignore files only at the top level directory, but not in its
# subdirectories, prefix the rule with a `/`
/*.apk
/*.class
# To ignore any directories named DirectoryA
# in any depth use ** before DirectoryA
# Do not forget the last /,
# Otherwise it will ignore all files named DirectoryA, rather than directories
**/DirectoryA/
# This would ignore
# DirectoryA/
# DirectoryB/DirectoryA/
# DirectoryC/DirectoryB/DirectoryA/
# It would not ignore a file named DirectoryA, at any level
# To ignore any directory named DirectoryB within a
# directory named DirectoryA with any number of
# directories in between, use ** between the directories
DirectoryA/**/DirectoryB/
# This would ignore
# DirectoryA/DirectoryB/
# DirectoryA/DirectoryQ/DirectoryB/
# DirectoryA/DirectoryQ/DirectoryW/DirectoryB/
# To ignore a set of files, wildcards can be used, as can be seen above.
# A sole '*' will ignore everything in your folder, including your .gitignore file.
# To exclude specific files when using wildcards, negate them.
# So they are excluded from the ignore list:
!.gitignore
# Use the backslash as escape character to ignore files with a hash (#)
# (supported since 1.6.2.1)
\#*#
Большинство файлов .gitignore
являются стандартными для разных языков, поэтому для начала работы здесь приведены образцы файлов .gitignore
перечисленных на языке, из которого можно клонировать или копировать / вносить изменения в ваш проект. Кроме того, для нового проекта вы можете автоматически генерировать стартовый файл с помощью онлайн-инструмента .
Другие формы .gitignore
Файлы .gitignore
предназначены для передачи как часть репозитория. Если вы хотите игнорировать определенные файлы без соблюдения правил игнорирования, вот несколько вариантов:
- Отредактируйте файл
.git/info/exclude
(используя тот же синтаксис, что и.gitignore
). Правила будут глобальными в объеме хранилища; - Настройте глобальный файл gitignore, который будет применять правила игнорирования ко всем вашим локальным репозиториям:
Кроме того, вы можете игнорировать локальные изменения в отслеживаемых файлах без изменения глобальной конфигурации git с помощью:
-
git update-index --skip-worktree [<file>...]
: для небольших локальных изменений -
git update-index --assume-unchanged [<file>...]
: для производства готовые, не изменяющиеся файлы вверх по течению
Подробнее о различиях между последними флагами и документации по git update-index
см. Подробнее .
Очистка игнорируемых файлов
Вы можете использовать git clean -X
для очистки игнорируемых файлов:
git clean -Xn #display a list of ignored files
git clean -Xf #remove the previously displayed files
Примечание: -X
(caps) очищает только игнорируемые файлы. Используйте -x
(без ограничений), чтобы удалить ненужные файлы.
Подробнее см. Документацию git clean
.
Дополнительную информацию см. В руководстве Git .
Исключения в файле .gitignore
Если вы игнорируете файлы с помощью шаблона, но имеете исключения, префикс восклицательного знака (!) К исключению. Например:
*.txt
!important.txt
В приведенном выше примере Git игнорирует все файлы с расширением .txt
за исключением файлов с именем important.txt
.
Если файл находится в папке проигнорировано, вы не можете повторно включить его так легко:
folder/
!folder/*.txt
В этом примере все .txt-файлы в папке будут игнорироваться.
Правильный способ заключается в повторном включении самой папки в отдельной строке, а затем игнорировать все файлы в folder
на *
, наконец, повторно включить *.txt
в folder
, как показано ниже:
!folder/
folder/*
!folder/*.txt
Примечание . Для имен файлов, начинающихся с восклицательного знака, добавьте два восклицательных знака или выйдите с символом \
:
!!includethis
\!excludethis
Глобальный файл .gitignore
Чтобы Git игнорировал определенные файлы во всех репозиториях, вы можете создать глобальный .gitignore со следующей командой в своем терминале или командной строке:
$ git config --global core.excludesfile <Path_To_Global_gitignore_file>
Теперь Git будет использовать это в дополнение к собственному файлу .gitignore каждого репозитория. Правила для этого:
- Если локальный файл
.gitignore
явно содержит файл, а глобальный.gitignore
игнорирует его, локальный.gitignore
имеет приоритет (файл будет включен) - Если репозиторий клонирован на нескольких компьютерах, глобальный
.gigignore
должен быть загружен на всех машинах или, по крайней мере, включать его, поскольку проигнорированные файлы будут.gitignore
на репо, тогда как ПК с глобальным.gitignore
не будет обновлять его , Вот почему специфический.gitignore
- лучшая идея, чем глобальная, если проект обрабатывается командой
Этот файл является хорошим местом для игнорирования игнорирования .DS_Store
платформы, компьютера или пользователя, например OSX .DS_Store
, Windows Thumbs.db
или Vim *.ext~
и *.ext.swp
игнорирует, если вы не хотите сохранять их в репозитории , Поэтому один член команды, работающий над OS X, может добавить все .DS_STORE
и _MACOSX
(что фактически бесполезно), в то время как другой член команды в Windows может игнорировать все thumbs.bd
Игнорировать файлы, которые уже были переданы в репозиторий Git
Если вы уже добавили файл в свой репозиторий Git и теперь хотите прекратить его отслеживать (чтобы он не присутствовал в будущих коммитах), вы можете удалить его из индекса:
git rm --cached <file>
Это приведет к удалению файла из репозитория и предотвращению отслеживания дальнейших изменений Git. Параметр --cached
гарантирует, что файл не будет физически удален.
Обратите внимание, что ранее добавленное содержимое файла по-прежнему будет отображаться через историю Git.
Имейте в виду, что если кто-то еще вытащит из репозитория после удаления файла из индекса, их копия будет физически удалена .
Вы можете заставить Git притвориться, что версия рабочего каталога файла обновлена и вместо этого прочитала индексную версию (таким образом, игнорируя изменения в ней) с битом « skip worktree »:
git update-index --skip-worktree <file>
На этот бит не влияет запись, безопасность контента по-прежнему является первоочередной задачей. Вы никогда не потеряете свои драгоценные игнорируемые изменения; с другой стороны, этот бит конфликтует с тиснением: чтобы удалить этот бит, используйте
git update-index --no-skip-worktree <file>
Иногда ошибочно рекомендуется лгать Гиту и предположить, что файл остается неизменным, не изучая его. Он выглядит на первый взгляд как игнорирование любых дальнейших изменений в файле, не удаляя его из его индекса:
git update-index --assume-unchanged <file>
Это заставит git игнорировать любые изменения, внесенные в файл (имейте в виду, что если вы поместите какие-либо изменения в этот файл или вы его запишете, ваши проигнорированные изменения будут потеряны )
Если вы хотите, чтобы git снова «заботился» об этом файле, выполните следующую команду:
git update-index --no-assume-unchanged <file>
Проверка игнорирования файла
Команда git check-ignore
сообщает о файлах, игнорируемых Git.
Вы можете передавать имена файлов в командной строке, а git check-ignore
будет отображать имена файлов, которые игнорируются. Например:
$ cat .gitignore
*.o
$ git check-ignore example.o Readme.md
example.o
Здесь только * .o файлы определены в .gitignore, поэтому Readme.md не указан в выводе git check-ignore
.
Если вы хотите увидеть строку, в которой .gitignore отвечает за игнорирование файла, добавьте -v в команду git check-ignore:
$ git check-ignore -v example.o Readme.md
.gitignore:1:*.o example.o
Начиная с Git 1.7.6, вы также можете использовать git status --ignored
, чтобы увидеть проигнорированные файлы. Дополнительную информацию об этом можно найти в официальной документации или в разделе «Поиск файлов, игнорируемых с помощью .gitignore» .
Игнорирование файлов в подпапках (несколько файлов gitignore)
Предположим, что у вас есть структура репозитория:
examples/
output.log
src/
<files not shown>
output.log
README.md
output.log
в каталоге примеров действителен и требуется, чтобы проект собирал понимание, в то время как один под src/
создается во время отладки и не должен находиться в истории или части хранилища.
Существует два способа игнорировать этот файл. Вы можете поместить абсолютный путь в файл .gitignore
в корень рабочего каталога:
# /.gitignore
src/output.log
Кроме того, вы можете создать файл .gitignore
каталоге src/
и проигнорировать файл, относящийся к этому .gitignore
:
# /src/.gitignore
output.log
Игнорирование файла в любом каталоге
Чтобы игнорировать файл foo.txt
в любом каталоге, вы должны просто написать его имя:
foo.txt # matches all files 'foo.txt' in any directory
Если вы хотите игнорировать файл только в части дерева, вы можете указать подкаталоги определенного каталога с **
pattern:
bar/**/foo.txt # matches all files 'foo.txt' in 'bar' and all subdirectories
Или вы можете создать файл .gitignore
каталоге bar/
. Эквивалентным предыдущему примеру будет создание файла bar/.gitignore
с этим содержимым:
foo.txt # matches all files 'foo.txt' in any directory under bar/
Игнорировать файлы локально без правил игнорирования
.gitignore
игнорирует файлы локально, но предназначен для .gitignore
к репозиторию и совместно с другими участниками и пользователями. Вы можете установить глобальный .gitignore
, но тогда все ваши репозитории будут делиться этими настройками.
Если вы хотите игнорировать определенные файлы в репозитории локально и не создавать файловую часть какого-либо репозитория, отредактируйте файл .git/info/exclude
внутри своего репозитория.
Например:
# these files are only ignored on this repo
# these rules are not shared with anyone
# as they are personal
gtk_tests.py
gui/gtk/tests/*
localhost
pushReports.py
server/
Заполненные шаблоны .gitignore
Если вы не знаете, какие правила перечислять в вашем файле .gitignore
или просто хотите добавить общепринятые исключения в свой проект, вы можете выбрать или сгенерировать файл .gitignore
:
Многие хостинговые сервисы, такие как GitHub и BitBucket, предлагают возможность генерации файлов .gitignore
на основе языков программирования и IDE, которые вы можете использовать:
Игнорирование последующих изменений в файле (без его удаления)
Иногда вы хотите иметь файл, хранящийся в Git, но игнорировать последующие изменения.
Скажите Git игнорировать изменения в файле или каталоге с помощью update-index
:
git update-index --assume-unchanged my-file.txt
Вышеупомянутая команда дает указание Git предположить, my-file.txt
не был изменен, а не проверять или сообщать об изменениях. Файл все еще присутствует в репозитории.
Это может быть полезно для предоставления значений по умолчанию и разрешения переопределения локальной среды, например:
# create a file with some values in cat <<EOF MYSQL_USER=app MYSQL_PASSWORD=FIXME_SECRET_PASSWORD EOF > .env # commit to Git git add .env git commit -m "Adding .env template" # ignore future changes to .env git update-index --assume-unchanged .env # update your password vi .env # no changes! git status
Игнорирование только части файла [заглушки]
Иногда вам может потребоваться локальные изменения в файле, который вы не хотите комментировать или публиковать. В идеале локальные настройки должны быть сконцентрированы в отдельном файле, который может быть помещен в .gitignore
, но иногда в качестве краткосрочного решения может быть полезно иметь что-то локальное в зарегистрированном файле.
Вы можете сделать Git «unsee» эти строки, используя чистый фильтр. Они даже не появятся в разностях.
Предположим, что это фрагмент файла file1.c
:
struct settings s;
s.host = "localhost";
s.port = 5653;
s.auth = 1;
s.port = 15653; // NOCOMMIT
s.debug = 1; // NOCOMMIT
s.auth = 0; // NOCOMMIT
Вы не хотите публиковать NOCOMMIT
.
Создайте фильтр «nocommit», добавив его в конфигурационный файл Git, например .git/config
:
[filter "nocommit"]
clean=grep -v NOCOMMIT
Добавьте (или создайте) это в .git/info/attributes
или .gitmodules
:
file1.c filter=nocommit
И ваши линии NOCOMMIT скрыты от Git.
Предостережения:
- Использование чистого фильтра замедляет обработку файлов, особенно в Windows.
- Пропущенная строка может исчезнуть из файла, когда Git обновляет ее. Его можно противодействовать фильтром размытия, но это сложнее.
- Не тестировалось в Windows
Игнорирование изменений в отслеживаемых файлах. [Заглушка]
.gitignore и .git/info/exclude
работают только для файлов без следа.
Чтобы установить флаг игнорирования в отслеживаемом файле, используйте команду update-index :
git update-index --skip-worktree myfile.c
Чтобы восстановить это, используйте:
git update-index --no-skip-worktree myfile.c
Вы можете добавить этот фрагмент в свою глобальную конфигурацию git, чтобы иметь более удобную git hidden
git hide
, git unhide
и git hidden
команды:
[alias]
hide = update-index --skip-worktree
unhide = update-index --no-skip-worktree
hidden = "!git ls-files -v | grep ^[hsS] | cut -c 3-"
Вы также можете использовать опцию --assume-неизменной с функцией update-index
git update-index --assume-unchanged <file>
Если вы хотите снова просмотреть этот файл для изменений, используйте
git update-index --no-assume-unchanged <file>
Когда задан флаг -измеренный неизмененный, пользователь обещает не изменять файл и позволяет Git предположить, что рабочий файл дерева соответствует тому, что записано в index.Git не удастся, если ему необходимо изменить этот файл в индексе например, при слиянии в фиксации; таким образом, в случае, если файл с необработанной версией изменен вверх по потоку, вам придется обрабатывать ситуацию вручную. В этом случае основное внимание уделяется производительности.
Хотя флаг -skip-worktree полезен, когда вы даете указание git не касаться определенного файла из-за того, что файл будет изменен локально, и вы не захотите случайно зафиксировать изменения (т. Е. Файл конфигурации / свойств, сконфигурированный для определенного среда). Skip-worktree имеет приоритет над принятием-неизменным, когда оба установлены.
Очистить уже зафиксированные файлы, но включенные в .gitignore
Иногда случается, что файл отслеживается git, но в более поздний момент времени был добавлен в .gitignore, чтобы остановить его отслеживание. Очень распространенный сценарий забыть очистить такие файлы до его добавления в .gitignore. В этом случае старый файл все равно будет висящим в репозитории.
Чтобы устранить эту проблему, можно было выполнить «сухое» удаление всего в репозитории, а затем повторное добавление всех файлов обратно. Пока у вас нет ожидающих изменений и --cached
параметр --cached
, эта команда достаточно безопасна для запуска:
# Remove everything from the index (the files will stay in the file system)
$ git rm -r --cached .
# Re-add everything (they'll be added in the current state, changes included)
$ git add .
# Commit, if anything changed. You should see only deletions
$ git commit -m 'Remove all files that are in the .gitignore'
# Update the remote
$ git push origin master
Создать пустую папку
Невозможно добавить и зафиксировать пустую папку в Git из-за того, что Git управляет файлами и прикрепляет к ним свой каталог, который сглаживает и фиксирует скорость. Чтобы обойти это, существует два метода:
Метод первый: .gitkeep
Один хак, чтобы обойти это, - использовать файл .gitkeep
для регистрации папки для Git. Для этого просто создайте требуемый каталог и добавьте файл .gitkeep
в папку. Этот файл пуст и не служит никакой другой цели, кроме как просто зарегистрировать эту папку. Для этого в Windows (который имеет неудобные соглашения об именах файлов) просто запустите git bash в каталоге и запустите команду:
$ touch .gitkeep
Эта команда просто делает пустой файл .gitkeep
в текущем каталоге
dummy.txt
способ: dummy.txt
Другой взлом для этого очень похож на выше, и те же шаги могут быть выполнены, но вместо .gitkeep
просто используйте вместо него dummy.txt
. Это дает дополнительный бонус, позволяющий легко создавать его в Windows с помощью контекстного меню. И вы также можете оставить в них смешные сообщения. Вы также можете использовать файл .gitkeep
для отслеживания пустого каталога. .gitkeep
обычно представляет собой пустой файл, который добавляется для отслеживания пустой строки.
Поиск файлов, игнорируемых .gitignore
Вы можете перечислить все файлы, игнорируемые git в текущем каталоге командой:
git status --ignored
Итак, если у нас есть структура репозитория, вот так:
.git
.gitignore
./example_1
./dir/example_2
./example_2
... и .gitignore файл, содержащий:
example_2
... чем результат команды будет:
$ git status --ignored
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
.example_1
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
dir/
example_2
Если вы хотите перечислить рекурсивно проигнорированные файлы в каталогах, вам нужно использовать дополнительный параметр - --untracked-files=all
Результат будет выглядеть так:
$ git status --ignored --untracked-files=all
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
example_1
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
dir/example_2
example_2