2011-04-07 20 views
10

Bir depoyu, ve tüm etiketlerini, otomatik bir şekilde başka bir deponun alt dizini olarak taşımanın bir yolu var mı?Depoyu filtrelerken etiketleri nasıl korurum?

Sebepler nedeniyle, bir proje birden fazla depoya bölünmüştür. Şimdi bunun çok sıcak bir fikir olmadığını ve tekrar bir araya getirmek istediğini görüyoruz. Altmodüller göz önünde bulunduruldu, ancak bunlar gerçekten tek bir proje ve aralarında çok fazla dosya taşımak zorundayız.

en biz depo A, B ve C var Ve biz bir alt dizin olarak bunların her biri ile proje istediğinizi varsayalım: git-filter-branch --tree-filter ile gerçekleştirilebilir

project/ 
    A/ 
    B/ 
    C/ 

. Bitti, sorun yok. Ve hatta dalları da doğru yapar, bu da hoş bir sürprizdi.

Sorun şu ki, A, B ve C etiketlerine sahip, ve hepsinin de dönüştürülmesi gerekiyor.

Bu otomatik olabilir mi?

cevap

13

Sanırım kendi sorumu yanıtlayabilirim. git-filter-branch çağrısına --tag-name-filter cat ekleniyor. -- --all, tüm şubeleri ve etiketleri bir anda dönüşümü büyük ölçüde hızlandırıyor. İşte tam arama. moduna geçiş subdir ben alt dizin yapmak ve içine dosyaları taşımak için yazdığım küçük bir program olma ile

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

.

#!/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; 
} 

Bu bilgi, git-filter-branch man sayfasındadır, ancak bir tür gizlenmiştir.