Nie mogę nacisnąć na GitHub z powodu dużego pliku, który już usunąłem

Obecnie mam

  1. Empty GitHub repo
  2. SSH server repo (main)
  3. Local Repo

SSH server repo był najbardziej aktualnym repo (miejscem produkcji), więc zrobiłem stamtąd Git clone do lokalnego. Następnie próbowałem zrobić git push na Githubie.

Wszystko poszło dobrze, ale potem było napisane coś o nazwie pliku.gz jest za duży dla Githuba. Nie potrzebowałem tego pliku, więc uruchomiłem kilka komend Git, aby pozbyć się go z pamięci podręcznej Git, a następnie odepchnąłem na serwer SSH.

Nie widzę lokalnie dużego pliku, ale nadal jest on na serwerze SSH, mimo że git diff nie zwraca nic, a git push zwraca "wszystko jest aktualne"-i nawet jeśli plik nie jest widoczny w lokalnym repo kiedy próbuję wcisnąć GitHub, wciąż pojawia się błąd

Remote: error: File fpss.smoła.gz to 135.17 MB; to przekracza limit rozmiaru pliku GitHub 100 MB

Wykonałem kroki pod "naprawianie problemu "wymienione w Pomocy GitHub więc czy to nie powinno wystarczyć?

W Jaki Sposób plik jest nadal w ether, jeśli nie jest lokalny lub wymieniony w git status/diff / push?

Author: random, 2013-10-24

18 answers

Możesz użyć

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

Spowoduje to usunięcie wszystkiego z historii tego pliku. Problem polega na tym, że plik jest obecny w historii.

To polecenie zmienia skróty Twoich commitów, co może być prawdziwym problemem, szczególnie w repozytoriach współdzielonych. Nie należy go wykonywać bez zrozumienia konsekwencji.

 499
Author: MacGyver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-17 08:00:30

Znalazłem zgniatanie bardziej przydatne niż filter-branch. Zrobiłem co następuje:

  1. lokalnie usuń duże pliki.
  2. Zatwierdź lokalne usuwanie.
  3. Soft reset back x liczba commitów (dla mnie było to 3): git reset --soft HEAD~3.
  4. następnie ponownie wszystkie zmiany razem (AKA squash) git commit -m "New message for the combined commit"
  5. Push squashed commit.

przypadek szczególny (od user @lituo): jeśli powyższe nie działa, to możesz mieć ten przypadek. Commit 1 zawiera wciśnięcie dużego pliku i zatwierdzenia 1 nie powiodło się z powodu błędu dużego pliku. Commit 2 usunął duży plik przez git rm --cached [file_name], ale wciśnięcie Commita 2 nadal nie powiodło się. Możesz wykonać te same kroki, ale zamiast używać HEAD~3, Użyj HEAD~2.

 97
Author: But I'm Not A Wrapper Class,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-06 19:23:48

Oto coś, co uznałem za bardzo pomocne, jeśli już bawiłeś się ze swoim repo, zanim poprosiłeś o pomoc. Pierwszy typ:

git status

Po tym, powinieneś zobaczyć coś w stylu

On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

Ważną częścią jest "2 commity"! Stąd śmiało wpisz:

git reset HEAD~<HOWEVER MANY COMMITS YOU WERE BEHIND>

Tak więc w powyższym przykładzie należy wpisać:

git reset HEAD~2

Po wpisaniu tego, twój "git status" powinien brzmieć:

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Stamtąd możesz usunąć duży plik (zakładając, że jeszcze tego nie zrobiłeś) i powinieneś być w stanie ponownie zaangażować wszystko bez utraty pracy.
Wiem, że to nie jest super fantazyjna odpowiedź, ale mam nadzieję, że pomoże!

 90
Author: Shreya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-23 21:41:54

Jeśli plik został dodany wraz z ostatnim commitem, a Ty nie wepchnąłeś do zdalnego repozytorium, możesz usunąć plik i zmienić commit, pobrany z tutaj:

git rm --cached giant_file
    # Stage "giant_file" for removal with "git rm"
    # Leave it on disk with "--cached". if you want to remove it from disk
    # then ignore the "--cached" parameter
git commit --amend -CHEAD
    # Commit the current tree without the giant file using "git commit"
    # Amend the previous commit with your change "--amend" 
    # (simply making a new commit won't work, as you need
    # to remove the file from the unpushed history as well)
    # Use the log/authorship/timestamp of the last commit (the one we are
    # amending) with "-CHEAD", equivalent to --reuse-message=HEAD
git push
    # Push our rewritten, smaller commit with "git push"
 41
Author: BlueMoon93,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-03 10:41:39

Miałem podobny problem i użyłem kroku powyżej, aby usunąć plik. Zadziałało idealnie.

Otrzymałem błąd w drugim pliku, który musiałem usunąć: remote: error: File <path/filename> is 109.99 MB; this exceeds GitHub's file size limit of 100.00 MB

Próbowałem tego samego kroku, dostałem błąd: "A previous backup already exists in <path/filename>"

Z badań tej strony użyłem komendy: git filter-branch --force --index-filter "git rm --cached --ignore-unmatch <path/filename>" --prune-empty --tag-name-filter cat -- --all

Działało świetnie, a duże pliki zostały usunięte.

To naprawiłem bezpośrednio modyfikując the .plik konfiguracyjny git - postBuffer = 999999999

/ Align = "left" /
 14
Author: Andre Odendaal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-30 18:21:39

Dlaczego GitHub odrzuca mój repo, nawet po tym, jak usunąłem duży plik?

Git przechowuje pełną historię twojego projektu, więc nawet jeśli 'usuniesz' plik z twojego projektu, repo Git nadal ma kopię tego pliku w swojej historii, a jeśli spróbujesz przenieść go do innego repozytorium (np. hostowanego na GitHub), to Git wymaga zdalnego repo ma tę samą historię, co twój lokalny repo (tj. te same duże pliki w swojej historii).

Jak mogę zmusić Githuba do zaakceptowania mojego repo?

Musisz wyczyścić historię Gita lokalnie, usuwając niechciane duże pliki z całej historii, a następnie używać tylko "oczyszczonej" historii. Identyfikatory git commit dla tych zmian ulegną zmianie.

Jak wyczyścić duże pliki z mojego Git repo?

Najlepszym narzędziem do czyszczenia niechcianych dużych plików z historii Gita jest BFG Repo-Cleaner - to prostsza i szybsza alternatywa dla git-filter-branch zaprojektowana specjalnie do usuwania niechcianych plików pliki z historii Gita.

Uważnie postępuj zgodnie z instrukcjami użycia , podstawowa część jest taka:

$ java -jar bfg.jar --strip-blobs-bigger-than 100M my-repo.git

Wszystkie pliki o rozmiarze powyżej 100MB (które nie znajdują się w Twoimnajnowszym commicie) zostaną usunięte z historii Twojego repozytorium Git. Następnie możesz użyć git gc, aby wyczyścić martwe DANE:

$ git gc --prune=now --aggressive
BFG jest zwykle co najmniej 10-50x szybszy niż bieganie git-filter-branch i ogólnie dużo łatwiejszy w użyciu.

Pełna wersja: jestem autorem BFG Repo-Cleaner.

 14
Author: Roberto Tyley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-03 15:53:08

Próbowałem wszystkich powyższych metod, ale żadna z nich nie działa dla mnie.

Potem wymyśliłem własne rozwiązanie.

  1. Po pierwsze, potrzebujesz czystego, aktualnego lokalnego repo. Usuń wszystkie pieprzone duże pliki.

  2. Teraz utwórz nowy folder poza folderem repo i użyj "Git create repository here", aby uczynić go nowym repozytorium Git, nazwijmy go new_local_repo. To jest to! Wszystkie powyższe metody mówiły, że trzeba wyczyścić historię... mam dość. to, stwórzmy nowy repo, który w ogóle nie ma historii!

  3. Skopiuj pliki ze starego, zjebanego lokalnego repo do nowego, pięknego repo. Zauważ, że zielone logo na ikonie folderu zniknie, jest to obiecujące, ponieważ jest to nowy repo!

  4. Zatwierdź do lokalnej gałęzi, a następnie wciśnij do zdalnej nowej gałęzi. Nazwijmy to new_remote_branch. Jeśli nie wiesz, jak wypchnąć z nowego lokalnego repo, Wygoogluj go.

  5. Gratulacje! Popchnąłeś Twój czysty, aktualny kod do GitHub. Jeśli nie potrzebujesz już zdalnej gałęzi master, możesz utworzyć new_remote_branch jako nową gałąź master. Jeśli nie wiesz, jak to zrobić, Wygoogluj to.

  6. Ostatni krok, nadszedł czas, aby usunąć pieprzone stare lokalne repo. W przyszłości używasz tylko new_local_repo.

 8
Author: Shuaibin Chang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-29 05:52:04

Mam ten sam problem i żadna z odpowiedzi nie działa na mnie. Rozwiązałem następujące kroki:

1. Znajdź, które commity zawierają duży plik

git log --all -- 'large_file`

Dolny commit to najstarszy commit na liście wyników.

2. Znajdź tę tuż przed najstarszą.

git log

Załóżmy, że masz:

commit 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

3. Git rebase

git rebase -i 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

Porady :

  1. pozycja listy
  2. wybieram drop ponieważ commity zawierają duży plik.
  3. możesz napotkać konflikty podczas rebase napraw je i użyj git rebase --continue, aby kontynuować, dopóki go nie skończysz.
  4. jeśli coś poszło nie tak podczas rebase użyj git rebase --abort, aby go anulować.
 4
Author: William Hu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-14 16:13:55
git lfs migrate import --include="fpss.tar.gz"

To powinno ponownie napisać lokalne commity z nowym LFS refs

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

 2
Author: Anthony Hull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-10 16:00:10

Rozwiązanie do przechowywania dużych plików / folderów w folderze roboczym

To jest linia, która zadziałała, aby rozwiązać zadany tutaj problem (z odpowiedzi 1):

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

To polecenie usuwa również plik / katalog, jeśli plik / katalog znajduje się w drzewie roboczym.

Jeśli chcesz zachować plik / folder w działającym drzewie, proponuję wykonać następujące kroki.

  1. Po tym błędzie uruchom git reset HEAD^
  2. Dodaj dany plik / folder do ``.gitignore "' plik.

  3. Postępuj jak zwykle git add ., które mogą przechwytywać inne pliki / foldery, ale muszą przechwytywać plik .gitignore. Dalej jest git commit -m"message" i wreszcie git push origin <branch_name>

 2
Author: Kiprono Elijah Koech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-14 18:23:25

Moje niekonwencjonalne, ale proste rozwiązanie od podstaw:

  • po prostu zapomnij o swoim ostatnim problematycznym lokalnym repozytorium git i git clone Twoje repozytorium do nowego katalogu.
  • git remote add upstream <your github rep here>
  • git pull upstream master
  • w tym momencie wystarczy skopiować nowe pliki, aby zatwierdzić, do nowego lokalnego rep ze starego może zawierać teraz zmniejszone pliki giant.
  • git add .
  • git commit -m "your commit text here"
  • git push origin master
Voila! w moim przypadku zadziałało jak urok.
 1
Author: Emre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-29 19:28:28

To mi pomogło. dokumentacja z github Squashing Git Commits git reset origin / master

git checkout master && git pull;
git merge feature_branch;
git add . --all;
git commit -m "your commit message"

Znajdź dokumentację tutaj

 0
Author: Njoroge Mathu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-03 18:50:05

Napotkałem więc konkretną sytuację: sklonowałem repozytorium z gitlab, które zawierało plik większy niż 100 mb, ale zostało usunięte w pewnym momencie historii Gita. Później, gdy dodałem nowy prywatny repo github i próbowałem wcisnąć do nowego repo, dostałem niesławny błąd "file too large". W tym momencie nie miałem już dostępu do oryginalnego repo gitlab. Mimo to udało mi się wcisnąć do nowego prywatnego repo Githuba używając bfg-repo-cleaner na lokalnym repozytorium na mojej maszynie:

$ cd ~
$ curl https://repo1.maven.org/maven2/com/madgag/bfg/1.13.0/bfg-1.13.0.jar > bfg.jar
$ cd my-project
$ git gc
$ cd ../
$ java -jar bfg.jar --strip-blobs-bigger-than 100M my-project
$ cd my-project
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
$ git remote -v # confirm origin is the remote you want to push to
$ git push origin master
 0
Author: Donato,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-23 21:19:06

Czasami plik jest przechowywany w historii śledzenia, spróbuj wykonać następujące kroki:

  1. git commit, jeśli widzisz create mode z dużym plikiem na liście, wykonaj:
  2. git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch filename' HEAD. Powinieneś zobaczyć kilka poprawek w konsoli, które kończą się na:

    Rm 'nazwa pliku' i

    Ostatni wiersz Ref został przepisany.

Zrobione.
 0
Author: Tree DR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-08 16:14:07

Miałem ten problem, gdy nie miałem pliku gitignore z moim projektem iOS

Myślę, że może próbował wcisnąć ogromny plik do Githuba i github prawdopodobnie odrzucał ten gigantyczny plik or (files)

 0
Author: MobileMon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-03 22:02:22

Dodaję do pierwszej odpowiedzi.

Git filter-branch --index-filter 'GIT rm-r --cached --ignore-unmatch' HEAD

Będzie jakiś konflikt merge z origin / master.

Twoja gałąź i 'origin / master' się rozeszły, i mają odpowiednio 114 i 109 różnych commitów. (użyj "git pull", aby połączyć zdalną gałąź z Twoją)

Proszę uruchom to

Git reset --hard origin / master

It wyrzuci wszystkie moje zainscenizowane i nieakcentowane zmiany, zapomni o wszystkim na moim obecnym lokalnym oddziale i sprawi, że będzie dokładnie taki sam jak origin / master.

 -1
Author: RAHUL KUMAR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-28 14:49:00

Zamiast robić skomplikowane rzeczy, skopiuj repo (na komputerze) w inne miejsce. Usuń duży plik. popchnij i pociągnij. Wtedy niektóre z Twoich plików będą pomieszane mając takie rzeczy jak "

 -1
Author: OverFlow Police,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-04 07:25:56

Spraw, aby lokalny repo pasował do zdalnego repo z:

git reset --hard origin/master

Następnie naciśnij ponownie.

 -1
Author: Bishwas Mishra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-29 23:40:15