Файлы.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.

Смотрите https://help.github.com/articles/ignoring-files.

Ответ Бена - хорошее начало. Но для такого конкретного правила игнорирования мне не нравятся глобальные настройки.

Предпочитайте локальную конфигурацию для каждого подмодуля и централизованный файл игнорирования в корневом хранилище подмодуля:

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,

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