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/ |
这是可行的吗?
另外,目前有几个人在他们的机器上有回购协议。那会使生活变得多复杂?
助教。
你可以这样描述:
将
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 |
现在您的目录结构是
与
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 |
现在您的目录结构是
最后,创建
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 |
现在你有了
您可能应该要求您的同事在他们的系统上运行以前的命令,以便每个人都能同步。
Note: the funky
filter-branch commands come from the man page. :-)
您真的需要将两个现有存储库合并到一个存储库中,还是只想将它们分组?
如果您只想将它们分组,那么git子模块将做您想要做的:您最终将得到三个存储库,其中顶层的一个链接到当前的两个存储库。
作为指南:
如果要增加它们之间的耦合度,那么应该将它们合并到一个单独的存储库中,这样使用一个版本的repo A和另一个版本的repo B就不再有意义了。
如果子模块保持一定的独立性,则应该使用子模块(有时单独使用其中一个是有意义的),但您希望能够方便地与它们一起工作(例如,一次下载两个模块,检查点知道两个模块之间的良好状态等)。
使用子模块可以避免存储库的现有副本出现问题,因为历史不会改变。合并它们将创建一个新的历史记录,而来自现有分支的人员合并其更改将更加困难。
对我来说,似乎很难按照你想要的方式去做,因为这两个项目的历史不会合并。
我最好的建议是创建一个新的存储库来包含ABC和DEF,让这两个库中的旧repo保持历史备份,并用这个新项目开始一个新的历史。