Obecnie mam
- Puste repozytorium GitHub
- Repozytorium serwerów SSH (główne)
- Lokalne repozytorium
Repozytorium serwera SSH było najbardziej aktualnym repozytorium (strona produkcyjna), więc zrobiłem klon Git stamtąd na lokalny. Następnie próbowałem zrobić git push
GitHub.
Wszystko poszło dobrze, ale wtedy coś mówiło o tym, że filename.gz jest zbyt duży dla GitHub. Nie potrzebowałem tego pliku, więc uruchomiłem kilka poleceń Git, aby pozbyć się go z pamięci podręcznej Git, a następnie zepchnąłem z powrotem na serwer SSH.
Nie widzę dużego pliku lokalnie, ale nadal znajduje się na serwerze SSH, mimo że git diff
nic nie zwraca, a git push zwraca „Wszystko jest aktualne” - I chociaż plik nie jest widoczny w lokalnym repozytorium, gdy próbuję przepchnąć GitHub Nadal pojawia się błąd
zdalny: błąd: plik fpss.tar.gz ma 135,17 MB; przekracza to limit rozmiaru pliku GitHub wynoszący 100 MB
Postępowałem zgodnie z instrukcjami podanymi w sekcji „Rozwiązywanie problemu” wymienionymi w pomocy GitHub, więc czy to nie powinno wystarczyć?
W jaki sposób plik jest nadal w eterze, gdy nie jest lokalny lub nie ma go na liście git status / diff / push?
git log -- the_big_file
coś ci zwróci, plik jest nadal w historii.git push
mówić , że wszystko jest aktualne? Ponieważ zmieniłeś historię, powinieneś narzekać, że wypychanie nie jest możliwe i że musisz go zmusić.Odpowiedzi:
Możesz użyć
Spowoduje to usunięcie wszystkiego w historii tego pliku. Problem polega na tym, że plik jest obecny w historii.
To polecenie zmienia skróty twoich zatwierdzeń, co może być prawdziwym problemem, szczególnie w przypadku współdzielonych repozytoriów. Nie należy tego robić bez zrozumienia konsekwencji.
źródło
--all
flagi zamiastHEAD
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
Uważam, że squashowanie jest bardziej przydatne niż
filter-branch
. Zrobiłem następujące:git reset --soft HEAD~3
.git commit -m "New message for the combined commit"
Przypadek specjalny (od użytkownika @lituo): Jeśli powyższe nie działa, możesz mieć ten przypadek. Zatwierdzenie 1 obejmowało duży plik, a wypychanie zatwierdzenia 1 nie powiodło się z powodu błędu dużego pliku. Zatwierdzenie 2 usunęło duży plik,
git rm --cached [file_name]
ale wypychaniezatwierdzenia2 nadal nie powiodło się. Możesz wykonać te same kroki powyżej, ale zamiast używaćHEAD~3
, użyjHEAD~2
.źródło
Oto coś, co uważam za bardzo pomocne, jeśli już bawiłeś się swoim repozytorium, zanim poprosiłeś o pomoc. Pierwszy typ:
Po tym powinieneś zobaczyć coś wzdłuż linii
Ważną częścią są „2 zobowiązania”! Stąd śmiało i wpisz:
Tak więc w powyższym przykładzie można wpisać:
Po wpisaniu tego, twój „status git” powinien powiedzieć:
Stamtąd możesz usunąć duży plik (zakładając, że jeszcze tego nie zrobiłeś) i powinieneś być w stanie ponownie wszystko zatwierdzić bez utraty pracy.
Wiem, że to nie jest super fantazyjna odpowiedź, ale mam nadzieję, że to pomoże!
źródło
Jeśli plik został dodany przy użyciu ostatniego zatwierdzenia i nie przeszedłeś do zdalnego repozytorium , możesz usunąć plik i zmienić zatwierdzenie, pobrane stąd :
źródło
untracked
listy plików ogit status
.git rm --cached giant_file commit_id
ale to nie zadziałało :(Miałem podobny problem i użyłem powyższego kroku, aby usunąć plik. Działa idealnie.
Następnie dostał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, wystąpił błąd:
"A previous backup already exists in <path/filename>"
Z badań na tej stronie użyłem polecenia:
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch <path/filename>" --prune-empty --tag-name-filter cat -- --all
Działa świetnie, a duże pliki zostały usunięte.
Niewiarygodnie, wypychanie nadal nie powiodło się z kolejnym błędem:
error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104 fatal: The remote end hung up unexpectedly
Naprawiłem to, modyfikując bezpośrednio plik konfiguracyjny .git -
postBuffer = 999999999
Następnie przeszedł nacisk!
źródło
git rm
I musiałem podać pełną nazwę ścieżki repozytorium dla pliku i uciec od znaku # z odwrotnym ukośnikiem, aby goreset hard
kroku na dole strony za pomocą prostego naciśnięcia. czettner.com/2015/07/16/…Dlaczego GitHub odrzuca moje repozytorium, nawet po usunięciu dużego pliku?
Git przechowuje pełną historię twojego projektu, więc nawet jeśli „usuniesz” plik z projektu, repozytorium Git nadal ma kopię tego pliku w swojej historii, a jeśli spróbujesz przepchnąć się do innego repozytorium (na przykład hostowanego w GitHub), a następnie Git wymaga, że repozytorium zdalne ma tę samą historię, co repozytorium lokalne (tj. Te same duże pliki w swojej historii).
Jak mogę zmusić GitHub do zaakceptowania mojego repo?
Musisz wyczyścić lokalnie historię projektu Git, usuwając niechciane duże pliki z całej historii, a następnie używać tylko „wyczyszczonej” historii. Identyfikatory zatwierdzeń Git zatwierdzonych zmian ulegną zmianie.
Jak wyczyścić duże pliki z mojego repozytorium Git?
Najlepszym narzędziem do usuwania niechcianych dużych plików z historii Git jest BFG Repo-Cleaner - jest to prostsza, szybsza alternatywa
git-filter-branch
specjalnie zaprojektowana do usuwania niechcianych plików z historii Git.Dokładnie postępuj zgodnie z instrukcjami użytkowania , podstawowa część jest taka:
Wszelkie pliki o rozmiarze przekraczającym 100 MB (które nie są w twoim ostatnim zatwierdzeniu) zostaną usunięte z historii repozytorium Git. Następnie możesz użyć
git gc
do usunięcia martwych danych:BFG jest zazwyczaj co najmniej 10-50 razy szybszy niż bieganie
git-filter-branch
i ogólnie jest o wiele łatwiejszy w użyciu.Pełne ujawnienie: jestem autorem BFG Repo-Cleaner.
źródło
Mam ten sam problem i żadna z odpowiedzi nie działa dla mnie. Rozwiązałem następujące kroki:
1. Znajdź, które zatwierdzenie (zatwierdzenia) zawiera duży plik
Dolne zatwierdzenie jest najstarszym zatwierdzeniem na liście wyników.
2. Znajdź ten tuż przed najstarszym.
Załóżmy, że masz:
3. Git rebase
Wskazówki :
drop
bo commits zawiera duży plik.git rebase --continue
aby kontynuować aż do jego zakończenia.git rebase --abort
aby anulować.źródło
Wypróbowałem wszystkie powyższe metody, ale żadna z nich nie działa dla mnie.
Potem wymyśliłem własne rozwiązanie.
Przede wszystkim potrzebujesz czystego, aktualnego repozytorium lokalnego. Usuń wszystkie pieprzone duże pliki.
Teraz utwórz nowy folder NA ZEWNĄTRZ folderu repozytorium 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 musisz wyczyścić historię ... cóż, mam tego dość, stwórzmy nowe repozytorium, które w ogóle nie ma historii!
Skopiuj pliki ze starej, spieprzonej lokalnej repozytorium do nowej, pięknej repozytorium. Pamiętaj, że zielone logo na ikonie folderu zniknie, jest to obiecujące, ponieważ jest to nowe repo!
Zatwierdź do lokalnego oddziału, a następnie wypchnij do zdalnego nowego oddziału. Nazwijmy to new_remote_branch. Jeśli nie wiesz, jak wypchnąć nowe lokalne repozytorium, zrób to Google.
Gratulacje! Przesłałeś swój czysty, aktualny kod do GitHub. Jeśli nie potrzebujesz już zdalnej gałęzi master, możesz uczynić swoją gałąź new_remote_branch nową gałęzią master. Jeśli nie wiesz, jak to zrobić, Google go.
Na ostatnim etapie nadszedł czas, aby usunąć pieprzone stare lokalne repozytorium. W przyszłości będziesz korzystać tylko z new_local_repo.
źródło
to powinno ponownie napisać twoje lokalne commity z nowymi referencjami lfs
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
źródło
Rozwiązanie do przechowywania dużych plików / folderów w folderze roboczym
Oto linia, która zadziałała w celu rozwiązania problemu zadanego tutaj (od 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 działającym drzewie.
Jeśli chcesz zachować plik / folder w działającym drzewie, proponuję wykonać następujące kroki.
git reset HEAD^
Dodaj dany plik / folder do pliku `` .gitignore ''.
Postępuj jak zwykle,
git add .
co może przechwytywać inne pliki / foldery, ale musi przechwytywać.gitignore
plik. Dalej jestgit commit -m"message"
i nareszciegit push origin <branch_name>
źródło
to działało dla mnie. dokumentacja z github Squashing Git Commits git reset origin / master
znajdź dokumentację tutaj
źródło
Dodaję do pierwszej odpowiedzi.
Wystąpi konflikt scalania z pochodzenia / wzorca.
Uruchom to
Odrzuci wszystkie moje inscenizowane i nieetapowe zmiany, zapomni o wszystkim w moim obecnym oddziale lokalnym i sprawi, że będzie dokładnie taki sam jak origin / master.
źródło
Tak więc napotkałem szczególną 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 git. Później, kiedy dodałem nowe prywatne repozytorium github i próbowałem wypchnąć nowe repo, otrzymałem niesławny błąd „zbyt duży plik”. W tym momencie nie miałem już dostępu do oryginalnego repozytorium gitlab. Nadal byłem jednak w stanie przesłać do nowego prywatnego repozytorium github przy użyciu
bfg-repo-cleaner
repozytorium LOCAL na moim komputerze:źródło
Czasami plik jest przechowywany w historii śledzenia, spróbuj wykonać następujące czynności:
git commit
, Jeśli widzisz tryb tworzenia z wymienionym dużym plikiem, wykonaj następujące czynności:git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch filename' HEAD
. Powinieneś zobaczyć kilka Rewrites pokazanych w konsoli, które kończą się na:rm „nazwa pliku” i
ostatnia linia Ref została przepisana.
Zrobione.
źródło