Файлы .gitignore добавлены в подмодули Git - PullRequest
56 голосов
/ 26 февраля 2011

Я недавно реорганизовал свои точечные файлы, чтобы они жили в репозитории 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 ]

68 голосов
/ 26 февраля 2011

Вы должны добавить .gitignore в каждый из ваших подмодулей.
Поскольку указанные подмодули похожи на вложенное Git-репо, они заботятся о своих собственных правилах игнорирования, и на их статус не влияет .gitignore родительского репо (как объяснено здесь ).

Для настройки vim, о которой упоминает Рэнди Моррис в комментарии, см. Вопрос SO " Создание тегов в разных местах по патогену ".


Примечание: как Ник упоминает в этих комментариях, и как показано в ответе на " Генерация тегов в разных местах по патогену ", такая конфигурация:

[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 и / или измененные файлы в подмодуле помечают его как измененный.

8 голосов
/ 20 февраля 2012

Рекомендация VonC ignore = untracked работает, но вы должны внести изменения для каждого такого подмодуля.

Если вы хотите решить проблему раз и навсегда, вы можете настроить глобальный шаблон gitignore для каждого репозитория git с помощью git config --global core.excludesfile ~/.gitignore_global, а затем просто добавить doc/tags в $ HOME / .gitignore_global.

См. https://help.github.com/articles/ignoring-files.

2 голосов
/ 18 июня 2014

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

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

cd .vim/bundle
echo "doc/tags" > .gitignore_submodules
git submodule foreach git config --local core.excludesfile "../.gitignore_submodules"
0 голосов
/ 04 мая 2011

Я думаю, что основная проблема здесь в том, что вы пытаетесь игнорировать «отслеживаемые» изменения. .gitignore игнорирует только «неотслеживаемые» изменения в репо. Чтобы убедиться, что вы можете изменить какой-то файл в вашем репо (который отслеживается), а также добавить его в ваш .gitignore файл. При выполнении git status вы увидите, что файл по-прежнему указан как «измененный». Ваши репо субмодулей также считаются отслеженными вашим основным репозиторием, поэтому простое добавление gitignore к родительскому репо не будет работать. Как и предполагалось, либо добавьте .gitignore правила отдельных репо, либо, если вы используете последнюю версию git, вы можете использовать git status --ignore-submodules.

...