.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.