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 является частью основного хранилища, он знает, что это уже.

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