12

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

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

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

project/
    A/
    B/
    C/

这可以通过git-filter-branch --tree-filter. 完成,没问题。它甚至也正确地处理了分支,这是一个惊喜。

问题是A、B、C都有标签,也都需要转换。

这可以自动化吗?

4

1 回答 1

15

我想我可以回答我自己的问题。添加--tag-name-filter catgit-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 手册页中,但有点模糊。

于 2011-04-07T00:58:00.957 回答