Fractionner les grands dépôt Git en plusieurs petits
Après le succès de la conversion d'un dépôt SVN à Git, j'ai maintenant un très grand dépôt Git que je veux décomposer en plusieurs petits dépôts et de maintenir l'histoire.
Donc, quelqu'un peut aider avec la coupure des pensions 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é en suivant les instructions de cette question précédente, mais il n'a pas vraiment d'ajustement lors de la tentative de placer plusieurs répertoires dans un repo (Détacher (se déplacer) sous-répertoire en séparer dépôt Git).
- Lorsque vous êtes satisfait de la réponse, s'il vous plaît marquer comme acceptée.
- Pour ceux qui cherchent à diviser en de multiples (imbriqué) répertoires dans un nouveau repo (au lieu de chercher à supprimer les répertoires multiples, qui pourrait être plus difficile sur certains projets), cette réponse a été utile pour moi: stackoverflow.com/a/19957874/164439
Vous devez vous connecter pour publier un commentaire.
Cela va de l'installation MyABRepo; vous pouvez faire My12Repo de même bien sûr.
Une référence .git/refs/original/refs/heads/master reste. Vous pouvez le retirer avec:
Si tout va bien, vous pouvez alors retirer MyABRepo.tmp.
Si pour une raison quelconque, vous obtenez un message d'erreur concernant .git-réécrire, vous pouvez essayer ceci:
Cela permettra de créer et d'utiliser /tmp/git-réécriture.tmp comme un répertoire temporaire, au lieu de
.git-rewrite
.Naturellement, vous pouvez remplacer n'importe quel chemin d'accès que vous souhaitez au lieu de
/tmp/git-rewrite.tmp
, aussi longtemps que vous avez la permission d'écriture, et le répertoire n'existe pas déjà.DIR_A
, par exemple)?git rebase -i --root $tip
(pour git 1.7.12+), ou cette méthode plus ancienne?filter-branch
. Pour ceux qui ne connaissent pas, il ré-écrit l'histoire, donc si vous prévoyez de pousser le repo après vous avez fait cela, la validation des hachages sera différent maintenant, et ça ne marchera pas..git/refs/original/refs/heads/master
qu'est-ce que ce fichier?qu'arriverait-il si il est resté?Vous pouvez utiliser
git filter-branch --index-filter
avecgit rm --cached
pour supprimez les répertoires à partir des clones ou des copies de l'original de votre référentiel.Par exemple:
Vous devrez supprimer manuellement chaque référentiel est inutile de succursales ou de balises (par exemple, si vous avez eu une fonction-x-pour-AB branche, alors vous voudrez probablement à supprimer qu'à partir de la “12” référentiel).
:
n'est pas un caractère de commentaire dans bash. Vous devez utiliser#
à la place.#
parce que pas tous les shells prendre#
comme un commentaire d'introduction dans tous les contextes (par exemple, interactif zsh sans INTERACTIVE_COMMENTS option est activée). À l'aide de:
rend l'ensemble du texte adapté pour les coller dans n'importe quel shell interactif ainsi que l'enregistrement 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
.git subtree
. Voir stackoverflow.com/questions/359424/...La git_split projet est un simple script qui fait exactement ce que vous cherchez. https://github.com/vangorra/git_split
Tour git répertoires dans leurs très propres dépôts dans leur propre emplacement. Pas de sous-arbre drôle d'affaires. Ce script va prendre un répertoire existant dans votre dépôt git et tourner le répertoire d'autonomie d'un référentiel qui lui est propre. Le long du chemin, il se copie sur l'ensemble de l'historique des modifications pour le répertoire que vous avez fournis.
Voici un script ruby qui va le faire.
https://gist.github.com/4341033
Merci pour vos réponses mais j'ai fini par copier le référentiel deux fois puis supprimer les fichiers, je n'ai pas envie de chacun. Je vais utiliser le filtre-branche à une date ultérieure à dépouiller tous les commits pour les fichiers supprimés car ils sont déjà la version contrôlée ailleurs.
Il a travaillé pour ce dont j'avais besoin.
EDIT: bien sûr, la même chose a été fait dans la My12Repo contre A et B répertoire. Cela m'a donné deux repos à l'identique de l'histoire jusqu'au point que j'ai supprimé les indésirables répertoires.