关于合并:我可以将repo的.git目录移动到其父目录吗?

Can I move the .git directory for a repo to it's parent directory?

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

1
2
3
4
5
6
7
8
9
10
11
PPP/
 |--ABC/
 |   |--.git/
 |   |--AAA/
 |   |    BBB/
 |   |   CCC/
 |  
 |--DEF/
 |   |--.git/
 |   |--DDD/
 |   |--EEE/

并希望将它们组合成一个repo,因此,我假设目录结构如下:

1
2
3
4
5
6
7
8
9
10
PPP/
 |--.git/
 |--ABC/
 |   |--AAA/
 |   |--BBB/
 |   |--CCC/
 |  
 |--DEF/
 |   |--DDD/
 |   |--EEE/

这是可行的吗?

另外,目前有几个人在他们的机器上有回购协议。那会使生活变得多复杂?

助教。


你可以这样描述:

  • ABC的内容移动到ABC/子目录,并修复历史记录,使其看起来一直存在:

    1
    2
    3
    4
    5
    6
    $ 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

  • DEF的内容相同:

    1
    2
    3
    4
    5
    6
    $ 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

  • 最后,创建PPP存储库,并将ABCDEF拉入其中:

    1
    2
    3
    4
    5
    $ 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,以及所有的历史。

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

    Note: the funky filter-branch commands come from the man page. :-)


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

    如果您只想将它们分组,那么git子模块将做您想要做的:您最终将得到三个存储库,其中顶层的一个链接到当前的两个存储库。

    作为指南:

    • 如果要增加它们之间的耦合度,那么应该将它们合并到一个单独的存储库中,这样使用一个版本的repo A和另一个版本的repo B就不再有意义了。

    • 如果子模块保持一定的独立性,则应该使用子模块(有时单独使用其中一个是有意义的),但您希望能够方便地与它们一起工作(例如,一次下载两个模块,检查点知道两个模块之间的良好状态等)。

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


    对我来说,似乎很难按照你想要的方式去做,因为这两个项目的历史不会合并。

    我最好的建议是创建一个新的存储库来包含ABC和DEF,让这两个库中的旧repo保持历史备份,并用这个新项目开始一个新的历史。