Это не встроено в git, но вы определенно можете сделать это с помощью символических ссылок, как вы говорите.Возможно, вы захотите взглянуть на git new-workdir
(из каталога contrib git), что по сути и делает это.Он не знает ничего общего с подмодулями, но подмодуль не знает, что это подмодуль - это родительское репо, которое знает об этом.Я не пробовал это, но я вполне уверен, что вы могли бы использовать это как-то так:
# remove the target first (new-workdir will refuse to overwrite)
rm -rf submodule_b/submodule_m
# (original repo) (symlinked repo)
git new-workdir submodule_a/submodule_m submodule_b/submodule_m
Это работает путем символической ссылки по существу всего каталога .git;заметная вещь, которая не является символической ссылкой, это HEAD
;в двух каталогах можно проверить разные вещи, но использовать одни и те же ссылки и объекты.
Отсюда вам должно быть хорошо.Когда вы запускаете команду git submodule
в супермодуле, она просто переходит в подмодули и запускает там соответствующие команды, которые будут работать как положено.
Одна вещь, которую вы обычно должны знать о репозиториях с символическими ссылкаминапример, они используют один и тот же набор ветвей, поэтому, если у них обоих отмечена одна и та же ветка, и вы фиксируете ее в одной, другая станет не синхронизированной.С субмодулями это, как правило, не будет проблемой, поскольку они, по сути, всегда находятся в отключенном состоянии HEAD, если вы не вмешиваетесь.