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