[我相信git filter-branch可以允许我执行此操作,但是我不知道是否需要使用--subdirectory-filter还是需要使用索引过滤器。
但是,假设我有一个名为repo的存储库,其结构类似于:
repo/fileA
repo/fileB
repo/dir1/fileC
我想做的是将所有内容都移动到名为dir2的目录中,因此结果是:
repo/dir2/fileA
repo/dir2/fileB
repo/dir2/dir1/fileC
我想使用filter-branch使其自此存储库诞生以来就一直看起来像,它总是在dir2中完成。使用子目录文件或索引过滤器来执行此操作是否更合适?
树过滤器。类似以下内容应该可以工作:
git filter-branch --tree-filter 'test -e fileA && mkdir dir2 && mkdir dir2/dir1 && mv fileA fileB dir2/ && mv dir1/fileC dir2/dir1/ || echo "no op"' HEAD
但是,这是假设同时添加了fileA,fileB和fileC(因为我们对fileA使用test -e),但事实并非如此。如果不是这种情况,则必须对每个文件进行几次扫描。
可能是树过滤器。
git mv
没有只能在索引上使用的选项,因此您实际上确实需要使用检出功能。使用Git 2.24,git filter-branch
is deprecated。
相当于使用git filter-branch
及其newren/git-filter-repo
:
newren/git-filter-repo
将任何文件夹重命名,包括example section到cd repo
git filter-repo --to-subdirectory-filter dir2
。