Как сохранить теги при фильтрации хранилища? - PullRequest
12 голосов
/ 07 апреля 2011

Есть ли способ переместить хранилище, и все его теги , в автоматический подкаталог другого хранилища?

По причинам, проект был разделен на несколькохранилища.Теперь мы видим, что это не такая горячая идея, и хотим снова собрать ее вместе.Подмодули рассматривались, но на самом деле это один проект, и нам нужно переместить много файлов между ними.

Допустим, у нас есть репозиторий A, B и C. И мы хотим один проект с каждым из них какподкаталог:

project/
    A/
    B/
    C/

Это можно сделать с помощью git-filter-branch --tree-filter.Готово, нет проблем.И он даже правильно делает ветки, что было приятным сюрпризом.

Проблема в том, что у A, B и C есть теги, и все они тоже должны быть преобразованы.

Можетэто будет автоматизировано?

1 Ответ

15 голосов
/ 07 апреля 2011

Я думаю, что могу ответить на свой вопрос.Добавление --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, но это как бы скрыто.

...