В мире Java я бы не пытался решить эту проблему, используя только систему контроля версий - вместо этого я бы использовал инструмент управления зависимостями, такой как Maven + система контроля версий.
В месте, где я работаю, у нас есть настройка, которая кажется довольно распространенной:
Любой "каркасный" проект живет в своей собственной структуре каталогов (ствол, теги, ветви), как вы, похоже, уже это сделали. Они также управляются с помощью Maven, и всякий раз, когда что-то регистрируется, новая версия компонента (в большинстве случаев JAR-файл) публикуется в нашем локальном репозитории Maven (который находится на сервере Nexus).
Любой проект, которому необходимо использовать «каркасный» проект, будет зависеть от конкретной версии каркасного проекта - Maven затем автоматически извлекает эту версию с сервера Nexus всякий раз, когда проект собирается.
Это позволяет нам выпускать каждый проект и компонент фреймворка отдельно, но при этом отслеживать зависимости между ними. Мы даже можем иметь несколько версий компонентов инфраструктуры, используемых в разных проектах, не теряя при этом всех зависимостей.
Пока что это хорошо сработало для нас - я вижу только два недостатка:
Настройка требует времени, особенно если вы раньше не использовали Maven.
Существуют некоторые издержки при выпуске каждого проекта, так как вы также хотите освободить каждый зависимый компонент, чтобы избежать зависимости от "магистральной" версии других компонентов (то есть версии "SNAPSHOT" в терминологии Maven).