Dış svn git submodule

2 Cevap php

Diyelim ki 3 git depoları, kök bir lib ile her ve tests klasör var diyelim. Her 3 depoları ancak ayrı depoları tutmak benim için önemli, ben tek bir paket olmak istiyorum ne bir parçasıdır.

Ben svn gelen git'e yeni am, bu yüzden submodules üzerinde okuma ve nasıl svn:externals farklılık olmuştur. SVN'de Ben bir tek olabilir

lib/vendor/package

dizin ve iç package Ben kurulum uygun gibi yeniden adlandırarak, benim 3 depoları lib dizin her işaret 3 Externals olabilir

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

ama benim anlayış bu git ile mümkün değildir. Ben bir şey eksik?

Gerçekten ben bu iki yoldan biriyle çözülebilir umuyorum.

  1. Birisi bir a, b olabilir nerede (yukarıda belirttiğim gibi submodüller organize olarak diğer 3 olan 4 git depo oluşturmak için nasıl işaret ve {[(edecek kök içinde 2)]} klasörü)
  2. Birisi her git depo içindeki lib dizini (benim anlayış bu imkansız) başvurarak, githubs svn desteği ile birlikte svn:externals kullanarak bu nasıl kuracağınızı işaret edecek

Update:

Ben aslında altmodüller size bağlı öğretici takip etmeye çalıştı, ama ben şu sorun haline çalıştırın.

Yerine gibi bir eşleme, yukarıda gösterildiği gibi şeyler yapıyor

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

Ben sol am

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

Bu erişim ClassA repo1 's lib klasör yolu iç şimdi beri ideal değildir

lib/vendor/package/a/lib/ClassA

Gerçekten almak için çalışıyorum (: formaliteler ve bu svn ile mümkündür) olduğunda

lib/vendor/package/a/ClassA

a Yukarıdaki aslında beri repo1/lib, ve değil kök dizin repo1.

Böyle bir şey PHP5.3, örneğin, (http://gist.github.com/221634), bu gibi bir ad-dizin eşleme gerektiren SplClassLoader kullanarak, beri önemli

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

Bu benim kavramsal yanlış anlaşılma nasıl 4 git depo izin vermek için bu kurulum için, nerede olduğunu yukarıdaki gibi benim dizin dönüşümler.

2 Cevap

Sen Git submodules doğrudan tam olarak ne istediğinizi yapamazsınız, doğru. Bir depo, şube, ve herhangi bir alt kök bunların nesne aynı tür çünkü SVN çalışır. Git, bir depo, bir şube ve bir dizin tüm nesneleri farklı türü (tam bir depo olarak veya bir dalı olarak bir dizin kullanamazsınız) vardır.

Eğer rağmen istediğinizi gerçekleştirmek için dolaylı yollar bir çift vardır.

Using Submodules and Symlinks

The core of a Git submodule is a clone of another repository in the work tree of the “superproject”*. Git only clones full repositories. It is not possible to clone just a single subdirectory out of an existing repository.

* Normal submodules also require a special reference in the superproject's commits/index and (normally) an entry in the superproject's .gitmodules file. It is possible to have non-tracked clones of other repositories in an unrelated working tree, but such usage does not create a submodule.
Git 1.7.0 and later has a “sparse checkout” feature, but it would not help to relocate the lib directory the top level of each submodule clone.

Bununla birlikte oldukça yakın bir şey yapmak için sembolik bağlantılar için GYTE desteğini kullanmak mümkün olabilir:

#
# 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

Using git subtree

apenwarr en git subtree can split off and merge parts of repositories (i.e. individual subdirectories; it is a wrapper around “subtree merging” diğer güzel özellikleri ile). İlk adım, alt projelerin her lib tarihini ayıklamak olacaktır. Sonra, doğrudan bir altmodülün olarak çıkarılan geçmişini kullanmak, ya git subtree alt ağaç ana depoya birleştirme yapmak için kullanabilirsiniz. Eğer ana depo içine bir alt proje değişiklikleri entegre edemeden ya da yolu, bu fazladan bir adım (re-ayıklanan lib tarih) tanıtmak istiyorum.

Sen ile, ileri 'lib' ana Git repo olabilir:

Ama bu referans herhangi tamamen bağımsızdır 'svn: Harici' özelliği bir ayna SVN repo kurulum olabilir.

Zaten 3 SVN repo varsa Yani, ({[aşağıdaki git-svn onları, GitHub onları yayımlamak ve sonra submodüller gibi bu 3 Git repo katacak hangi GitHub dördüncü repo oluşturmak can 1)]} () Eğer GitHub zaten 4 repo var burada varsayılarak

$ 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