git手术 - 拆分存储库并修改目录结构

时间:2011-01-12 14:43:48

标签: git git-filter-branch

我有以下这个结构的单一存储库:

my-repo/
  foo/
    contents-of-foo
  bar/
    contents-of-bar
  baz/
    contents-of-baz
  other-contents

我希望得到以下结构,理想情况下不会丢失任何历史记录/标签:

new-combined-repo/
  contents-of-foo
  bar/
    contents-of-bar
  baz/
    contents-of-baz

my-other-repo
  other-contents

我有点坚持如何继续。我试过这个:

$ pushd path/to/my-repo/
$ git mv bar foo/
$ git mv baz foo/
$ git commit -m "Move bar and baz prior to repository extraction"
$ cd ..
$ git clone --no-hardlinks my-repo new-combined-repo
$ pushd new-combined-repo
$ git remote rm origin
$ git filter-branch --tag-name-filter cat --subdirectory-filter foo \
      --prune-empty -- --all
$ git log --follow foo/bar/some-file

some-file命令之前删除了git mv的所有历史记录。

更好的建议? TIA。

2 个答案:

答案 0 :(得分:1)

为什么不写一个树形过滤器(用于git filter-branch --tree-filter)除去你要保留的所有目录?像这个(未经测试):

#!/bin/bash
shopt -s extglob dotglob
rm -r !(bar|baz|.gitignore)

这当然不会保留将移动到栏或baz中的文件的历史记录,但除了这种不常见的情况外,历史记录将保持不变。

答案 1 :(得分:1)

git filter-branch --tree-filter 'mv bar baz foo; rm *'

请先将rm *混淆之前保存您的存储库副本。