编写 git filter-branch 将所有文件移动到子目录中的混乱

gny*_*his 5 git repository git-filter-branch

我相信 git filter-branch 可以让我做到这一点,但我无法弄清楚是否需要使用 --subdirectory-filter 或者是否需要使用索引过滤器。

但是,假设我有一个名为 repo 的存储库,其结构如下所示:

repo/fileA
repo/fileB
repo/dir1/fileC
Run Code Online (Sandbox Code Playgroud)

我想要做的是将所有内容移动到名为 dir2 的目录中,因此结果是:

repo/dir2/fileA
repo/dir2/fileB
repo/dir2/dir1/fileC
Run Code Online (Sandbox Code Playgroud)

我想使用 filter-branch 让它看起来就像自从这个存储库诞生以来,一切都总是在 dir2 中完成。使用子目录文件或索引过滤器来执行此操作是否更合适?

ral*_*nja 3

树过滤器。像下面这样的东西应该有效:

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
Run Code Online (Sandbox Code Playgroud)

然而,这假设 fileA、fileB 和 fileC 是同时添加的(因为我们对 fileA 使用 test -e),但情况可能并非如此。如果不是这种情况,您必须对每个文件进行多次扫描。