当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《我可以将.git目录移动到它的父目录吗?》经验,为你挑选了2个好方法。

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

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

并且想将它们组合成一个repo,所以,我认为目录结构将是这样的:

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

这是真的吗?

目前还有几个人在他们的机器上有回购.生活有多复杂?

助教.



1> MiniQuark..:

你可以像这样做你所描述的:

    将内容移动ABCABC/子目录,并修复历史记录,使其看起来一直存在:

    $ 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命令来自手册页.:-)


BTW,一种修改当前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.
嗨Tymek.你是完全正确的,我只是添加了一个注释.我一直在使用这个时髦的命令,我早就忘记了从哪里得到它(我甚至可能相信我想出来了!)."好艺术家借,伟大的艺术家偷",毕加索说(或者是我?).
请注意,这只会更新每个子项目中的当前签出分支,并且只会将这些分支拉入新的仓库.
我刚刚使用索引过滤器遇到的一个问题:如果第一次提交没有对文件进行任何更改(例如从Subversion导入只创建了一个目录),则不会创建index.new文件和`mv`命令没有来源也没有失败.您可以重新绑定并压缩前两个提交,或者在`mv`命令之后添加`||:`,这总是会导致成功,即使第一个`mv`失败也是如此.

2> Thomas Leona..:

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

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

作为指导:

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

你应该使用子模块,如果它们在某种程度上是分开的(有时可以单独处理它们),但你希望能够一起使用这些子模块(例如,同时下载两个子模块,检查点已知 - 良好的状态等).

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

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有