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

时间:2012-03-12 02:03:50

标签: git repository git-filter-branch

我相信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中完成。使用子目录文件或索引过滤器来执行此操作更合适吗?

3 个答案:

答案 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