混淆编写git filter-branch将所有文件移入子目录

问题描述 投票:3回答:3

[我相信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 repository git-filter-branch
3个回答
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
投票

可能是树过滤器。

  • 子目录过滤器旨在以其他方式(将现有目录移动到存储库的根目录,而忽略其余部分)。
  • 索引过滤器旨在修改索引而无需检出内容,但是git mv没有只能在索引上使用的选项,因此您实际上确实需要使用检出功能。

0
投票

使用Git 2.24,git filter-branch is deprecated

相当于使用git filter-branch及其newren/git-filter-repo

newren/git-filter-repo

将任何文件夹重命名,包括example sectioncd repo git filter-repo --to-subdirectory-filter dir2

© www.soinside.com 2019 - 2024. All rights reserved.