Say I <feature.c> vor einiger Zeit eingeführt und bemerken jetzt sollte es nicht Teil meines main
Zweig gewesen, sondern ein Zweig feature
. Ist es möglich, z.B. git-filter-branch
automatisch alle <feature.c> Geschichte aus meiner main
Zweig in die feature
Zweig verschieben?git: Split Geschichte einiger Dateien in einem separaten Zweig
Antwort
Es klingt als würdest du etwas ziemlich Wahnsinniges tun! :)
Das heißt, ich sehe ein paar Optionen, von denen keine besonders automatisiert sind.
Wenn Sie eine Tonne Commits mit dieser Datei vorhanden haben, zugeben, nur den Fehler, machen eine Niederlassung von Ihrem HEAD, und setzen weiter verpflichtet mit dieser Funktion in diesem Zweig, bis sie stabil sind . Wenn Sie Repo teilen, wird dies die einzige echte Option. Niemand möchte eine abweichende Geschichte haben, besonders wenn dieses Feature tief in der Geschichte begangen wurde.
Wenn Sie nur über etwa 10 Commits sprechen, die diese Datei tatsächlich berührt haben, und sie vor kurzem ohne viele verschachtelte Commits übergeben wurden, könnten Sie einen neuen Zweig auf HEAD ausprobieren und die Verzweigung wiederherstellen Sie möchten diese Funktion nicht verwenden, bevor Sie die Funktion hinzugefügt haben, und dann müssen Sie die Befehle, die Sie benötigen, aus dem Feature-Zweig herausnehmen, bis Sie alle zu einem späteren Zeitpunkt einbinden können.
Wenn Sie mit einer Tonne der Geschichte zu tun hat, eine Menge verschachtelter verpflichtet, und Sie, die an wirklich nicht wollen, alle diese Funktion haben, Sie konnte ein kleines Shell-Skript aufzuschreiben, die die Ausgabe nimmt von
git log
und Kirsche nimmt es in einen neuen Zweig auf. Etwas entlang der Linien von:$ cd git-repo $ git checkout -b feature-x $ the-perfect-shell-script `git log --pretty=format:"%H" path/to/feature.c`
Sobald Sie diese Funktion Zweig mit all den Commits Kirsche herausgesucht, können Sie dann
git filter-branch
verwenden, um alle Commits, um herauszufiltern, die diese Datei verweisen. Die man page hat ein einfaches Beispiel, das genau das tut.Sobald Sie das haben, können Sie dann
git rebase feature-x --onto <filtered-branch>
und Sie sollten gut zu gehen.Natürlich sollte das ziemlich entmutigt werden, besonders wenn irgendein davon veröffentlicht wird.
Ok, hier mein Gos:
Hätte ich nicht Commits Manipulieren <feature.c>, ich hätte von verzweigten <feature.c> s ersten begehen und verwendete dann git cherry-pick
mit git log
in eine Schleife, wie suggested von Tim Visher. Ausgehend von Master denke ich dies funktionieren soll:
#!/bin/bash
# create the feature branch starting from feature.c's first commit
FIRSTCOMMIT=$(git log --pretty=format:"%H" feature.c | tail -n1)
git checkout -b feature $FIRSTCOMMIT
# find all commits concerning feature.c...
for i in $(git log feature..master --reverse --pretty=format:"%H" feature.c)
do
# ... cherry-pick them ...
git cherry-pick $i
# ... and copy ONE modified tag of it if existing
git describe --tags --exact-match $i && xargs taghelperscript
done
# now eliminate feature.c from master
git filter-branch --prune-empty --tag-name-filter "cat" --index-filter 'git rm --cached --ignore-unmatch feature.c' $FIRSTCOMMIT..master
Mit taghelperscript
ist so etwas wie git tag prefix.$1
(vielleicht kann dies besser gemacht werden?). Der Tagging-Teil funktioniert wahrscheinlich nur für die Lightweight-Tags, die ich verwende. Bitte beachten Sie, dass dies nicht funktioniert, wenn <Feature.c> wurde zu einem bestimmten Zeitpunkt umbenannt, und wenn es bereits im initialen Commit existierte, könnte dies entweder zwei separate Historien verursachen, oder (meine Vermutung) ein Commit in master
, das das Löschen von <feature.c> enthält, das wahrscheinlich verursachen wird ein Zusammenführungskonflikt oder Verwirrung später.
Das Problem ist, ändern einige meiner Commits andere Dateien, so git cherry-pick
verursacht einen ungelösten merge auszulösen, oder stellt diese Dateien. Stattdessen werde ich etwas Magie ausprobieren. Später. Stay tuned ...
glücklicherweise noch veröffentlicht nichts ist, meine Gedanken an Feature-Verzweigung aufgetreten in der -Phase "was _before_ Publishing zu betrachten" :) so werde ich versuchen, 3. –
+1 für 'the-Perfect- Shell-Skript 'git log --pretty = Format:"% H "Pfad/zu/feature.c''. Siehe [meine eigene Antwort] (http://stackoverflow.com/questions/4278264/git-split-history-of-some-files-into-a-separate-branch/4283970#4283970) für meine Idee davon –
stattdessen von 'git log ...' kann man auch 'git rev-list master - feature.c' verwenden –