В настоящее время у меня есть
- Пустой репозиторий GitHub
- Репозиторий SSH-сервера (основной)
- Местный репо
Репозиторий SSH-сервера был самым современным репо (производственным сайтом), поэтому я сделал клон Git оттуда к локальному. Затем я попытался сделать git push
GitHub.
Все прошло хорошо, но потом что-то говорило о filename.gz, слишком большом для GitHub. Мне не нужен был этот файл, поэтому я запустил несколько команд Git, чтобы избавиться от него из кеша Git, а затем отправил обратно на SSH-сервер.
Я не вижу большой файл локально, но он все еще находится на SSH-сервере, хотя git diff
ничего не возвращает и git push возвращает «Все обновлено» - и даже если файл не отображается в локальном репо, когда я пытаюсь нажать на GitHub Я все еще получаю ошибку об этом
remote: ошибка: файл fpss.tar.gz равен 135,17 МБ; это превышает ограничение размера файла GitHub в 100 МБ
Я следовал инструкциям в разделе «Исправление проблемы», перечисленным в справке GitHub, так что, разве этого было недостаточно?
Как файл остается в эфире, если он не локальный или не указан в git status / diff / push?
git log -- the_big_file
вам что-то возвращает, то файл все еще в истории.git push
сказать, что все обновлено? Поскольку вы изменили историю, она должна была жаловаться на то, что толчок невозможен и вам придется его форсировать.Ответы:
Ты можешь использовать
Это удалит все в истории этого файла. Проблема в том, что файл присутствует в истории.
Эта команда изменяет хэши ваших коммитов, что может быть реальной проблемой, особенно в общих репозиториях. Это не должно выполняться без понимания последствий.
источник
--all
флаг вместоHEAD
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
Я нашел сквош более полезным, чем
filter-branch
. Я сделал следующее:git reset --soft HEAD~3
.git commit -m "New message for the combined commit"
Особый случай (от пользователя @lituo): Если вышеописанное не работает, то у вас может быть этот случай. Фиксация 1 включала в себя большой файл, а передача 1 не удалась из-за большой ошибки файла. Commit 2 удалил большой файл,
git rm --cached [file_name]
но Push 2 все еще не прошел. Вы можете выполнить те же действия, что и выше, но вместо использованияHEAD~3
используйтеHEAD~2
.источник
Вот кое-что, что я нашел очень полезным, если вы уже бездельничали со своим репо до того, как обратились за помощью. Первый тип:
После этого вы должны увидеть что-то вроде
Важной частью является "2 коммитов"! Отсюда, вперед и введите:
Таким образом, для приведенного выше примера можно ввести:
После того, как вы ввели это, ваш «git status» должен сказать:
Оттуда вы можете удалить большой файл (при условии, что вы еще этого не сделали), и у вас должна быть возможность перефиксовать все без потери работы.
Я знаю, что это не супер модный ответ, но я надеюсь, что это поможет!
источник
Если файл был добавлен с вашим последним коммитом , и вы не отправили его в удаленный репозиторий , вы можете удалить файл и изменить коммит, полученный здесь :
источник
untracked
списку файлов вgit status
.git rm --cached giant_file commit_id
но это не сработало :(У меня была похожая проблема, и я использовал описанный выше шаг для удаления файла. Это сработало отлично.
Затем я получил ошибку на втором файле, который мне нужно было удалить:
remote: error: File <path/filename> is 109.99 MB; this exceeds GitHub's file size limit of 100.00 MB
Я попробовал тот же шаг, получил ошибку:
"A previous backup already exists in <path/filename>"
Из исследования на этом сайте я использовал команду:
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch <path/filename>" --prune-empty --tag-name-filter cat -- --all
Работал отлично, и большие файлы были удалены.
Невероятно, но толчок все еще не удался с другой ошибкой:
error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104 fatal: The remote end hung up unexpectedly
Это я исправил, напрямую изменив конфигурационный файл .git -
postBuffer = 999999999
После этого толчок прошел!
источник
git rm
мне нужно было дать полное имя пути к хранилищу для файла и экранировать # с обратной косой чертой, чтобы заставить его работатьreset hard
шага внизу страницы простым нажатием. czettner.com/2015/07/16/…Почему GitHub отказывается от моего репо, даже после того, как я удалил большой файл?
Git хранит полную историю вашего проекта, поэтому, даже если вы «удалите» файл из своего проекта, в репозитории Git по-прежнему будет храниться копия файла в его истории, и если вы попытаетесь отправить его в другое хранилище (например, размещенное на GitHub), то Git требует, чтобы удаленное репо имело ту же историю, что и ваше локальное репо (то есть те же самые большие файлы в его истории).
Как я могу заставить GitHub принять мой репо?
Вам нужно очистить историю Git вашего проекта локально, удалив ненужные большие файлы из всей истории, а затем использовать только «очищенную» историю в дальнейшем. Идентификаторы Git коммитов затронутых коммитов изменятся.
Как убрать большие файлы из моего репозитория Git?
Лучший инструмент для удаления нежелательных больших файлов из истории Git - это BFG Repo-Cleaner - это более простая и быстрая альтернатива
git-filter-branch
специально разработанной для удаления нежелательных файлов из истории Git.Тщательно следуйте инструкциям по использованию , основная часть просто так:
Любые файлы размером более 100 МБ (которых нет в вашем последнем коммите) будут удалены из истории вашего репозитория Git. Затем вы можете использовать
git gc
для очистки мертвых данных:BFG обычно по крайней мере в 10-50 раз быстрее, чем бег
git-filter-branch
, и, как правило, намного проще в использовании.Полное раскрытие: я являюсь автором BFG Repo-Cleaner.
источник
Я перепробовал все вышеперечисленные методы, но ни один из них не работает для меня.
Тогда я придумал собственное решение.
Прежде всего, вам нужен чистый, современный локальный репо. Удалить все чертовски большие файлы.
Теперь создайте новую папку ВНЕ своей папки репо и используйте «Git create репозиторий здесь», чтобы сделать его новым Git-репозиторием, назовем его new_local_repo. Это оно! Все вышеперечисленные методы говорят, что вы должны очистить историю ... ну, я сыт этим по горло, давайте создадим новый репо, у которого вообще нет истории!
Скопируйте файлы из вашего старого, испорченного локального репо в новое, красивое репо. Обратите внимание, что зеленый логотип на значке папки исчезнет, это многообещающе, потому что это новый репо!
Зафиксируйте локальную ветвь и затем нажмите на удаленную новую ветку Давайте назовем это new_remote_branch. Если вы не знаете, как получить доступ к новому локальному репо, отправьте его в Google.
Congrats! Вы отправили свой чистый, обновленный код на GitHub. Если вам больше не нужна удаленная главная ветка, вы можете сделать ваш new_remote_branch новой веткой. Если вы не знаете, как это сделать, Google это.
Последний шаг, пришло время удалить испорченный старый локальный репо. В будущем вы будете использовать только new_local_repo.
источник
У меня та же проблема, и ни один из ответов не работает для меня. Я решил следующие шаги:
1. Найдите, какой коммит (ы) содержит большой файл
Нижний коммит - самый старый коммит в списке результатов.
2. Найдите тот, что перед самым старым.
Предположим, вы получили:
3. Git rebase
Советы :
drop
для коммитов содержит большой файл.git rebase --continue
для продолжения, пока не закончите.git rebase --abort
для отмены.источник
это должно переписать ваши локальные коммиты с новыми ссылками 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
источник
Решение сохранить большие файлы / папки в рабочей папке
Это строка, которая работала, чтобы решить проблему, заданную здесь (из ответа 1):
git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD
Эта команда также удаляет файл / dir, если файл / dir находится в рабочем дереве.
Если вы хотите сохранить файл / папку в рабочем дереве, я предлагаю выполнить следующие шаги.
git reset HEAD^
Добавьте рассматриваемый файл / папку в файл `` .gitignore```.
Действуйте как обычно,
git add .
что может захватывать другие файлы / папки, но должно захватывать.gitignore
файл. Дальшеgit commit -m"message"
и наконецgit push origin <branch_name>
источник
это сработало для меня. документация от github Squashing Git Выполняет git reset origin / master
найти документацию здесь
источник
Поэтому я столкнулся с определенной ситуацией: я клонировал репозиторий из gitlab, который содержал файл размером более 100 МБ, но был удален в какой-то момент в истории git. Позже, когда я добавил новое частное репозиторий github и попытался перейти к новому репо, я получил печально известную ошибку "file too large" К этому моменту у меня больше не было доступа к исходному репозиторию gitlab. Тем не менее, я все еще был в состоянии перейти к новому частному
bfg-repo-cleaner
репозиторию github, используя локальный репозиторий на моей машине:источник
Иногда файл хранится в истории отслеживания, попробуйте следующие шаги:
git commit
, Если вы видите режим создания с большим файлом в списке, то выполните:git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch filename' HEAD
, Вы должны увидеть кучу перезаписей, показанных на вашей консоли, которая заканчивается:рм "имя файла" и
последняя строка Ref была переписана.
Это сделано.
источник
Я добавляю к первому ответу.
Будет возникать конфликт слияния от источника / мастера.
Пожалуйста, запустите это
Он отбросит все мои поэтапные и неустановленные изменения, забудет все в моей текущей локальной ветке и сделает его точно таким же, как origin / master.
источник