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

时间:2011-04-07 00:36:31

标签: git git-filter-branch

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

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

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

project/
    A/
    B/
    C/

可以使用git-filter-branch --tree-filter完成。做完了,没问题。它甚至也正确地完成了分支,这是一个令人愉快的惊喜。

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

这可以自动化吗?

1 个答案:

答案 0 :(得分:15)

我想我可以回答我自己的问题。将--tag-name-filter cat添加到git-filter-branch来电。 -- --all会立即使所有分支和标记加速转换。这是完整的电话。

 git filter-branch --tree-filter 'move-to-subdir $subdir' --prune-empty --tag-name-filter cat -- --all

将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;
}

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