我有两个子目录,每个子目录都有一个repo,因此:
PPP/ |--ABC/ | |--.git/ | |--AAA/ | | BBB/ | | CCC/ | |--DEF/ | |--.git/ | |--DDD/ | |--EEE/
并且想将它们组合成一个repo,所以,我认为目录结构将是这样的:
PPP/ |--.git/ |--ABC/ | |--AAA/ | |--BBB/ | |--CCC/ | |--DEF/ | |--DDD/ | |--EEE/
这是真的吗?
目前还有几个人在他们的机器上有回购.生活有多复杂?
助教.
你可以像这样做你所描述的:
将内容移动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
内容相同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
最后,创建PPP
资源库和拉都ABC
和DEF
到它:
$ mkdir /path/to/PPP $ cd /path/to/PPP $ git init $ git pull /path/to/ABC $ git pull /path/to/DEF
现在你有PPP/ABC/your_code
和PPP/DEF/your_code
,与所有的历史一起.
你可能应该要求同事在他们的系统上运行以前的命令,以便让每个人都同步.
注意:时髦的
filter-branch
命令来自手册页.:-)
您真的需要将两个现有存储库合并到一个存储库中,还是只想将它们分组?
如果你只是想对它们进行分组,那么git-submodule就能做你想做的事情:你最终会得到三个存储库,其中顶级存储库链接到当前的两个存储库.
作为指导:
如果要增加它们之间的耦合,则应将它们合并到单个存储库中,以便使用具有不同版本的repo B的一个版本的repo A不再有意义.
你应该使用子模块,如果它们在某种程度上是分开的(有时可以单独处理它们),但你希望能够一起使用这些子模块(例如,同时下载两个子模块,检查点已知 - 良好的状态等).
使用子模块可以避免存储库的现有副本出现问题,因为历史记录不会更改.合并它们将创建一个新的历史记录,从现有分支机构工作的人们将更难合并他们的更改.