2012-11-14 3 views

Répondre

3

Si l'histoire que vous souhaitez conserver contient des fusions, peut-être la façon la plus simple utiliser une greffe pour couper temporairement l'historique indésirable, puis filtrer la branche pour créer une branche ayant cette vue de l'historique comme permanente.

cd /path/to/repo 
git checkout -b newbranch special 
git rev-parse E > .git/info/grafts 
git filter-branch 
rm .git/info/grafts 

Ceci suppose que vous n'avez actuellement aucune greffe. Puisque les greffes sont rarement utilisées et que ce serait probablement une bonne idée de le faire dans un clone frais, cela ne devrait pas poser de problème.

+0

Merci beaucoup! %) –

0

La manière facile et évidente: Examinez E et faites une copie du répertoire de travail, mais assurez-vous de ne pas transporter le répertoire .git. Maintenant, initialisez un nouveau repo git à partir de là et déplacez les autres commits. git format-patch et git apply sont vos amis.

+0

L'application d'un tas de correctifs m'a semblé difficile. La même chose que la cueillette des cerises. J'espérais quelque chose de plus joli%) –

+0

@idlesign: Vous pouvez toujours générer des patches avec 'git format-patch' et appliquer avec une variation de' git am * .patch' - pas si difficile. –

0

Alors que git filter-branch pourrait être impliquée, this article donne une solution originale avec des taches:

Créer un tas de patches, comme ceci:

git checkout find-ls 
git format-patch 9758db3 # where find-ls branched 

Si vous devez avoir votre Les nouveaux repo ont une structure différente, vous devrez peut-être pirater les correctifs. Je viens d'utiliser:

perl -pi -E 's|LEADING-DIR/||g' *.patch 

Vous pouvez alors appliquer les patchs:

mv 0*.patch where/I/want/my/new/repo 
cd where/I/want/my/new/repo 
git am *.patch 
+0

Je ne vois pas comment 'filter-branch' pourrait être impliqué sans d'autres répertoires joggling, par exemple? –

+0

@idlesign Je cherchais des exemples 'filter-branch' (comme dans https://github.com/github/teach.github.com/blob/gh-pages/technology/_posts/2001-01-01-lesson- filter-branch.md), mais les correctifs sont la solution la plus simple ici. – VonC

1
git checkout --orphan newbranch E 
git commit -c E 
git cherry-pick F..H 
git init --bare /path/to/new/repo 
git push /path/to/new/repo HEAD:master 
+0

cherry-pick est plus rapide que d'utiliser des correctifs. J'aime ça. +1 – VonC

+0

@qqx Je suis passé d'une approche similaire (avec --strategy = recursive --strategy-option = leur pour la résolution automatique des conflits) en raison de nombreux "Commit [...] est une fusion mais aucune option -m n'a été donnée " qui sont difficiles à gérer pour des milliers de commits. Des idées pour les manipuler en batch? –

Questions connexes