具有现有目录结构的Git子目录过滤器

时间:2011-09-12 03:46:44

标签: git git-filter-branch

我正在使用filter-branch的--subdirectory-filter选项拆分Git存储库,除了将所有东西都拉到存储库的根目录之外,它工作得很好。

我目前有

ABC
  - DEF
      - GHI
      - JKL
  - MNO

这个命令的结果:

git filter-branch -f --subdirectory-filter ABC/DEF --prune-empty -- --all

生成这个:

GHI
JKL

我真正想要的是:

ABC
  - DEF
      - GHI
      - JKL

我在Git文档中看不到任何显示过保留(或设置)目录结构的过滤器选项的内容,但我无法找到一个命令,我可以在之后运行过滤以将结构重新映射到我想要的方式。

这可能吗?

2 个答案:

答案 0 :(得分:3)

我找到了答案here来解决问题。

命令:

git filter-branch -f --index-filter 'git ls-files -s \
| sed "s-\t-&ABC/DEF/-" \
| GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info \
&& mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE'

完美运作

答案 1 :(得分:2)

我自己只是粗略测试,但我认为您可以使用git filter-branch--tree-filter来重写分支,但删除除子目录ABC/DEF之外的所有文件,具有如下内容:

git filter-branch --tree-filter \
    'find . -path ./ABC/DEF -prune -o -type f -print0 | xargs -0 rm -f' \
    --prune-empty HEAD

请注意,find命令仅删除文件,而不删除目录,但由于git不存储空目录,因此仍应生成所需的结果。