我可以将.git目录的回购目录移到它的父目录吗?
我有两个子目录每个都有一个回购,因此:
PPP/ |--ABC/ | |--.git/ | |--AAA/ | | BBB/ | | CCC/ | |--DEF/ | |--.git/ | |--DDD/ | |--EEE/
并想将它们合并成一个回购,所以,我会假设目录结构会是这样的:
PPP/ |--.git/ |--ABC/ | |--AAA/ | |--BBB/ | |--CCC/ | |--DEF/ | |--DDD/ | |--EEE/
这是可行的吗?
目前还有几个人在他们的机器上有回购。 这会使生活变得多复杂?
助教。
你可以做你所描述的这样的事情:
-
将
ABC
的内容移动到ABC/
子目录,并修改历史logging,使其看起来一直存在:$ 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
-
最后,创build
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不再有意义。
-
你应该使用子模块,如果它们保持一定的分离(有时候孤立地工作是有意义的),但是你希望能够方便地与它们一起工作(例如一次下载两个检查点,两个已知好的状态等等)。
使用子模块将避免存储库的现有副本的问题,因为历史logging不会改变。 合并它们将创造一个新的历史,从现有分支机构工作的人将更难合并他们的变化。
对我来说,看起来很难做到你想要的方式,因为两个项目的历史不会合并。
我最好的build议是创build一个包含ABC和DEF的新版本库,保留这两个版本的老版本进行历史备份,并开始新的项目。