Я думаю, что проблема заключается в несоответствии между дизайном Git и проблемой, которую вы хотите решить.
Git хорош для отслеживания деревьев. Отношения зависимости между проектами могут (и, вероятно, могут) сформировать График. Дерево - это граф, но граф не обязательно является деревом. Поскольку ваша проблема заключается в том, как эффективно представлять график, дерево - не лучший инструмент для работы.
Вот подход, который может работать:
В git-проекте есть каталог .gitmodules, в который записываются «подсказки», в которых указывается, от каких проектов может зависеть коммит, где их можно найти и по какому пути в проекте они будут вставлены. (http://osdir.com/ml/git/2009-04/msg00746.html)
Вы можете добавить скрипт, который считывает эту информацию из набора проектов, сопоставляет подсказки, найденные в файле .gitmodules каждого проекта, с местами в файловой системе, где эти проекты были фактически размещены, а затем добавляет символические ссылки из путей где git ожидает извлечения субмодулей для фактических расположений файловой системы соответствующих проектов.
Этот подход использует символические ссылки, чтобы вырваться из формы дерева и построить график. Если мы будем записывать ссылки непосредственно в репозитории git, у нас будут относительные пути, специфичные для нашей локальной установки, записанные в отдельных проектах, и проекты не будут «полностью независимыми», как вы хотели. Следовательно, скрипт для динамического построения символических ссылок.
Я думаю, что этот подход может мешать git нежелательным образом, так как мы выбрали пути, где он ожидает найти что-то одно, и вместо этого поместили что-то другое. Может быть, мы могли бы .gitignore пути символической ссылки. Но теперь мы дважды пишем эти пути и нарушаем СУХОЙ. На данный момент мы также довольно далеко от притворства использовать подмодули. Мы можем записать зависимости в другом месте каждого проекта и оставить файл .gitmodules для того, что ожидает git. Итак, мы создадим наш собственный файл, скажем, .dependencies, и каждый проект может указать там свои зависимости. Наш скрипт тут же будет искать и создавать свои символические ссылки.
Хм, думаю, я только что описал специальную систему управления пакетами с собственным облегченным форматом пакетов:)
Мне кажется, что предложение megamic хорошо подходит для использования подмодулей git. Мы имеем дело только с отслеживанием набора здесь, а не графика, и набор легко вписывается в дерево. Дерево глубиной в один уровень по сути является родительским узлом и набором дочерних узлов.
Как вы указали, это не полностью решает проблему, указанную в вашем вопросе. Мы можем выделить два разных типа информации «это работает с нами», в которой мы, вероятно, заинтересованы:
1. Заявление из версии проекта (предположительно автором проекта), в котором говорится: «Мне нужна версия X проекта Y»
2. Заявление, используемое вашей собственной установкой сборки: «Я успешно протестировал всю нашу систему, используя этот набор версий проекта»
ответ megamic решен (2), но для (1) мы все еще хотим, чтобы проекты сообщали нам, каковы их зависимости. Затем мы можем использовать информацию из (1) для вычисления тех наборов версий, которые мы в итоге запишем как (2). Это достаточно сложная проблема, чтобы гарантировать собственный инструмент, который возвращает нас к системам управления пакетами:)
Насколько я знаю, большинство хороших инструментов управления пакетами созданы для пользователей определенного языка или операционной системы. Смотрите Bundler для пакетов 'gem' в мире ruby и подходите для пакетов '.deb' в мире Debian.
Если кто-нибудь знает хорошее, не зависящее от языка, не зависящее от ОС решение для этого, которое хорошо подходит для программных проектов «полиглот» (http://blog.heroku.com/archives/2011/8/3/polyglot_platform/), я был бы очень заинтересован! Я должен опубликовать это как вопрос.