我相信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中完成。使用子目录文件或索引过滤器来执行此操作更合适吗?
答案 0 :(得分:2)
树形滤镜。以下内容应该有效:
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),而且可能不是这种情况。如果不是这种情况,则必须对每个文件进行多次扫描。
答案 1 :(得分:1)
可能是树过滤器。
git mv
没有选项只能处理索引,所以你可能确实需要一个结帐才能使用。答案 2 :(得分:0)
使用Git 2.24,git filter-branch
is deprecated。
相当于使用newren/git-filter-repo
及其example section:
cd repo
git filter-repo --to-subdirectory-filter dir2
这会将包含/
的所有文件夹重命名为dir2
。