Файлы.gitignore добавлены в подмодули Git
Я недавно реорганизовал мои точечные файлы, чтобы жить в репозитории Git на ~/Dropbox/dotfiles
и я использую патоген для связывания всех аддонов Vim внутри ~/Dropbox/dotfiles/home/.vim/bundle
, Эти дополнения были добавлены как подмодули Git.
Теперь проблема в том, что когда я запускаю Vim, он автоматически генерирует документацию для всех дополнений и помещает их в каждый каталог подмодулей. Это добавляет неотслеживаемый контент в подмодули, чего я хотел бы избежать.
ruby-1.8.7-p330@gs ~/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?
РЕДАКТИРОВАТЬ: как указал Рэнди Моррис, это может быть дубликатом генерации тегов в разных местах по патогену
4 ответа
Вы должны добавить .gitignore
в каждом из ваших подмодулей.
Поскольку указанные субмодули похожи на вложенное Git-репо, они заботятся о своих собственных правилах игнорирования, и их статус не будет зависеть от .gitignore
родительского репо (как описано здесь).
Для настройки vim, как упоминает Randy Morris в комментарии, см. SO вопрос " Генерация меток в разных местах по патогенам ".
Примечание: как упоминает Nick Zalutskiy в этих комментариях, и как показано в ответе на " Создание тегов в разных местах по патогенам ", конфигурация выглядит так:
[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
сделал это для меня
Зафиксируйте aee9c7d подробно разницу между untracked
а также dirty
,
"
dirty
": Только различия фиксации, записанные в суперпроекте и субмодуляхHEAD
будут считаться изменениями, все изменения в рабочем дереве подмодуля будут игнорироваться.
При использовании этого значения подмодуль вообще не будет сканироваться на предмет изменений рабочего дерева, что приведет к повышению производительности на больших подмодулях."
untracked
": Только неотслеживаемые файлы в рабочем дереве подмодулей игнорируются, измененоHEAD
и / или измененные файлы в подмодуле пометят его как измененный.
Рекомендация VonC о ignore = untracked
работает, но вы должны внести изменения для каждого такого подмодуля.
Если вы хотите решить проблему раз и навсегда, вы можете настроить глобальный шаблон gitignore для каждого git-репо, выполнив git config --global core.excludesfile ~/.gitignore_global
затем просто добавьте doc/tags
в $HOME/.gitignore_global.
Ответ Бена - хорошее начало. Но для такого конкретного правила игнорирования мне не нравятся глобальные настройки.
Предпочитайте локальную конфигурацию для каждого подмодуля и централизованный файл игнорирования в корневом хранилище подмодуля:
cd .vim/bundle
echo "doc/tags" > .gitignore_submodules
git submodule foreach git config --local core.excludesfile "../.gitignore_submodules"
Я думаю, что основная проблема здесь в том, что вы пытаетесь игнорировать "отслеживаемые" изменения. .gitignore
игнорирует только "неотслеживаемые" изменения в репо. Чтобы убедиться, что вы можете изменить какой-то файл в вашем репо (который отслеживается), а также добавить его в свой .gitignore
файл. Делать git status
вы увидите, что файл по-прежнему указан как "измененный". Ваши репо субмодулей также считаются отслеженными вашим основным репозиторием, поэтому простое добавление gitignore к родительскому репо не будет работать. Как и предполагалось, либо добавьте .gitignore
правила отдельных репо или, если вы используете последнюю версию GIT, вы можете использовать git status --ignore-submodules
,