2010-11-25 11 views

Antwort

6

Es klingt als würdest du etwas ziemlich Wahnsinniges tun! :)

Das heißt, ich sehe ein paar Optionen, von denen keine besonders automatisiert sind.

  1. 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.

  2. 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.

  3. 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.

+1

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. –

+0

+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 –

+0

stattdessen von 'git log ...' kann man auch 'git rev-list master - feature.c' verwenden –

2

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 ...