Après avoir réussi à convertir un référentiel SVN en Git, j'ai maintenant un très grand référentiel Git que je souhaite décomposer en plusieurs référentiels plus petits et maintenir l'historique.
Alors, quelqu'un peut-il aider à rompre un repo qui pourrait ressembler à ceci:
MyHugeRepo/
.git/
DIR_A/
DIR_B/
DIR_1/
DIR_2/
Dans deux référentiels qui ressemblent à ceci:
MyABRepo/
.git
DIR_A/
DIR_B/
My12Repo/
.git
DIR_1/
DIR_2/
J'ai essayé de suivre les instructions de cette question précédente, mais cela ne convient pas vraiment lorsque vous essayez de placer plusieurs répertoires dans un dépôt séparé ( Détacher (déplacer) le sous-répertoire dans un dépôt Git séparé ).
Réponses:
Cela configurera MyABRepo; vous pouvez bien sûr faire My12Repo de la même manière.
Une référence à .git / refs / original / refs / heads / master reste. Vous pouvez supprimer cela avec:
Si tout s'est bien passé, vous pouvez supprimer MyABRepo.tmp.
Si pour une raison quelconque vous obtenez une erreur concernant .git-rewrite, vous pouvez essayer ceci:
Cela créera et utilisera /tmp/git-rewrite.tmp comme répertoire temporaire, au lieu de
.git-rewrite
. Naturellement, vous pouvez remplacer le chemin que vous souhaitez/tmp/git-rewrite.tmp
, tant que vous disposez d'une autorisation d'écriture et que le répertoire n'existe pas déjà.la source
DIR_A
, par exemple)?filter-branch
. Pour ceux qui ne le savent pas, il réécrit l'historique, donc si vous prévoyez de pousser le dépôt après avoir fait cela, les hachages de validation seront différents maintenant et cela ne fonctionnera pas.Vous pouvez utiliser
git filter-branch --index-filter
avecgit rm --cached
pour supprimer les répertoires indésirables des clones / copies de votre référentiel d'origine.Par exemple:
Vous devrez supprimer manuellement les branches ou balises inutiles de chaque référentiel (par exemple, si vous aviez une branche feature-x-for-AB , vous voudrez probablement la supprimer du référentiel «12»).
la source
:
n'est pas un caractère de commentaire dans bash. Vous devriez utiliser à la#
place.:
est une commande intégrée traditionnelle ( également spécifiée dans POSIX ). Il est inclus dans bash , mais ce n'est pas un commentaire. Je l'ai spécifiquement utilisé de préférence#
parce que tous les shells ne prennent pas#
comme introducteur de commentaires dans tous les contextes (par exemple, zsh interactif sans l'option INTERACTIVE_COMMENTS activée). L'utilisation:
rend le texte entier approprié pour coller dans n'importe quel shell interactif ainsi que pour enregistrer dans un fichier de script.git remote rm origin
, qui semble toujours revenir 1. J'ai donc remplacé le&&
par;
pour cette ligne.git remote add origin $TARGET; git push origin master
.Le projet git_split est un script simple qui fait exactement ce que vous recherchez. https://github.com/vangorra/git_split
Transformez les répertoires git en leurs propres dépôts à leur propre emplacement. Aucune entreprise drôle de sous-arbre. Ce script prendra un répertoire existant dans votre référentiel git et transformera ce répertoire en un référentiel indépendant à part entière. En cours de route, il copiera l'intégralité de l'historique des modifications pour le répertoire que vous avez fourni.
la source
Voici un script ruby qui le fera. https://gist.github.com/4341033
la source
Merci pour vos réponses, mais j'ai fini par copier le référentiel deux fois, puis en supprimant les fichiers que je ne voulais pas de chacun. Je vais utiliser la branche de filtre à une date ultérieure pour supprimer tous les commits pour les fichiers supprimés car ils sont déjà contrôlés en version ailleurs.
Cela a fonctionné pour ce dont j'avais besoin.
EDIT: Bien sûr, la même chose a été faite dans le My12Repo contre les répertoires A et B. Cela m'a donné deux dépôts avec un historique identique jusqu'au point où j'ai supprimé les répertoires indésirables.
la source