Comment faire pour déplacer des fichiers d'un repo git à l'autre (pas un clone), la préservation de l'histoire

Nos dépôts Git a commencé comme des parties d'un seul monstre dépôt SVN où les projets individuels avaient chacun leur propre arbre de la sorte:

project1/branches
        /tags
        /trunk
project2/branches
        /tags
        /trunk

De toute évidence, il était assez facile de déplacer des fichiers de l'un à l'autre avec svn mv. Mais dans Git, chaque projet est dans son propre référentiel, et aujourd'hui on m'a demandé de déplacer un sous-répertoire de project2 à project1. J'ai fait quelque chose comme ceci:

$ git clone project2 
$ cd project2
$ git filter-branch --subdirectory-filter deeply/buried/java/source/directory/A -- --all
$ git remote rm origin  # so I don't accidentally the repo ;-)
$ mkdir -p deeply/buried/different/java/source/directory/B
$ for f in *.java; do 
>  git mv $f deeply/buried/different/java/source/directory/B
>  done
$ git commit -m "moved files to new subdirectory"
$ cd ..
$
$ git clone project1
$ cd project1
$ git remote add p2 ../project2
$ git fetch p2
$ git branch p2 remotes/p2/master
$ git merge p2 # --allow-unrelated-histories for git 2.9
$ git remote rm p2
$ git push

Mais qui semble assez compliquée. Est-il une meilleure façon de faire ce genre de chose en général? Ou ai-je adopté la bonne approche?

Note que cela implique la fusion de l'histoire dans un référentiel existant, plutôt que de simplement créer un nouveau autonome référentiel de la partie d'un autre (comme dans une question précédente).

  • Qui sonne comme une approche raisonnable pour moi; je ne peux pas penser à une façon évidente d'améliorer de façon significative votre méthode. C'est bien que Git ne fait rendre cela facile (je ne voudrais pas essayer de déplacer un répertoire de fichiers entre différents référentiels dans la Subversion, par exemple).
  • Aussi je ne voudrais pas essayer de déplacer un répertoire entre les deux svn repos! (J'imagine que certains cauchemar impliquant svnadmin dump et svn dumpfilter, bleah.)
  • J'ai fait cela (déplacé l'histoire d'un repo svn à l'autre) manuellement, à l'aide de scripts shell. Fondamentalement, j'ai relu l'histoire (des diffs, journaux de messages) à partir de fichiers/répertoires dans un deuxième référentiel.
  • Je me demande pourquoi vous ne le faites pas git fetch p2 && git merge p2 au lieu de git fetch p2 && git branch .. && git merge p2? Edit: bon, il semble que vous souhaitez pour obtenir les changements dans une nouvelle branche nommée p2, pas la branche courante.
  • À seulement porter sur les commits de l'autre repo qui implique le répertoire que vous vous déplacez, vous devez ajouter --prune-empty à la git filter-branch
  • J'ai également trouvé ce thread dans le cas où les fichiers que vous avez déplacé à partir de project2 eu beaucoup de l'histoire et que vous vouliez en permanence effacer tous les enregistrements d'entre eux, puisque vous avez l'histoire dans un deuxième projet: dalibornasevic.com/posts/...
  • Il n'existe aucun moyen pour empêcher l' --filter-branch de détruire la structure de répertoire? Que "git mv" l'étape des résultats dans un massif de commettre pleine des suppressions de fichiers et les fichiers de créations.
  • Noter que git 2.9 fusion sans rapport avec l'histoire, interdites par défaut. Pour le faire fonctionner, ajouter --allow-unrelated-histories à la dernière git merge pour le faire fonctionner.
  • Double Possible de Détacher (se déplacer) sous-répertoire en séparer dépôt Git
  • ce n'est pas vraiment un doublon, car cela implique la fusion de choses dans un des pensions de l'histoire.

InformationsquelleAutor ebneter | 2009-09-02