过滤存储库时如何保留标记?

Sch*_*ern 12 git git-filter-branch

有没有办法以自动方式将存储库及其所有标记移动到另一个存储库的子目录中?

出于原因,项目被拆分为多个存储库.现在我们看到这不是一个热门的想法,并希望再次将它重新组合在一起.考虑了子模块,但它们实际上是一个项目,我们需要在它们之间移动大量文件.

假设我们有存储库A,B和C.我们想要一个项目,每个项目都作为子目录:

project/
    A/
    B/
    C/
Run Code Online (Sandbox Code Playgroud)

这可以通过以下方式实现git-filter-branch --tree-filter.做完了,没问题.它甚至也正确地分支,这是一个令人愉快的惊喜.

麻烦的是,A,B和C都有标签,它们都需要转换.

这可以自动化吗?

Sch*_*ern 15

我想我可以回答我自己的问题.添加--tag-name-filter catgit-filter-branch通话. -- --all所有分支和标签都会立即加快转换速度.这是完整的电话.

 git filter-branch --tree-filter 'move-to-subdir $subdir' --prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)

随着move-to-subdir是一个小程序,我编写了这个子目录并将文件移入其中.

#!/usr/bin/env perl

use Path::Class;
use autodie;

my $subdir = shift;

mkdir $subdir unless -d $subdir;

my $cwd = dir(".");
my @kids = grep { $_ ne $subdir } $cwd->children;
for my $dir (@kids) {
    rename $dir, dir("$subdir/$dir")->cleanup;
}
Run Code Online (Sandbox Code Playgroud)

这些信息都在git-filter-branch手册页中,但它有点模糊.