我正在使用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文档中看不到任何显示过保留(或设置)目录结构的过滤器选项的内容,但我无法找到一个命令,我可以在之后运行过滤以将结构重新映射到我想要的方式。
这可能吗?
答案 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不存储空目录,因此仍应生成所需的结果。