我可以将存储库的 .git 目录移至其父目录吗?
-
03-07-2019 - |
题
我有两个子目录,每个子目录都有一个存储库,因此:
PPP/
|--ABC/
| |--.git/
| |--AAA/
| | BBB/
| | CCC/
|
|--DEF/
| |--.git/
| |--DDD/
| |--EEE/
并且想将它们合并到一个存储库中,因此,我假设目录结构如下:
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 将执行你想要的操作:您最终将得到三个存储库,其中顶级存储库链接到当前两个存储库。
作为指导:
如果您要增加它们之间的耦合,则应该将它们合并到一个存储库中,以便将一个版本的存储库 A 与不同版本的存储库 B 一起使用不再有意义。
如果子模块在某种程度上保持独立(有时单独处理一个子模块是有意义的),那么您应该使用子模块,但您希望能够方便地与它们一起工作(例如立即下载两者,检查两者的已知良好状态,等等)。
使用子模块将避免存储库现有副本出现问题,因为历史记录不会改变。合并它们将创造一个新的历史,并且从现有分支工作的人们将更难合并他们的更改。
对我而言,似乎很难以你想要的方式去做,因为两个项目的历史都不会合并。
我最好的建议是创建一个包含ABC和DEF的新存储库,保留这两个存储库中的旧存储库以进行历史记录备份并使用这个新项目开始新的历史记录。