Поиск…


Вступление

В этом разделе показано, как избежать добавления нежелательных файлов (или изменений файлов) в репозитории Git. Существует несколько способов (глобальный или локальный .gitignore , .git/exclude , git update-index --assume-unchanged и git update-index --skip-tree ), но имейте в виду, что Git управляет контентом , что означает: игнорирование фактически игнорирует содержимое папки (то есть файлы). По умолчанию пустая папка будет проигнорирована, так как она не может быть добавлена ​​в любом случае.

Игнорирование файлов и каталогов с помощью файла .gitignore

Вы можете заставить Git игнорировать определенные файлы и каталоги, то есть исключить их от отслеживания Git - путем создания одного или нескольких файлов .gitignore в вашем репозитории.

В проектах программного обеспечения .gitignore обычно содержит список файлов и / или каталогов, которые генерируются во время процесса сборки или во время выполнения. Записи в файле .gitignore могут включать имена или пути, указывающие на:

  1. временные ресурсы, например, кэши, файлы журналов, скомпилированный код и т. д.
  2. файлы локальной конфигурации, которые не должны использоваться совместно с другими разработчиками
  3. файлы, содержащие секретную информацию, такие как пароли входа, ключи и учетные данные

При создании в каталоге верхнего уровня правила будут применяться рекурсивно ко всем файлам и подкаталогам во всем репозитории. При создании в подкаталоге правила будут применяться к этому конкретному каталогу и его подкаталогам.

Когда файл или каталог игнорируются, это не будет:

  1. отслеживается Git
  2. сообщается командами, такими как git status или git diff
  3. с такими командами, как 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, которые вы можете использовать:

Выпадающее меню GitHub .gitignore

Игнорирование последующих изменений в файле (без его удаления)

Иногда вы хотите иметь файл, хранящийся в 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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow