我可以将 repo 的 .git 目录移动到它的父目录吗?

Posted

技术标签:

【中文标题】我可以将 repo 的 .git 目录移动到它的父目录吗?【英文标题】:Can I move the .git directory for a repo to it's parent directory? 【发布时间】:2010-10-11 11:36:16 【问题描述】:

我有两个子目录,每个子目录都有一个仓库,因此:

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

并且想将它们合并到一个仓库中,所以,我假设目录结构是这样的:

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

这可能吗?

目前还有几个人在他们的机器上安装了 repos。这会让生活变得复杂多少?

Ta。

【问题讨论】:

见Combining multiple git repositories。 【参考方案1】:

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

    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 存储库并将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 命令come from the man page。 :-)

【讨论】:

请注意,这只会更新每个子项目中当前签出的分支,并且只会将这些分支拉入新的仓库。 顺便说一句,修改当前 repo 以将所有内容移动到子目录的另一种方法是 git filter-branch --tag-name-filter cat --index-filter 'SHA=$(git write-tree); rm $GIT_INDEX_FILE && git read-tree --prefix=ABC/ $SHA' -- --all。这也将重写所有分支和标签,而不仅仅是 HEAD。 时髦的 filter-branch 命令来自 git 的 filter-branch 手册页。你应该这样说:a)它应该被正确归因b)我不会仅仅因为有人,即使有很高的声誉,将它发布在***上而运行这样的命令。我会从手册页中知道它。 嗨,Tymek。你完全正确,我只是添加了一个注释。我使用这个时髦的命令已经有一段时间了,我早就忘记了它是从哪里得到的(我什至可能相信我想出了它!)。 “优秀的艺术家借用,伟大的艺术家偷窃”,毕加索(或者是我?)说。 我刚刚在使用索引过滤器时遇到的一个问题:如果您的第一次提交没有对文件进行任何更改(例如从仅创建目录的 Subversion 导入),则 index.new 文件不会被创建并且mv 命令没有源并且失败。你可以 rebase 和 squash 前两个提交,或者在 mv 命令之后添加 ||:,即使第一个 mv 失败,也总是会成功。【参考方案2】:

您真的需要将两个现有存储库合并到一个存储库中,还是只想将它们分组?

如果你只是想对它们进行分组,那么 git-submodule 会做你想做的事:你最终会得到三个存储库,其中***的一个链接到当前的两个。

作为指导:

如果要增加它们之间的耦合,则应将它们合并到一个存储库中,这样将一个版本的存储库 A 与不同版本的存储库 B 一起使用不再有意义。

1234563两者的已知良好状态等)。

使用子模块将避免现有的存储库副本出现问题,因为历史不会改变。合并它们将创建一个新的历史记录,并且在现有分支中工作的人将更难合并他们的更改。

【讨论】:

【参考方案3】:

对我来说,按照你想要的方式去做似乎很难,因为这两个项目的历史不会合并。

我最好的建议是创建一个包含 ABC 和 DEF 的新存储库,保留这两个的旧存储库以备份历史记录并使用这个新项目开始新的历史记录。

【讨论】:

以上是关于我可以将 repo 的 .git 目录移动到它的父目录吗?的主要内容,如果未能解决你的问题,请参考以下文章

当我重命名 git repo 的父目录时会发生啥?

标签文本自动拉伸到它的父 pyqt5

如何将触摸事件从 ScrollView 子视图传递到它的父视图

将子视图安装到它的父级?

将“子”git repo 合并/移动到“父”git repo

更改 Git 存储库目录位置。