2009-03-05 102 views
35

我有两个子目录每一个回购协议,即:我可以将.git目录中的回购库移动到其父目录吗?

PPP/ 
|--ABC/ 
| |--.git/ 
| |--AAA/ 
| | BBB/ 
| | CCC/ 
| 
|--DEF/ 
| |--.git/ 
| |--DDD/ 
| |--EEE/ 

,并想将它们组合成一个回购协议,所以,我将承担目录结构会是这样:

PPP/ 
|--.git/ 
|--ABC/ 
| |--AAA/ 
| |--BBB/ 
| |--CCC/ 
| 
|--DEF/ 
| |--DDD/ 
| |--EEE/ 

这是可行吗?

目前还有几个人在他们的机器上有回购。这会让生活变得多复杂?

Ta。

+0

请参阅[合并多个git存储库](http://stackoverflow.com/questions/277029/combining-multiple-git-repositories)。 – 2009-03-05 14:29:31

回答

42

你可以做你的描述是这样的:

  1. 移动的ABC内容到ABC/子目录,并修复历史记录,因此它看起来像它一直存在:

    $ cd /path/to/ABC 
    $ git filter-branch --index-filter \ 
        'git ls-files -s | sed "s-\t-&ABC/-" | 
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
        git update-index --index-info && 
        mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD 
    

    现在你的目录结构ABC/ABC/your_code

  2. 同为中内容:

    $ cd /path/to/DEF 
    $ git filter-branch --index-filter \ 
        'git ls-files -s | sed "s-\t-&DEF/-" | 
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
        git update-index --index-info && 
        mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD 
    

    现在你的目录结构DEF/DEF/your_code

  3. 最后,创建PPP库和拉两种ABCDEF进去:

    $ mkdir /path/to/PPP 
    $ cd /path/to/PPP 
    $ git init 
    $ git pull /path/to/ABC 
    $ git pull /path/to/DEF 
    

    现在你有PPP/ABC/your_codePPP/DEF/your_code,沿与所有的历史。

你应该问你的同事在他们的系统上运行以前的命令,为了让每个人都同步。

注:时髦filter-branch命令come from the man page。 :-)

+2

请注意,这只会更新每个子项目中的当前检出分支,并且只会将这些分支拉入新的回购。 – 2010-08-26 01:52:16

0

对我来说,看起来很难做到你想要的样子,因为两个项目的历史不会合并。

我最好的建议是创建一个新的存储库来包含ABC和DEF,保持这两个旧的回购有历史备份,并启动这个新项目的新历史。

5

您是否真的需要将两个现有存储库合并到一个存储库中,还是只想对它们进行分组?

如果你只是想对它们进行分组,那么git-submodule会做你想做的事情:最终你会得到三个仓库,其中最高级的仓库链接到当前的仓库。

作为指导:

  • 你应该把它们合并成一个资料库,如果你要增加它们之间的耦合,使其不再有意义使用回购A的一个版本了不同版本的回购B.

  • 如果它们保持某种程度上的独立性(有时对单独工作有意义),您应该使用子模块,但您希望能够方便地一起使用它们(例如下载两者同时出现,检查点已知良好状态等)。

使用子模块将避免存储库的现有副本出现问题,因为历史记录不会更改。合并它们将创建一个新的历史,从现有分支工作的人员合并他们的变更将更加困难。