Ich habe mit der Verwendung des Git-Teilbaums experimentiert und bin auf die folgende Situation gestoßen.
Ich habe den Teilbaum git verwendet, um meinem Repo ein externes Projekt hinzuzufügen. Ich habe absichtlich den gesamten Verlauf für das Upstream-Projekt beibehalten, da ich auf den Verlauf des Projekts verweisen und später auch einen Beitrag zum Upstream-Projekt leisten möchte.
Wie sich herausstellt, hat ein anderer Mitarbeiter des Upstream-Projekts versehentlich eine große Datei in den Hauptzweig verschoben. Um dies zu beheben, hat das vorgelagerte Projekt den Verlauf neu geschrieben und den Master erzwungen. Bei der Erstellung meines "Monorepo" habe ich dieses Commit eingefügt und möchte es auch entfernen.
Wie kann ich mein Repository aktualisieren, um den neuen Verlauf des Teilbaums widerzuspiegeln?
Mein erster Versuch war, Filter-Branch zu verwenden, um den Teilbaum und den gesamten Verlauf vollständig zu entfernen.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
Sobald die alte Version des Teilbaums entfernt wurde, konnte ich den Teilbaum mit dem neuen Upstream-Master erneut hinzufügen. Dies hat jedoch nicht funktioniert, da der Festschreibungsverlauf aus irgendeinem Grund immer noch in der Git-Protokollausgabe angezeigt wird.
Aktualisieren
Ich habe die Schritte geschrieben, um ein minimal reproduzierbares Beispiel zu erstellen.
Erstellen Sie zuerst ein leeres Git-Repo.
git init test-monorepo cd ./test-monorepo
Erstellen Sie ein erstes Commit.
echo hello world > README git add README git commit -m 'initial commit'
Fügen Sie nun einen Teilbaum für ein externes Projekt hinzu.
git remote add thirdparty git@github.com:teivah/algodeck.git git fetch thirdparty git subtree add --prefix algodeck thirdparty master
Machen Sie einige Commits auf dem Monorepo
echo dont panic >> algodeck/README.md git commit -a -m 'test commit'
Versuchen Sie nun, den Teilbaum mit git filter-branch zu entfernen.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
Untersuchen Sie die Git-Protokollausgabe. Ich erwarte nur mein erstes Commit.
git log
git gc --prune=now
nur Commits gelöscht, die nicht in git log
angezeigt werden.
git log
keine Argumente gemacht und ich sehe immer noch die alten Commits.