900 Stimmen

Den aktuellen Commit zum einzigen (ersten) Commit in einem Git-Repository machen?

Ich habe derzeit ein lokales Git-Repository, das ich in ein Github-Repository verschiebe.

Das lokale Repository hat ~10 Commits, und das Github-Repository ist ein synchronisiertes Duplikat davon.

Ich möchte den gesamten Versionsverlauf aus dem lokalen Git-Repository entfernen, so dass der aktuelle Inhalt des Repositorys als einzige Übergabe erscheint (und daher ältere Versionen von Dateien innerhalb des Repositorys nicht gespeichert werden).

Ich würde diese Änderungen dann gerne auf Github veröffentlichen.

Ich habe Git rebase untersucht, aber das scheint eher geeignet zu sein, bestimmte Versionen zu entfernen. Eine andere mögliche Lösung besteht darin, das lokale Projektarchiv zu löschen und ein neues zu erstellen - allerdings würde dies wahrscheinlich eine Menge Arbeit verursachen!

ETA: Es gibt bestimmte Verzeichnisse/Dateien, die nicht aufgespürt werden - wenn möglich, würde ich gerne die Aufspürung dieser Dateien beibehalten.

8voto

Shafique Jamal Punkte 1510

Nachfolgend finden Sie ein Skript, das an die Antwort von @Zeelot angepasst ist. Es sollte die Historie aus allen Zweigen entfernen, nicht nur aus dem Master-Zweig:

for BR in $(git branch); do   
  git checkout $BR
  git checkout --orphan ${BR}_temp
  git commit -m "Initial commit"
  git branch -D $BR
  git branch -m $BR
done;
git gc --aggressive --prune=all

Für meine Zwecke hat es funktioniert (ich verwende keine Submodule).

6voto

Tom Dörr Punkte 733

Dies löscht den Verlauf auf der master Zweig (eventuell sollten Sie eine Sicherungskopie erstellen, bevor Sie die Befehle ausführen):

git branch tmp_branch $(echo "commit message" | git commit-tree HEAD^{tree})
git checkout tmp_branch
git branch -D master
git branch -m master
git push -f --set-upstream origin master

Dies basiert auf der Antwort von @dan_waterworth.

6voto

Johann Punkte 23689

Löschen Sie einfach das Github-Repositorium und erstellen Sie ein neues. Das ist bei weitem der schnellste, einfachste und sicherste Ansatz. Denn was haben Sie davon, all diese Befehle in der akzeptierten Lösung auszuführen, wenn Sie nur den Master-Zweig mit einem einzigen Commit haben wollen?

5voto

Matthias M Punkte 10330

Sie könnten flache Klone (git > 1.9):

git clone --depth depth remote-url

Lesen Sie weiter: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/

4voto

AnoE Punkte 7324

Ich möchte den gesamten Versionsverlauf aus dem lokalen Git-Repository entfernen, so dass der aktuelle Inhalt des Repositorys als einzige Übergabe erscheint (und daher ältere Versionen von Dateien innerhalb des Repositorys nicht gespeichert werden).

Eine eher konzeptionelle Antwort:

git sammelt automatisch alte Commits ein, wenn keine Tags/Branches/Refs auf sie verweisen. Sie müssen also einfach alle Tags/Zweige entfernen und einen neuen verwaisten Commit erstellen, der mit einem beliebigen Zweig verknüpft ist - per Konvention würden Sie den Zweig master auf diesen Commit verweisen.

Die alten, unerreichbaren Commits werden dann von niemandem mehr gesehen, es sei denn, man gräbt mit einfachen Git-Befehlen. Wenn Ihnen das genügt, würde ich es dabei belassen und die automatische GC ihre Arbeit tun lassen, wann immer sie will. Wenn Sie sie sofort loswerden wollen, können Sie git gc (eventuell mit --aggressive --prune=all ). Für das entfernte Git-Repository gibt es jedoch keine Möglichkeit, dies zu erzwingen, es sei denn, Sie haben Shell-Zugriff auf das Dateisystem.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X