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 ...
- 1. Git Zweig ohne Geschichte
- 2. ein Git Geschichte auf einem SVN-Zweig
- 3. Wie „split“ Dateien mit git
- 4. Split ein Git Zweig in zwei Zweige?
- 5. Git: Zweig hat seine Geschichte verloren?
- 6. Git-Tfs fehlt Geschichte auf Zweig
- 7. GIT Split Repository Verzeichnis Erhaltung * move/umbenennt * Geschichte
- 8. Zweig in einem Zweig in Git erstellen
- 9. Split git-Repository einschließlich umbenannten Dateien
- 10. Keep commits Geschichte nach einem 'Git fusionieren'
- 11. Git Zweig (kein Zweig)
- 12. git Zweige in separaten Ordnern
- 13. Separate Dateien in Git
- 14. Warum erstellt Gradle Dateien in einem anderen Git-Zweig?
- 15. Git-svn - Import vollständige Geschichte
- 16. Split git branch in separate Repo
- 17. Git Squash begeht die umbenannten Dateien (eine keep Geschichte)
- 18. Git Export/Import verpflichtet Geschichte
- 19. Squash git Commits von Zweig Zweig
- 20. Entfernen Sie eine Menge Dateien in Git-Filter-Zweig
- 21. Einfache Git Geschichte Abflachen Verpflichtet
- 22. Versuchen, Dateien zu einem Zweig hinzuzufügen
- 23. E-Mail Adresse in Git Geschichte ändern
- 24. git holen Änderungen von einem lokalen Zweig
- 25. git - kopieren Sie alle Dateien von einem Zweig zum beliebigen Ordner in der aktuellen Zweig, unstaged
- 26. Split Zweig in zwei Filialen/Merge einen Zweig selektiv
- 27. Squash git Geschichte
- 28. Git Remote-Zweig wiederverwenden riesige Dateien
- 29. Git entfernen Geschichte Commit
- 30. Git: Umbenennen eines Verzeichnisses in einem Zweig
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 –