如何干净地拆分Git存储库?

如何干净地拆分Git存储库?,git,git-filter-branch,Git,Git Filter Branch,带我走了一段路,但我还是错过了一些东西 我有一个单用户存储库(所以重写历史与推/拉操作没有问题),在这里我一起开发了产品代码、支持代码和文档 经过一年左右的工作,我终于看到了曙光,我想把我的回购协议一分为二。这就是我所尝试的: 在项目根目录下创建两个新目录;让我们称之为项目/代码/和项目/支持/ git将所有代码内容转换为代码/ git将所有支持材料放入支持中/ 复制并修改.git 承诺一切 现在,当我运行我认为正确的命令时: git filter-branch -d /cygdrive/z/t

带我走了一段路,但我还是错过了一些东西

我有一个单用户存储库(所以重写历史与推/拉操作没有问题),在这里我一起开发了产品代码、支持代码和文档

经过一年左右的工作,我终于看到了曙光,我想把我的回购协议一分为二。这就是我所尝试的:

  • 在项目根目录下创建两个新目录;让我们称之为项目/代码/和项目/支持/
  • git将所有代码内容转换为代码/
  • git将所有支持材料放入支持中/
  • 复制并修改.git
  • 承诺一切
  • 现在,当我运行我认为正确的命令时:

    git filter-branch -d /cygdrive/z/temp/ --subdirectory-filter Code/ -- --all
    
    我只得到了一个单独提交的分离分支,我的原始分支仍然存在(如
    original/refs/head/brent
    ),所有其他分支都保持原样

    我真正需要的是重写历史,就好像代码/目录“总是在那里”,而支持/东西不是,反之亦然

    我是一个相对无知的人,所以我肯定我错过了一些重要的概念——请告诉我


    好的,我已经做到了,它似乎做得很好,非常感谢。我有几个补充问题:

  • 我添加了a-r以允许删除完整的目录。这是正确的吗?我实际使用的命令是:

    git筛选器分支--索引筛选器\
    'git rm-r--cached--ignore unmatch'\
    ----全部

  • 存储库现在的提交数量大约是我预期的两倍。在gitk中,它们被链接到具有“original/refs/heads/TestSys”等名称的对象 我假设这些是原始的提交树;我怎样才能摆脱它们?它们不会出现在fsck中,而且prune和gc都不会——aggressive会清除它们


    嗯,哦,只要看一下精美的手册,;我们将尝试使用git clone来修剪残羹剩饭


    好的,现在我已经完成了克隆,存储库已经缩小到原来的大小。克隆似乎只复制当前(源回购)头的分支信息,我必须手动设置其他分支:

    for n in `git branch -r|grep -v 'HEAD'` ; do git branch ${n/origin?/} $n ; done 
    
    在克隆时有没有一种简单的方法可以做到这一点

    另外:我不想显得忘恩负义,但现在有了“空”提交,它只用于处理现在已不存在的文件

    有没有简单的方法来消除这些问题


    非常感谢您的帮助和耐心。

    我想问题在于将文件移动到子目录中–git在移动之前不会跟踪它们。我建议从旧存储库中克隆两个新存储库,并在每个存储库中运行以下内容:

    git filter-branch --index-filter 'git rm --cached --ignore-unmatch <list of files that shouldnt be here>' -- --all
    
    git过滤器分支--索引过滤器'git rm--cached--ignore unmatch'--all