我可以将.git目录的回购目录移到它的父目录吗?

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

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

并想将它们合并成一个回购,所以,我会假设目录结构会是这样的:

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

这是可行的吗?

目前还有几个人在他们的机器上有回购。 这会使生活变得多复杂?

助教。

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

  1. 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

  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. 最后,创buildPPP存储库并将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命令来自手册页 。 🙂

你真的需要将现有的两个版本库合并成一个版本库,还是只是想对它们进行分组?

如果你只是想把它们分组,那么git-submodule将会做你想做的事情:最后你会得到三个仓库,其中最高级的仓库链接到当前的仓库。

作为指导:

  • 如果要增加它们之间的耦合,则应将它们合并到单个存储库中,以便使用具有不同版本的repo B的一个版本的repo A不再有意义。

  • 你应该使用子模块,如果它们保持一定的分离(有时候孤立地工作是有意义的),但是你希望能够方便地与它们一起工作(例如一次下载两个检查点,两个已知好的状态等等)。

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

对我来说,看起来很难做到你想要的方式,因为两个项目的历史不会合并。

我最好的build议是创build一个包含ABC和DEF的新版本库,保留这两个版本的老版本进行历史备份,并开始新的项目。