2017-01-31 4 views
11

Ich habe Git Repository mit vielen, vielen (2000+) verpflichtet, zum Beispiel:Wie lösche ich die alte git Geschichte?

    l-- m -- n 
       /
a -- b -- c -- d -- e -- f -- g -- h -- i -- j -- k 
        \ 
         x -- y -- z 

und ich mag alte Log-Geschichte gestutzt - löschen Sie alle Commits aus Verlaufsprotokoll von (zum Beispiel), ausgehend commit „f "aber als Anfang des Repositories.

Wie geht das?

+0

['rebase'] (https://git-scm.com/docs/git-rebase) ist das Werkzeug zum Ändern der Historie. – Maroun

+2

Was ist das Problem, das Sie lösen möchten? –

Antwort

20

Um nicht etwas Geschichte zu verlieren; besser zuerst eine Kopie von Ihrem Repository :). Los geht's: (<f> ist die sha des begehen f, die Sie die neue Wurzel sein wollen begehen)

git checkout --orphan temp <f>  # checkout to the status of the git repo at commit f; creating a branch named "temp" 
git commit -m "new root commit"  # create a new commit that is to be the new root commit 
git rebase --onto temp <f> master # now rebase the part of history from <f> to master onthe temp branch 
git branch -D temp     # we don't need the temp branch anymore 

Wenn Sie einen Remote haben, wo Sie die gleiche abgeschnittene Geschichte haben wollen; Sie können git push -f verwenden. Warnung Dies ist ein gefährlicher Befehl. Benutze das nicht leicht! Wenn Sie sichergehen möchten, dass Ihre letzte Version des Codes immer noch dieselbe ist; Sie können git diff origin/master ausführen. Das sollte keine Änderungen anzeigen (da sich nur der Verlauf geändert hat; nicht der Inhalt Ihrer Dateien).

git push -f 

Die folgenden 2 Befehle sind optional - sie halten Ihren Git Repo in guter Form.

git prune --progress     # delete all the objects w/o references 
git gc --aggressive     # aggressively collect garbage; may take a lot of time on large repos 
+0

Klingt, was ich brauche, aber jedes Mal, wenn ich den dritten Schritt (Git Rebase ...) mache, bekomme ich Konflikte. Es ist normal? – user3475757

+0

Nein, das scheint nicht normal zu sein. Haben Sie in diesem dritten Schritt den '' Teil (dh das gleiche Commit-Objekt, aus dem Sie den temporären Zweig erstellt haben) eingeschlossen? –

8

Eine mögliche Lösung für Ihr Problem wird durch git clone mit der --shallow-since Option zur Verfügung gestellt. Wenn es nur eine kleine Anzahl von Commits seit f gibt und es keine Probleme gibt, sie zu zählen, dann können Sie die Option --depth verwenden.

Die zweite Option (--depth) klont nur den angegebenen Zweig. Wenn Sie zusätzliche Zweigstellen benötigen, können Sie das Original-Repo als Remote hinzufügen und git fetch verwenden und abrufen.

Wenn Sie mit dem Ergebnis zufrieden sind, entfernen Sie das alte Repository und benennen Sie das neue Repository um, um es zu ersetzen. Wenn das alte Repository remote ist, erstellen Sie es nach dem Entfernen neu und schieben Sie es aus dem neuen Repository in es.

Dieser Ansatz hat den Vorteil von Größe und Geschwindigkeit. Der neue Repo enthält nur die Commits, die Sie wollen, und es ist nicht notwendig, git prune oder git gc auszuführen, um die alten Objekte zu entfernen (weil sie nicht da sind).

+2

eine nette Alternative. +1 –

+0

Wenn Sie die Geschichte nur auf der Fernbedienung behalten möchten, tun Sie nicht den letzten Schritt. Für meine Anwendung ist dies die beste Konfiguration: Ich habe den aufgeblähten Verlauf auf der Remote in dem unwahrscheinlichen Fall, dass ich es brauche, aber lokale Klone und Updates sind schnell und nehmen nicht viel Speicherplatz in Anspruch. – Liam

Verwandte Themen