Вы игнорируете подмодуль git в своем.gitignore или делаете это в своем репо?

Я добавил субмодуль в свой проект в project_dir/vendor/submodule_one теперь каждый раз, когда я бегу git status я получил modified: vendor/submodule_one (new commits),

Мой вопрос: как лучше всего с этим справиться? Должен ли я добавить vendor/submodule_oneпапка моя .gitignore как мой основной проект не должен знать о специфике моего подмодуля?

Или когда я изменяю и фиксирую изменения в моем подмодуле, нужно ли мне также делать коммиты в моем основном проекте?

Просто начинаю работать с подмодулями и, похоже, не могу найти много информации помимо их настройки.

1 ответ

Решение

Нет, вам не нужно добавлять свой подмодуль в свой .gitignore: то, что родитель увидит из вашего подмодуля, - это gitlink ( специальная запись, mode 160000).

Это означает: любое изменение, непосредственно сделанное в подмодуле, должно сопровождаться фиксацией в родительском каталоге.
Таким образом, родительский каталог будет записывать правильную фиксацию для состояния подмодуля: эта фиксация является упомянутой выше "gitlink";

Вы можете прочитать больше об этой политике в " git submodule update (истинная природа подмодулей) ".
Основная идея субмодулей - это компонентный подход, когда вы ссылаетесь на другие репозитории при определенных коммитах. Но если вы что-то измените в этих подмодулях, вам также необходимо обновить эти ссылки в родительском репо.


Обратите внимание, что с Git 2.13 (Q2 2017), не игнорируя gitlink, вы все равно можете игнорировать подмодуль с помощью:

git config submodule.<name>.active false

Смотрите больше в " Игнорировать новые коммиты для подмодуля git ".


Примечание: в Git 2.15.x/2.16 (Q1 2018) игнорирование подмодуля является более точным.
" git status --ignored --untracked msgstr "не останавливался на рабочем дереве отдельного проекта, который встроен в игнорируемый каталог и перечислял файлы в этом другом проекте, вместо того, чтобы просто показывать сам каталог как проигнорированный.

См. Коммит fadb482 (25 октября 2017 г.) от Johannes Schindelin ( dscho )
(Объединено Юнио С Хамано - gitster - в коммите da7996a, 06 ноября 2017 г.)

status: не путайте субмодули в исключенных каталогах

Мы тщательно передаем exclude флаг к treat_directory() функция, так что мы можем указать, что файлы в нем исключены, а не отслеживаются при повторении.

Но мы еще не относились к подмодулям одинаково.

Из-за этого, git status --ignored --untracked с подмодулем submodule в одураченном tracked/ покажет субмодуль в Untracked files раздел, например

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

Вместо этого мы бы хотели, чтобы он отображал субмодуль в Ignored files " раздел:

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/

По какой-то причине submodule.module-name.active у меня не работал.

Вот почему я использовал submodule.module-name.ignore

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules - здесь вы можете найти описание возможных значений параметра

У меня работает для сообщений (новые коммиты) и (измененное содержимое).

Чтобы добавить к принятому ответу, я обнаружил, что добавление папки подмодуля Git в.gitignore действительно вызывает проблемы - особенно при попытке создать новый клон проекта. В частности, выполнение обычных команд клонирования подмодуля привело к тому, что папка подмодуля оказалась пустой:

git submodule init
git submodule update
git pull --recurse-submodules

Только попытавшись перезапустить

git submodule add <Git repo> <submodule folder>

было ясно, в чем проблема, исходя из вывода:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

Вместо добавления -f, Я удалил папку подмодуля Git из.gitignore и повторно выполнил команды клонирования подмодуля, которые теперь успешно создали папку. Я думаю, что может быть ошибка в том, что одна из команд клонирования подмодуля уважает.gitignore, но не предупреждает, что она соответственно пропускает подмодуль.

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