Git-репо с подмодулями не отслеживает локальные изменения?
У меня есть git-репозиторий с 3 подмодулями, например:
foo/ # main repository
bar1/ # submodule1
bar2/ # submodule2
bar3/ # submodule3
Я добавил субмодули сразу после выполнения git init
в основном хранилище:
git submodule add https://github.com/bar1.git bar1
...
Странная вещь сейчас, если я добавлю новый каталог, как foo/test/
Git не отслеживает изменения внутри foo/test/
, Просто меняется прямо внутри foo/
отслеживаются или изменения в подмодулях. Это почему?
Мне кажется, что мерзавец лечит foo/test
как подмодуль, хотя это, конечно, нет.
.Gitignore выглядит так:
.idea/
... который в основном игнорирует скрытый каталог, связанный с проектом IDE.
.gitmodules выглядит так:
[submodule "bar1"]
path = bar1
url = https://github.com/...
[подмодуль "bar2"] path = bar2 url = https://github.com/... [submodule "bar3"] path = bar3 url = https://github.com/...
Должен ли я вручную сказать, что Git foo/test/
должен оставаться внутри основного репозитория и что это не подмодуль?
2 ответа
Я только что нашел проблему. Я не знаю почему, но мой git-config был испорчен.
Делать простой git config --list
(Внутри foo/
) показал, что core.worktree
был неправ:
core.worktree=../../../bar1
Я не могу вспомнить изменение конфигурации вручную. Я только что клонировал свежую копию своего хранилища, обновил подмодули и скопировал мои новые изменения foo/test/
в недавно клонированный репо. Теперь все работает.
Я предполагаю, что единственный вопрос - как я мог испортить git config "old/bugged" репо по ошибке...
В папке Foo у вас будет .git
папка, которая является хранилищем git для foo. С подмодулями, когда вы делаете git submodule add bar1
это создает .git
папка в bar1, когда она проверяется.
Когда вы фиксируете изменения в foo, включая подмодули, git знает (я не знаю, как объяснить, как), что есть .git
папка внутри bar1, и, следовательно, это собственный репозиторий. Если это зарегистрировано как подмодуль в .gitmodules
файл, затем он получит самый последний хеш подмодуля и зафиксирует его вместо папки (вы сможете увидеть его в Github или любом другом менеджере, который вы используете, если щелкнуть по папке, он загрузит файл с хэш). Вот как git submodule init
а также git submodule update
Команды знают, на какую точку проверять.
Любая другая папка, которая не является подмодулем (и поэтому не содержит .git
внутри него) рассматривается как часть родительского хранилища, в данном случае foo. Вы не должны сказать, что мерзавец foo/test
является частью основного хранилища, он знает, что это уже.