Подтвердить что ты не робот

Как удалить слишком большой файл в фиксации, когда моя ветка впереди мастера на 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, я получаю следующую ошибку: "Не могу переписать ветки: у вас есть неустановленные изменения".

Спасибо заранее!

4b9b3361

Ответ 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