37

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

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

并且想将它们合并到一个仓库中,所以,我假设目录结构是这样的:

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

这可能吗?

目前还有几个人在他们的机器上拥有 repos。这让生活复杂了多少?

塔。

4

3 回答 3

45

你可以像这样做你描述的事情:

  1. 将 的内容移动ABCABC/子目录,并修复历史记录,使其看起来一直存在:

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

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

注意:时髦的filter-branch命令来自手册页。:-)

于 2009-03-05T10:28:34.337 回答
5

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

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

作为指南:

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

  • 你应该使用子模块,如果它们仍然有些分离(有时单独处理一个是有意义的),但你希望能够一起使用它们的便利(例如同时下载两个,检查点已知良好的状态) , ETC)。

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

于 2009-05-13T18:45:43.693 回答
0

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

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

于 2009-03-05T10:26:09.680 回答