2010-08-20 51 views
2

This question把我的一部分,但我仍然失去了一些东西。如何分离一个Git仓库干净?

我有一个单用户存储库(所以在重写历史记录与推/拉时没有问题),我已经开发了产品代码并支持代码和文档。

经过一年多的工作,我终于看到了光明,并希望将我的回购分为两部分。这是我试过的:

  1. 在项目根目录下创建两个新目录;让我们称他们为项目/代码和/工程/支持/
  2. 混帐MV所有代码的东西到Code/
  3. 混帐MV所有支持的东西到支持/
  4. 复制和修改的.gitignore适当
  5. 承诺一切

现在,当我运行了我认为正确的命令:

git filter-branch -d /cygdrive/z/temp/ --subdirectory-filter Code/ -- --all 

我只是得到一种超然分支一个单一的提交,我的原始分支仍然在那里(如original/refs/head/brent),而其他所有分支都是原样。

我真正需要的是重写历史,就好像代码/目录是“永远存在”,而Support/stuff不是,反之亦然。

我是一个相对的Git小白,所以我敢肯定,我已经错过了一些重要的概念 - 请填写我


OK,我做到了这一点,而且它似乎。做我所需要的,非常感谢。我有一对夫妇补充问题:

  1. 我加了-r以允许移除完整的目录。它是否正确?我实际使用的命令是:

    git的过滤分支--index过滤器\
    'git的RM -r --cached - 忽略的不匹配' \
    - - 所有

  2. 的仓库现在的提交次数大约是我预期的两倍。这些在gitk中显示为与名称为“original/refs/heads/TestSys”的东西链接在一起。

我假设这些是原始提交树;我如何摆脱它们?他们不会出现在fsck中,修剪和gc - agressive都不能摆脱他们。


嗯,哦,只是读了精细的手册;去尝试git克隆来修剪cruft。


好的,现在我已经完成了克隆,并且存储库已缩小到原始大小。克隆似乎只是复制的分支信息当前(源回购)头,我不得不手动设置其他分支机构与此:

for n in `git branch -r|grep -v 'HEAD'` ; do git branch ${n/origin?/} $n ; done 

有没有一种简单的方法,在克隆的时间来做到这一点?

加上这个:我不希望看起来忘恩负义,但现在有“空”提交,它只用于触摸现在已经消失的文件。

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

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

回答

3

我想将文件移动到子目录是问题 - git在移动之前不会跟着它们。我建议克隆两个新旧版本库,并在其中运行以下每个版本:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch <list of files that shouldnt be here>' -- --all