2014-09-23 20 views
0

我有3个类似的组织和一些重复的目录之间的git回购。他们是一个大项目的子项目。Git。如何使共享目录而不是重复?

Proj1/ 
    .git/ 
    feature1_lib/ 
    feature1_app/ 
    feature1/  <- specific to Proj1 

    feature2_lib/ 
    ... 

Proj2/ 
    .git/ 
    feature1_lib/ 
    feature1_app/ 
    feature1/  <- specific to Proj2 

    feature2_lib/ 
    ... 

Proj3/ 
    .git/ 
    feature1_lib/ 
    feature1_app/ 
    feature1/  <- specific to Proj3 

    feature3_lib/ <- specific to Proj3 
    feature3_app/ <- specific to Proj3 
    feature3/  <- specific to Proj3 
    ... 

它们是同时开发的,但历史略有不同。

Proj1/ 
     ... 
     commit4 "Commit specific to Proj1." 
     commit5 "Add code to feature1_lib." 
     commit6 "Fix bugs in feature1_lib." 
     commit7 "Refactoring in feature1_lib." 
     ... 

Proj2/ 
     ... 
     commit6 "Import changes from Proj1." <- after commit7 in Proj1 
     commit7 "Commit specific to Proj2." 
     commit8 "Fix bugs in feature2_lib." 
     commit9 "Add code to feature2_lib." 
     ... 

等。

现在我正在寻找切割和粘贴重复部分的选项。我认为它应该看起来像这样

Proj1_2_common/ 
    .git/ 
    ... 
Proj1_2_3_common/ 
    .git/ 
    ... 
Proj1/ 
    .git/ 
    ... 
Proj2/ 
    .git/ 
    ... 
Proj3/ 
    .git/ 
    ... 

我读了关于子树和子模块,但没有完全理解。为什么我必须创建子树,如果我可以将我的项目指向特定目录?也就是说,我可以简单地重新配置我的项目以查看"Proj1_2_3_common/feature1_lib/",而不是从"feature1_lib/"制作子树。

那么从你的观点来看,这里有什么更好的选择?什么是最简单的?如何处理这种混乱的历史,在移动之后有一些参考?

回答

2

您应该以其他方式管理应用程序:

  1. 为每个项目创建一个存储库
Proj1/ 
    .git 
Proj2/ 
    .git 
Proj3/ 
    .git 
  • 创建一个存储库所有模块/功能
  • ProjModules/ 
        .git 
        feature1/ 
        feature2/ 
        feature3/ 
    
  • 使用Git的子模块,包括你的3个项目的功能:
  • Proj1/ 
        .git 
        .gitmodules 
        vendor/ 
        ProjModules/ 
    Proj2/ 
        .git 
        .gitmodules 
        vendor/ 
        ProjModules/ 
    Proj3/ 
        .git 
        .gitmodules 
        vendor/ 
        ProjModules/ 
    

    然后,您可以在Proj1/vendor/ProjModules进行修改和传播这些变化在Proj2/Proj3/

    $ cd /Proj1/vendor/ProjModules/ 
    $ touch newfile.txt 
    $ git add --all 
    $ git commit -m "New file !!" 
    $ git push origin master 
    
    $ cd ../../../Proj2/vendor/ProjModules/ 
    $ git submodule foreach git pull 
    
    $ cd ../../../Proj3/vendor/ProjModules/ 
    $ git submodule foreach git pull 
    

    另一个想法是创建一个代表每个模块的ository。这将允许你只导入你需要的。

    +0

    '''我拥有它。 ''我需要从原始回购中删除它。 '3.为什么子模块在这里更好?历史呢? – LVitya 2014-09-23 09:54:18

    +0

    @LVitya通过子模块,对'*/vendor/ProjModules'所做的更改将受到ProjModules项目历史的影响。这与如果您切换到“ProjModules”进行更改,然后切换回“Proj *”以提取这些更改的行为相同。从现在开始,'ProjModules'历史属于'ProjModules'项目,'Proj *'历史属于'Proj *'项目。 – zessx 2014-09-23 09:58:47

    +0

    与subtree有什么区别?如何保存以前的分离目录更改历史记录? – LVitya 2014-09-23 11:01:56

    相关问题