我可以将.git目录移动到它的父目录吗?

时间:2009-03-05 10:20:51

标签: git merge directory subdirectory

我有两个子目录,每个子目录都有一个repo,因此:

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

并希望将它们合并为一个仓库,因此,我认为目录结构将是这样的:

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

这是可能的吗?

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

的Ta。

3 个答案:

答案 0 :(得分:44)

你可以像这样做你所描述的:

  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. DEF的内容相同:

    $ 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以及所有历史记录。

  4. 您可能会要求同事在他们的系统上运行以前的命令,以便每个人都能同步。

      

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

答案 1 :(得分:5)

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

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

作为指南:

  • 如果要增加它们之间的耦合,则应将它们合并到一个存储库中,以便使用一个版本的repo A与不同版本的repo B不再有意义。

  • 你应该使用子模块,如果它们在某种程度上是分开的(有时可以单独处理它们),但是你希望能够方便地使用它们(例如,同时下载两个,检查点)两者之间的已知良好状态等。)

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

答案 2 :(得分:0)

对我而言,似乎很难以你想要的方式去做,因为两个项目的历史都不会合并。

我最好的建议是创建一个包含ABC和DEF的新存储库,保留这两个存储库中的旧存储库以进行历史记录备份并使用这个新项目开始新的历史记录。