2011-04-07 5 views
10

Existe-t-il un moyen de déplacer un référentiel, et tous ses tags, pour qu'il soit automatiquement un sous-répertoire d'un autre référentiel?Comment préserver les balises lors du filtrage d'un référentiel?

Pour des raisons, un projet a été divisé en plusieurs référentiels. Nous voyons maintenant que ce n'était pas une idée si chaude et que nous voulons la ramener à nouveau. Les sous-modules ont été pris en compte, mais ils sont vraiment un projet et nous devons déplacer beaucoup de fichiers entre eux.

Disons que nous avons repository A, B et C. Nous voulons un projet avec chacun d'eux comme un sous-répertoire:

project/ 
    A/ 
    B/ 
    C/ 

Cela peut être accompli avec git-filter-branch --tree-filter. Fait, pas de problème. Et il fait même les branches correctement, ce qui était une agréable surprise. Le problème, c'est que A, B et C ont des étiquettes, et elles ont toutes besoin d'être converties aussi.

Est-ce que cela peut être automatisé?

Répondre

13

Je pense que je peux répondre à ma propre question. Ajout de --tag-name-filter cat à l'appel git-filter-branch. -- --all fait toutes les branches et les étiquettes à la fois accélérer la conversion considérablement. Voici l'appel complet.

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

d'être un petit programme move-to-subdir je l'ai écrit pour faire le sous-répertoire et déplacer les fichiers dessus.

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

Cette information se trouve dans la page de manuel de git-filter-branch, mais elle est en quelque sorte obscurcie.

Questions connexes