2017-12-11 8 views
1

Ich möchte 7/8 Commits von etwa zwei Jahren aus meinem GitHub-Repository entfernen. Nur 2/3 der Commits berühren irgendeinen Code, der Rest nur die Konfigurationsdateien hinzufügen und entfernen.Der beste Weg, um Commits aus dem Verlauf zu entfernen?

Einige frühere Entwickler hochgeladen und entfernt buchstäblich> 650 doppelte Konfigurationsdateien, und es ist unsere github Stat-Seite zu vermasseln. Stat Graph

Wir haben versucht, sie mit Git Rebase -i zu entfernen, aber es dauerte 6 Stunden und die meisten Teile des Codes waren weg.

Wie entfernen wir diese alten Commits, ohne andere Commit-History zu verpfuschen? Wir codieren derzeit den gesamten Code im Repository. Es ist also keine große Sache, wenn die Änderungen aus diesen einzelnen Commits nicht beibehalten werden, aber wir möchten außerdem alle Statistiken, die mit dem alten Code einhergingen, behalten .

+0

Können Sie das „dauerte 6 Stunden und die meisten Teile des Codes klären waren Weg"? Wie hast du 'git rebase' konkret benutzt? –

+0

Commits "* kann nicht *" aus dem * shared * Verlauf eines Repo entfernt werden, der geklont wurde (oder vielmehr, wenn die Commits oder Downstream-Commits gezogen wurden), weil andere (und * abhängig von *) diese Commits an haben Mache die DAG. Die extreme Lösung besteht darin, ein neues Repository zu erstellen und sauber zu importieren, aber dies ist eine extreme Maßnahme und hat Downstream-Auswirkungen, da es sich um ein * neues * Repository mit demselben Namen handelt. – user2864740

+0

Wir benutzten 'git rebase -i' und löschten die Commits aus dem Editor, der auftauchte. Wir haben rund 5000 "git rebase --skip" -Befehle kopiert und eingefügt. Es gibt keine Möglichkeit, 5000 Commits manuell zu beheben, und es würde nicht weitergehen, ohne dass wir etwas unternehmen. @ user2864740 Schau dir den Screenshot an, den ich verlinkt habe. Sie können nichts von diesem Graphen unterscheiden. – Kneesnap

Antwort

0

sind zwei Schritte erforderlich:

  1. Rewrite git history, mit einem von:
    • Rebase aus dem letzten guten begehen, alle chaotisch Commits Verwerfen:

git Rebase --interaktiv Good-Commit-sha

  • oder Filter-Zweig

git filter-branch --tree-Filter 'rm -f config-files' HEAD

  1. Schubkraft zum Master:

git push --force origin master

Beachten Sie, dass Schubkraft wird dringend abgeraten, da es alle aktuellen Klone Ihrer Repo inkonsistent machen. Jeder Konflikt muss manuell behoben werden.

0

Obligatorisch GEFAHR: Das Umschreiben der Projekthistorie ist sehr riskant! Stellen Sie sicher, dass Sie ein Backup haben, bevor Sie dies versuchen, und fahren Sie mit äußerster Vorsicht fort!

So löschen Sie eine bestimmte in einem Projekt zu begehen (beispielsweise von Jahren) können Sie:

git rebase -p --onto SHA^ SHA 

Wo SHA die Sie löschen möchten commit.

Die Dokumentation für diese Optionen ist:

-p, --preserve-merges 
    Recreate merge commits instead of flattening the history by replaying 
    commits a merge commit introduces. Merge conflict resolutions or 
    manual amendments to merge commits are not preserved. 

--onto <newbase> 
    Starting point at which to create the new commits. If the --onto 
    option is not specified, the starting point is <upstream>. May 
    be any valid commit, and not just an existing branch name. 

Nach dieser Änderung, werden Sie brauchen:

git push --force origin master 
#  ^^^^^^^ 
#   !!! 
Verwandte Themen