git外科手术 - 将单个存储库拆分为多个存储库

时间:2011-01-12 14:19:30

标签: git git-filter-branch

我有一个现有的git存储库:

my-repo/
  .git/
  foo/
    foo-content-goes-here
  bar/
    bar-content-goes-here

我希望获得以下存储库结构:

my-foo-repo/
  .git/
  foo-content-goes-here

my-bar-repo/
  .git
  bar-content-goes-here

我看过Detach (move) subdirectory into separate Git repository。这几乎可以满足我的需要。

我运行了这些命令:

$ cd path/to/my-repo/../
$ git clone --no-hardlinks my-repo foo-repo
$ cd foo-repo
$ git remote rm origin
$ git filter-branch --tag-name-filter cat --subdirectory-filter foo \
      --prune-empty -- --all
$ git reset --hard
$ git gc --aggressive
$ git prune

我说这几乎可行。提到的问题:

  1. 我的存储库git gc --aggressive步骤需要2个多小时。我有13个存储库需要从我当前的单个存储库中提取。我可以编写这个过程的脚本,但是会喜欢以任何方式输入以加快它的速度吗?
  2. git loggitk向我展示了新foo-repo的预期提交。 gitX向我展示了预期的提交,以及与旧历史记录的断开连接的树。 foo-repo目录的大小比我预期的要大得多,所以我想剩下一些需要清理的东西。我不知道如何摆脱这些东西?我甚至需要在推之前摆脱它吗?

1 个答案:

答案 0 :(得分:3)

您可以反过来尝试:在原始工作区中的工作分支中筛选出您想要的目录,然后仅将该分支推送到新的存储库。

$ cd /path/to/global-repo

$ git branch work-foo master
$ git filter-branch --tag-name-filter cat --subdirectory-filter foo \
      --prune-empty work-foo

$ cd /path/to
$ mkdir foo-repo
$ cd foo-repo
$ git init
$ git pull /path/to/global-repo work-foo

如果你走这条路,你想要--all选项使用filter-branch