.gitignore файлы, добавленные внутри подмодулей Git
Недавно я реорганизовал свои dotfiles, чтобы жить внутри репозитория Git в ~/Dropbox/dotfiles
, и я использую патоген для объединения всех добавлений Vim внутри ~/Dropbox/dotfiles/home/.vim/bundle
. Эти дополнения были добавлены как подмодули Git.
Теперь проблема заключается в том, что когда я запускаю Vim, он автоматически создает документацию для всех аддонов и помещает их в каждый каталог подмодулей. Это добавляет необработанный контент к подмодулям, которые я бы хотел избежать.
[email protected] ~/Dropbox/dotfiles ‹master*› $ git st
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
# (commit or discard the untracked or modified content in submodules)
#
# modified: home/.vim/bundle/fuzzyfinder (untracked content)
# modified: home/.vim/bundle/l9 (untracked content)
# modified: home/.vim/bundle/matchit (untracked content)
# modified: home/.vim/bundle/ruby (untracked content)
# ...
no changes added to commit (use "git add" and/or "git commit -a")
Я попытался добавить файл .gitignore
в корень моего репозитория Git, чтобы игнорировать все папки doc
внутри подмодулей, но это не работает:
home/.vim/bundle/**/doc
Мой вопрос: есть ли способ игнорировать файлы и папки внутри подмодулей Git или, возможно, настроить Vim для создания документации в папке вне репозитория Git?
EDIT: как заметил Рэнди Моррис, это может быть дубликат Генерация тегов в разных местах по патогену
Ответы
Ответ 1
Вы должны добавить .gitignore
в каждый из ваших подмодулей.
Поскольку упомянутые подмодули подобны вложенным репозиториям Git, они заботятся о своих собственных правилах игнорирования, и на их статус не будет влиять .gitignore
родительского репо (как объяснено здесь).
Для параметра, определяющего vim, как Рэнди Моррис упоминает в комментарии, см. вопрос SO Создание тегов для различное местоположение по патогену ".
Примечание: как Nick упоминается в этих комментариях, и, как проиллюстрировано ответом на "Создание тегов для разных местоположение по патогену", такая конфигурация, как:
[submodule "path/to/submodule"]
path = path/to/submodule
url = http://github.com/username/repo.git
ignore = untracked # <====
будет работать и сделать этот подмодуль проигнорированным на git status
.
Но " ignore = untracked
"означает не менее Git1.7.2.
Примечание: nurettin упоминает в комментариях:
ignore = dirty
сделал это для меня
Commit aee9c7d детализирует разницу между untracked
и dirty
.
-
" dirty
": только отличия фиксации, записанной в суперпроекте и подмодулях HEAD
, будут считаться модификациями, все изменения в дереве работ подмодуль будет проигнорирован.
При использовании этого значения подмодуль не будет полностью сканироваться на изменения дерева работ, что приведет к повышению производительности на больших подмодулях.
-
" untracked
": только игнорируемые файлы в дереве обработки подмодулей игнорируются, измененные HEAD
и/или измененные файлы в подмодуле будут отмечать его как измененное.
Ответ 2
Рекомендация VonC ignore = untracked
работает, но вы должны внести изменения для каждого такого подмодуля.
Если вы хотите решить проблему раз и навсегда, вы можете настроить глобальный шаблон gitignore для каждого репозитория git, git config --global core.excludesfile ~/.gitignore_global
, а затем просто добавить doc/tags
в $HOME/.gitignore_global.
См. https://help.github.com/articles/ignoring-files.
Ответ 3
Ответ Бен - хорошее начало. Но для такого конкретного правила игнорирования мне не нравится глобальная настройка.
Предпочитает локальную конфигурацию для каждого подмодуля и централизованный файл игнорирования в корневом репозитории подмодулей:
cd .vim/bundle
echo "doc/tags" > .gitignore_submodules
git submodule foreach git config --local core.excludesfile "../.gitignore_submodules"
Ответ 4
Я думаю, что основная проблема заключается в том, что вы пытаетесь игнорировать "отслеживаемые" изменения. .gitignore
игнорирует только "необработанные" изменения в репо. Чтобы проверить, что вы можете изменить какой-либо файл в своем репо (который отслеживается), а также добавить его в свой .gitignore
файл. При выполнении git status
вы увидите, что файл по-прежнему отображается как "изменен". Репо вашего субмодуля также считается отслеживанным вашим основным репо, поэтому просто добавление gitignore к родительскому репо не будет работать. Как было предложено, добавьте .gitignore
правило отдельного репо или если вы используете последнюю версию git, вы можете использовать git status --ignore-submodules
.