Как удалить слишком большой файл в фиксации, когда моя ветка впереди мастера на 5 коммиттов
Я весь день занимался этой проблемой, ища ответ здесь:(...
Контекст
Я работаю один над проектом, и до сих пор я использовал github для сохранения моей работы, кроме моего компьютера.
К сожалению, я добавил очень большой файл в локальный репозиторий: 300mb (которые превышают лимит Github).
Что я сделал
Я попытаюсь сделать историю того, что я сделал:
-
Я (тупо) добавил все к индексу:
git add *
-
Я совершил изменения:
git commit -m "Blablabla"
-
Я попытался нажать на главный хозяин
git push origin master
Потребовалось некоторое время, поэтому я просто CTRL + C и повторил шаги 2 и 3 четыре раза, пока не понял, что файл слишком велик, чтобы его можно было нажать на github.
-
Я сделал ужасную ошибку, чтобы удалить мой большой файл (я не помню, сделал ли я git rm или простой rm)
-
Я выполнил инструкции (https://help.github.com/articles/remove-sensitive-data)
-
Когда я пытаюсь развернуть ветвь git, я получаю следующую ошибку: "Не могу переписать ветки: у вас есть неустановленные изменения".
Спасибо заранее!
Ответы
Ответ 1
Когда вы удалите файл, это будет изменение, и это неустановленное изменение, о котором жалуется git. Если вы выполняете статус git, вы должны увидеть файл, указанный как удаленный/удаленный. Чтобы отменить это изменение, вы должны git checkout -- <filename>
. Затем файл вернется и ваша ветка должна быть чистой. Вы также можете git reset --hard
вернуть ваше репо к статусу, в котором вы совершили фиксацию.
Я предполагаю, что это последняя фиксация, которая имеет очень большой файл, который вы хотите удалить. Вы можете сделать git reset HEAD~
Затем вы можете переделать фиксацию (не добавляя большой файл). Тогда вы можете быть в состоянии git push
без проблем.
Поскольку файл не находится в последнем коммите, вы можете делать заключительные шаги без проблем. Вам просто нужно, чтобы ваши изменения были зафиксированы или удалены.
http://git-scm.com/book/en/Git-Tools-Rewriting-History
Ответ 2
Решение github довольно аккуратно. Я сделал несколько коммитов, прежде чем нажимать, так что это труднее отменить. Решение Githubs:
Удаление файла, добавленного в более старую фиксацию
Если большой файл был добавлен в более раннюю фиксацию, вам нужно будет удалить его из истории вашего репозитория. Самый быстрый способ сделать это - это BFG (более быстрая и простая альтернатива git -filter-branch):
bfg --strip-blobs-bigger-than 50M
# Git history will be cleaned - files in your latest commit will *not* be touched
https://help.github.com/articles/working-with-large-files/
https://rtyley.github.io/bfg-repo-cleaner/
Ответ 3
Простое решение, которое я использовал:
-
Сделайте git reset HEAD^
для того, чтобы зафиксировать все, что вы хотите отменить, он сохранит ваши изменения и ваше фактическое состояние ваших файлов, просто очистив их.
-
Как только коммиты отменены, вы можете подумать о том, как лучше зафиксировать свои файлы, например: удаление огромных файлов, а затем добавление желаемого и последующее завершение.
Ответ 4
Кажется, ваша единственная проблема - это неустановленные изменения. Вы не дали никаких подробностей о том, что на самом деле не синхронизировано, так что это выстрел в темноте, но если вы выполните простой файл rm
d на шаге 4, вы вернете его из индекса с помощью:
git checkout large_file
Если нет, вы сами. Ваша цель - убедиться, что ваш индекс и рабочее дерево находятся в одном состоянии. Это показывает, что git status
не сообщает ничего для фиксации, рабочий каталог чист.
Ядерный вариант обеспечения чистого дерева будет git reset --hard
. Если вы хотите попробовать, сделайте резервную копию своего дерева + репо заранее.
Как только ваша рабочая копия будет чистой, вы можете перейти к шагам 5 и 6.
Ответ 5
Это относится к сообщению BFG выше, я бы прокомментировал это напрямую, но я понятия не имею, как сделать это как нового пользователя с низкой репутацией.
Вы можете сначала выполнить 'git gc' для переупаковки.
У меня возникли проблемы с тем, что BFG работал до тех пор, пока я это не сделал, это, по-видимому, является обычной проблемой, если вы только работали в локальном репо и вначале готовили материал для пуска на удаленный компьютер.
Релевантный google-хит, который подтолкнул меня к нему: https://github.com/rtyley/bfg-repo-cleaner/issues/65