2011-04-07 64 views
10

是否有移动存储库,及其所有标签,是另一个仓库的自动化方式子目录的方法吗?如何在过滤存储库时保留标签?

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

比方说,我们有仓库A,B和C,我们要一个项目,它们中的每一个子目录:

project/ 
    A/ 
    B/ 
    C/ 

可以与git-filter-branch --tree-filter来完成。完成,没问题。它甚至也正确地分行,这是一个惊喜。

问题是,A,B和C都有标签,他们都需要转换。

这能自动化?

回答

13

我想我可以回答我的问题。将--tag-name-filter cat添加到git-filter-branch呼叫。 -- --all立即执行所有分支和标签,大大加快了转换速度。这是完整的电话。

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

移动到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手册页中,但它有点模糊。