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.

1143voto

Fred Foo Punkte 341230

Hier ist der Brute-Force-Ansatz. Dabei wird auch die Konfiguration des Repositorys entfernt.

備考 : Dies funktioniert NICHT, wenn das Repository Untermodule hat! Wenn Sie Submodule verwenden, sollten Sie z.B. interaktive Umbasierung

Schritt 1: Entfernen Sie den gesamten Verlauf ( Vergewissern Sie sich, dass Sie eine Sicherungskopie haben, da dies nicht rückgängig gemacht werden kann. )

cat .git/config  # save your <github-uri> somewhere
rm -rf .git

Schritt 2: Rekonstruktion des Git-Repos mit nur dem aktuellen Inhalt

Wenn Sie vor Schritt 2 noch keine Einstellungen vorgenommen haben init.defaultBranch Konfiguration, dann tun Sie es bitte über git config --global init.defaultBranch <branch-name> Sie können wählen main como <branch-name> im aktuellen Beispiel

git init
git add .
git commit -m "Initial commit"

Schritt 3: Auf GitHub pushen.

git remote add origin <github-uri>
git push -u --force origin main

855voto

Zeelot Punkte 8142

Die einzige Lösung, die bei mir funktioniert (und dafür sorgt, dass die Untermodule funktionieren), ist

git checkout --orphan newBranch
git add -A  # Add all files and commit them
git commit
git branch -D master  # Deletes the master branch
git branch -m master  # Rename the current branch to master
git push -f origin master  # Force push master branch to github
git gc --aggressive --prune=all     # remove the old files

Löschen von .git/ verursacht immer große Probleme, wenn ich Untermodule habe. verwenden git rebase --root würde bei mir irgendwie zu Konflikten führen (und viel Zeit in Anspruch nehmen, da ich eine lange Vorgeschichte habe).

130voto

dan_waterworth Punkte 6101

Dies ist mein bevorzugter Ansatz:

git branch new_branch_name $(echo "commit message" | git commit-tree HEAD^{tree})

Dadurch wird ein neuer Zweig mit einem Commit erstellt, der alles in HEAD hinzufügt. Es wird nichts anderes geändert, also ist es völlig sicher.

37voto

Carl Punkte 41134

Die andere Möglichkeit, die sich bei vielen Commits als sehr arbeitsintensiv erweisen könnte, ist ein interaktives Rebase (vorausgesetzt, Ihre Git-Version ist >=1.7.12): git rebase --root -i

Wenn Sie eine Liste von Commits in Ihrem Editor sehen:

  • Ändern Sie "pick" in "reword" für die erste Übertragung
  • Ändern Sie bei jeder zweiten Übertragung "auswählen" in "reparieren".

Speichern und schließen. Git beginnt mit der Neubasierung.

Am Ende hätten Sie eine neue Root-Übertragung, die eine Kombination aus allen nachfolgenden Übertragungen ist.

Der Vorteil ist, dass Sie Ihr Repository nicht löschen müssen und im Zweifelsfall immer eine Ausweichmöglichkeit haben.

Wenn Sie Ihre Historie wirklich vernichten wollen, setzen Sie den Master auf diesen Commit zurück und löschen Sie alle anderen Zweige.

21voto

lalebarde Punkte 1452

Variante von larsmans vorgeschlagene Methode:

Speichern Sie Ihre Untrackfiles-Liste:

git ls-files --others --exclude-standard > /tmp/my_untracked_files

Speichern Sie Ihre Git-Konfiguration:

mv .git/config /tmp/

Führen Sie dann die ersten Schritte von Larsmans aus:

rm -rf .git
git init
git add .

Stellen Sie Ihre Konfiguration wieder her:

mv /tmp/config .git/

Heben Sie die Verfolgung von nicht verfolgten Dateien auf:

cat /tmp/my_untracked_files | xargs -0 git rm --cached

Dann verpflichten Sie sich:

git commit -m "Initial commit"

Und schließlich pushen Sie in Ihr Repository:

git push -u --force origin master

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