Derzeit habe ich
- Leeres GitHub-Repo
- SSH Server Repo (Haupt)
- Lokales Repo
Das SSH-Server-Repo war das aktuellste Repo (Produktionsstandort), daher habe ich einen Git-Klon von dort nach lokal erstellt. Ich habe dann versucht, ein git push
GitHub zu machen.
Alles lief in Ordnung, aber dann stand etwas darüber, dass filename.gz für GitHub zu groß ist. Ich brauchte diese Datei nicht, also führte ich mehrere Git-Befehle aus, um sie aus dem Git-Cache zu entfernen, und schob sie dann zurück zum SSH-Server.
Ich sehe die große Datei lokal nicht, aber sie befindet sich immer noch auf dem SSH-Server, obwohl git diff
nichts zurückgegeben wird und git push "Alles ist auf dem neuesten Stand" zurückgibt - und obwohl die Datei im lokalen Repo nicht sichtbar ist, wenn ich versuche, auf zu pushen GitHub Ich bekomme immer noch Fehler darüber
remote: Fehler: Datei fpss.tar.gz ist 135,17 MB; Dies überschreitet die Dateigrößenbeschränkung von GitHub von 100 MB
Ich habe die in der GitHub-Hilfe aufgeführten Schritte unter "Beheben des Problems" ausgeführt. Sollte das nicht genug gewesen sein?
Wie befindet sich die Datei noch im Äther, wenn sie nicht lokal ist oder in git status / diff / push aufgeführt ist?
git log -- the_big_file
Sie etwas zurückgeben, ist die Datei immer noch im Verlauf.git push
alles auf dem neuesten Stand sein? Da Sie die Geschichte geändert haben, hätte es sich beschweren müssen, dass der Push nicht möglich ist und dass Sie ihn erzwingen müssten.Antworten:
Sie können verwenden
Dadurch wird alles im Verlauf dieser Datei gelöscht. Das Problem ist, dass die Datei im Verlauf vorhanden ist.
Dieser Befehl ändert die Hashes Ihrer Commits, was insbesondere bei freigegebenen Repositorys ein echtes Problem sein kann. Es sollte nicht durchgeführt werden, ohne die Konsequenzen zu verstehen.
quelle
--all
Flag anstelle vonHEAD
Rewrite 657560fa18c030bcfac9132ce1c3541e84a5bc2c (1/10) (0 seconds passed, remaining 0 predicted) /usr/lib/git-core/git-filter-branch: 1: eval: Syntax error: end of file unexpected
Ich fand Quetschen nützlicher als
filter-branch
. Ich habe folgendes gemacht:git reset --soft HEAD~3
.git commit -m "New message for the combined commit"
Sonderfall (von Benutzer @lituo): Wenn oben nicht funktioniert, haben Sie möglicherweise diesen Fall. Commit 1 enthielt die große Datei, und der Push von Commit 1 schlug aufgrund eines Fehlers bei großen Dateien fehl. Commit 2 entfernte die große Datei um,
git rm --cached [file_name]
aber der PushvonCommit 2 schlug immer noch fehl. Sie können die gleichen Schritte wie oben ausführen, aber anstatt zu verwendenHEAD~3
, verwenden SieHEAD~2
.quelle
Folgendes fand ich sehr hilfreich, wenn Sie bereits mit Ihrem Repo herumgespielt haben, bevor Sie um Hilfe gebeten haben. Erster Typ:
Danach sollten Sie etwas in der Art von sehen
Der wichtige Teil sind die "2 Commits"! Von hier aus geben Sie Folgendes ein:
Für das obige Beispiel würde man also Folgendes eingeben:
Nachdem Sie das eingegeben haben, sollte Ihr "Git-Status" lauten:
Von dort aus können Sie die große Datei löschen (vorausgesetzt, Sie haben dies noch nicht getan), und Sie sollten in der Lage sein, alles erneut festzuschreiben, ohne Ihre Arbeit zu verlieren.
Ich weiß, dass dies keine ausgefallene Antwort ist, aber ich hoffe, es hilft!
quelle
Wenn die Datei mit zugesetztem Ihre letzte begehen , und Sie haben nicht auf die Remote - Repository geschoben , können Sie die Datei löschen und ändern die begehen, Genommen von hier :
quelle
untracked
Dateiliste umgit status
.git rm --cached giant_file commit_id
aber es hat nicht funktioniert :(Ich hatte ein ähnliches Problem und habe den obigen Schritt verwendet , um die Datei zu entfernen. Es hat perfekt funktioniert.
Ich habe dann einen Fehler in einer zweiten Datei erhalten, die ich entfernen musste:
remote: error: File <path/filename> is 109.99 MB; this exceeds GitHub's file size limit of 100.00 MB
Ich habe den gleichen Schritt versucht und eine Fehlermeldung erhalten:
"A previous backup already exists in <path/filename>"
Aus Recherchen auf dieser Website habe ich den Befehl verwendet:
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch <path/filename>" --prune-empty --tag-name-filter cat -- --all
Hat super funktioniert und die großen Dateien wurden entfernt.
Unglaublicherweise schlug der Push immer noch mit einem weiteren Fehler fehl:
error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104 fatal: The remote end hung up unexpectedly
Dies habe ich behoben, indem ich die .git-Konfigurationsdatei direkt geändert habe -
postBuffer = 999999999
Danach ging der Push durch!
quelle
git rm
ich den vollständigen Repository-Pfadnamen für die Dateireset hard
Schritt am Ende der Seite mit einem einfachen Druck vermieden . czettner.com/2015/07/16/…Warum lehnt GitHub mein Repo ab, obwohl ich die große Datei gelöscht habe?
Git speichert den vollständigen Verlauf Ihres Projekts. Selbst wenn Sie eine Datei aus Ihrem Projekt "löschen", enthält das Git-Repo eine Kopie der Datei im Verlauf und wenn Sie versuchen, in ein anderes Repository (wie eines, das bei gehostet wird) zu pushen GitHub), dann erfordert Git, dass das Remote-Repo denselben Verlauf hat wie Ihr lokales Repo (dh dieselben großen Dateien in seinem Verlauf).
Wie kann ich GitHub dazu bringen, mein Repo anzunehmen?
Sie müssen den Git-Verlauf Ihres Projekts lokal bereinigen, die unerwünschten großen Dateien aus dem gesamten Verlauf entfernen und anschließend nur den "bereinigten" Verlauf verwenden. Die Git-Commit-IDs der betroffenen Commits ändern sich.
Wie bereinige ich große Dateien aus meinem Git-Repo?
Das beste Tool zum Bereinigen unerwünschter großer Dateien aus dem Git-Verlauf ist der BFG Repo-Cleaner - eine einfachere und schnellere Alternative zum
git-filter-branch
Entfernen unerwünschter Dateien aus dem Git-Verlauf.Befolgen Sie sorgfältig die Gebrauchsanweisung , der Kern ist genau dies:
Alle Dateien mit einer Größe von mehr als 100 MB (die nicht in Ihrem letzten Commit enthalten sind) werden aus dem Verlauf Ihres Git-Repositorys entfernt. Sie können dann
git gc
die toten Daten entfernen:Das BFG ist in der Regel mindestens 10-50x schneller als das Laufen
git-filter-branch
und im Allgemeinen viel einfacher zu bedienen.Vollständige Offenlegung: Ich bin der Autor des BFG Repo-Cleaner.
quelle
Ich habe das gleiche Problem und keine der Antworten funktioniert für mich. Ich habe durch die folgenden Schritte gelöst:
1. Finden Sie heraus, welche Commits die große Datei enthalten
Das unterste Commit ist das älteste Commit in der Ergebnisliste.
2. Finden Sie die kurz vor der ältesten.
Angenommen, Sie haben:
3. Git Rebase
Tipps :
drop
für die Commits enthält die große Datei.git rebase --continue
fortgesetzt werden, bis Sie fertig sind.git rebase --abort
, um sie abzubrechen.quelle
Ich habe alle oben genannten Methoden ausprobiert, aber keine davon funktioniert für mich.
Dann habe ich meine eigene Lösung gefunden.
Zunächst benötigen Sie ein sauberes, aktuelles lokales Repo. Lösche alle verdammt großen Dateien.
Erstellen Sie nun einen neuen Ordner AUSSERHALB Ihres Repo-Ordners und verwenden Sie "Git create repository here", um daraus ein neues Git-Repository zu machen. Nennen wir es new_local_repo. Das ist es! Alle oben genannten Methoden besagten, dass Sie die Historie bereinigen müssen ... nun, ich habe es satt, lassen Sie uns ein neues Repo erstellen, das überhaupt keine Historie hat!
Kopieren Sie die Dateien von Ihrem alten, beschissenen lokalen Repo in das neue, schöne Repo. Beachten Sie, dass das grüne Logo auf dem Ordnersymbol verschwindet. Dies ist vielversprechend, da dies ein neues Repo ist!
Übertragen Sie auf den lokalen Zweig und drücken Sie dann auf den neuen Remote-Zweig. Nennen wir es new_remote_branch. Wenn Sie nicht wissen, wie Sie von einem neuen lokalen Repo aus pushen können, googeln Sie es.
Glückwunsch! Sie haben Ihren sauberen, aktuellen Code an GitHub gesendet. Wenn Sie den Remote-Hauptzweig nicht mehr benötigen, können Sie Ihre new_remote_branch als neuen Hauptzweig festlegen. Wenn Sie nicht wissen, wie es geht, googeln Sie es.
Letzter Schritt, es ist Zeit, das beschissene alte lokale Repo zu löschen. In Zukunft verwenden Sie nur das new_local_repo.
quelle
Dies sollte Ihre lokalen Commits mit den neuen lfs-Referenzen neu schreiben
https://github.com/git-lfs/git-lfs/blob/master/docs/man/git-lfs-migrate.1.ronn?utm_source=gitlfs_site&utm_medium=doc_man_migrate_link&utm_campaign=gitlfs#examples
quelle
Die Lösung, um die großen Dateien / Ordner im Arbeitsordner zu halten
Dies ist die Zeile, mit der das hier gestellte Problem gelöst wurde (aus Antwort 1):
git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD
Dieser Befehl löscht auch die Datei / das Verzeichnis, wenn sich die Datei / das Verzeichnis im Arbeitsbaum befindet.
Wenn Sie die Datei / den Ordner im Arbeitsbaum behalten möchten, schlage ich die folgenden Schritte vor.
git reset HEAD^
Fügen Sie die betreffende Datei / den betreffenden Ordner in die Datei `` .gitignore``` ein.
Gehen Sie wie gewohnt vor
git add .
, um möglicherweise andere Dateien / Ordner zu erfassen, müssen jedoch Dateien erfassen.gitignore
. Weiter istgit commit -m"message"
und endlichgit push origin <branch_name>
quelle
das hat bei mir funktioniert. Dokumentation von github Squashing Git Commits git reset origin / master
Dokumentation finden Sie hier
quelle
Ich füge der ersten Antwort hinzu.
Es wird einen Zusammenführungskonflikt von Ursprung / Master geben.
Bitte führen Sie dies aus
Es wird alle meine inszenierten und nicht inszenierten Änderungen wegwerfen, alles in meiner aktuellen lokalen Niederlassung vergessen und es genau so machen wie origin / master.
quelle
Ich bin also auf eine bestimmte Situation gestoßen: Ich habe ein Repository aus gitlab geklont, das eine Datei mit mehr als 100 MB enthielt, aber irgendwann im Git-Verlauf entfernt wurde. Als ich später ein neues privates Github-Repo hinzufügte und versuchte, auf das neue Repo zu pushen, bekam ich den berüchtigten Fehler "Datei zu groß". Zu diesem Zeitpunkt hatte ich keinen Zugriff mehr auf das ursprüngliche Gitlab-Repo. Ich konnte jedoch weiterhin mithilfe
bfg-repo-cleaner
eines lokalen Repositorys auf meinem Computer auf das neue private Github-Repo zugreifen :quelle
Manchmal wird die Datei im Tracking-Verlauf gespeichert. Führen Sie die folgenden Schritte aus:
git commit
Wenn der Erstellungsmodus mit der aufgelisteten großen Datei angezeigt wird, gehen Sie wie folgt vor :git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch filename' HEAD
. In Ihrer Konsole sollte eine Reihe von Umschreibungen angezeigt werden, die mit Folgendem enden:rm 'Dateiname' und
Die letzte Zeile Ref wurde neu geschrieben.
Es ist fertig.
quelle