Вы игнорируете подмодуль 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, но не предупреждает, что она соответственно пропускает подмодуль.