подмодуль git svn external - PullRequest
       13

подмодуль git svn external

3 голосов
/ 21 мая 2010

Допустим, у меня есть 3 репозитория git, каждый с папкой lib и tests в корне. Все 3 репозитория являются частью того, что я хочу сделать одним пакетом, однако для меня важно хранить репозитории отдельно.

Я новичок в git из svn, поэтому я читал о submodules и чем они отличаются от svn:externals. В SVN у меня может быть один

lib/vendor/package
Каталог

и внутри package Я мог бы установить 3 внешних объекта, указывающих на каждый из моих каталогов lib из 3 репозиториев, переименовывая его соответствующим образом, как

lib/vendor/package/a  -> repo1/lib
lib/vendor/package/b  -> repo2/lib
lib/vendor/package/c  -> repo3/lib

но, насколько я понимаю, это невозможно с помощью git. Я что-то упустил?

Действительно, я надеюсь, что это можно решить одним из двух способов.

  1. Кто-то укажет, как создать 4-й git-репозиторий, в котором остальные 3 имеют подмодули, организованные, как я упоминал выше (где я могу иметь папки a, b и c внутри корня)
  2. Кто-то укажет, как настроить это, используя svn:externals в сочетании с поддержкой githubs svn, ссылаясь на каталог lib в каждом репозитории git (насколько я понимаю, это невозможно)

Обновление:

На самом деле я пытался следовать учебнику по подмодулям, с которым вы связаны, но столкнулся со следующей проблемой.

Делать вещи, как показано выше, вместо отображения как

lib/vendor/package/a  -> repo1/lib
lib/vendor/package/b  -> repo2/lib
lib/vendor/package/c  -> repo3/lib

Я остался с

lib/vendor/package/a  -> repo1
lib/vendor/package/b  -> repo2
lib/vendor/package/c  -> repo3

это не идеально, так как теперь для доступа к ClassA внутри repo1 lib папка, путь

lib/vendor/package/a/lib/ClassA

когда я действительно пытаюсь получить (и это возможно с svn: externals)

lib/vendor/package/a/ClassA

, поскольку a выше на самом деле repo1/lib, а не корневой каталог repo1.

Нечто подобное важно, поскольку, например, с PHP5.3, используя SplClassLoader (http://gist.github.com/221634), требуется отображение пространства имен в каталог, например

\Package\a\ClassA  -> lib/vendor/package/a/ClassA

Здесь мое концептуальное недоразумение заключается в том, как настроить этот 4-й репозиторий git, чтобы разрешить сопоставления моих каталогов, как указано выше.

Ответы [ 2 ]

3 голосов
/ 22 мая 2010

Вы правы, подмодули Git не могут напрямую делать именно то, что вы хотите.Он работает в SVN, потому что корень хранилища, ветви и любой его подкаталог являются объектами одного типа.В Git репозиторий, ветвь и каталог - это разные виды объектов (вы не можете использовать каталог как полный репозиторий или как ветвь).

Существует несколько косвенных способов выполнениячто вы хотите.

Использование подмодулей и символических ссылок

Ядром подмодуля Git является клон другого хранилища в рабочем дереве «суперпроекта» *.Git только клонирует полные репозитории.Невозможно клонировать только один подкаталог из существующего репозитория .

* Обычные подмодули также требуют специальной ссылки в коммитах / индексе суперпроекта и(обычно) запись в файле .gitmodules суперпроекта.Возможно наличие не отслеживаемых клонов других репозиториев в несвязанном рабочем дереве, но такое использование не создает подмодуль.
Git 1.7.0 и более поздних версий имеет функцию «разреженного извлечения», но это не поможет переместить каталог lib на верхний уровень каждого клона подмодуля.

Однако вы можете использовать поддержку Git для символических ссылок для выполнения чего-то, что достаточно близко:

#
# Make the lib directory of each submodule appear in the superproject as
# lib/vendor/packages/$submod_name
#
# With this structure in each of the submodules (a, b, c):
#
#    lib/
#    tests/
#
# We end up with this structure in the superproject:
#
#    lib/
#        vendor/
#            packages/
#                a     (a symlink to ../../../_submodules/a/lib)
#                b     (a symlink to ../../../_submodules/b/lib)
#                c     (a symlink to ../../../_submodules/c/lib)
#    _submodules
#        a/            (a Git submodule)
#            lib/
#            tests/
#        b/            (a Git submodule)
#            lib/
#            tests/
#        c/            (a Git submodule)
#            lib/
#            tests/
#
add_one() {
    dir=lib/vendor/package
    dest="$dir/$1"
    # use fewer ".."s to put the _submodules closer to the symlinks
    s=../../../_submodules/"$1"
    git submodule add "$2" "$dir/$s"
    ln -s "$s"/lib "$dest"
    git add "$dest"
}

cd "$main_repo_toplevel"
mkdir -p lib/vendor/package
add_one a git@githost.example.com:user/package-a.git
add_one b git://public.example.com/work/package-b-dev.git
add_one c ssh://special.example.com/foo.git

Использование git поддерева

apenwarr git поддерева может разделять и объединять части репозиториев (то есть отдельные подкаталоги;это обертка вокруг «объединение поддеревьев» с другими приятными функциями).Первым шагом будет извлечение истории lib в каждом из ваших подпроектов.Затем либо непосредственно используйте извлеченную историю в качестве подмодуля, либо используйте git subtree , чтобы выполнить слияние поддерева с вашим главным репозиторием.В любом случае, это приведет к дополнительному шагу (повторное извлечение истории lib), прежде чем вы сможете интегрировать изменения из подпроекта в ваш основной репозиторий.

0 голосов
/ 21 мая 2010

Вы можете получить четвертое главное Git-репозиторий 'lib' с:

Но эта ссылка полностью независима от любого свойства 'svn: external', которое вы можете настроить в зеркальном репозитории SVN.

Так что, если у вас уже есть 3 репо SVN, вы можете git-svn их опубликовать на GitHub, а затем создать четвертое репо на GitHub, в которое вы добавите эти 3 репозитория Git в виде подмодулей, следуя подмодулям учебник (предположим, что у вас есть все 4 репозитория на GitHub)

$ mkdir -p lib/vendor/package
$ cd lib/vendor/package
$ for package in a b c d; do
$ git submodule add git://github.com/path/to/$package.git $package
$ done
$ cd ..
$ git commit -m "lib with submodules"
$ git push
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...