Найти в Дзене
LITVINOV-UPGRADE-LINUX

Gitflic - как исправить, если не удается сделать push последнего коммита

В Gitflic есть ограничение на размер коммита - 100Мб. Это вполне нормально, но бывают случаи когда в репозитории с документацией удобно держать небольшое видео или pdf. Ошибочное решение
Кажется, что решение очевидно: удалить один файл и сделать новый коммит. Но это не поможет. Git хранит всю историю, и в предыдущем коммите большой файл уже сохранён. При push система проверяет всю цепочку коммитов, включая старые. Правильное решение: объединить коммиты с помощью rebase Идея в том, чтобы объединить два проблемных коммита (добавление файлов и удаление одного из них) в один. На этапе объединения лишний файл будет окончательно удалён из истории, и новый, "очищенный" коммит можно будет успешно отправить на сервер. Допустим, у нас есть три последних коммита: Нам нужно объединить их в один. Это делается с помощью интерактивного ребейза git rebase -i. Давайте разберём пример. Мы хотим объединить три последних коммита в ветке в один коммит. Для этого выполняем команду: git rebase -i HEAD~3
Оглавление

Введение

В Gitflic есть ограничение на размер коммита - 100Мб. Это вполне нормально, но бывают случаи когда в репозитории с документацией удобно держать небольшое видео или pdf.

Проблема

Представим сценарий:

  1. В папку doc добавили два видеофайла по 51 МБ каждый.
  2. Сделали коммит. Суммарный размер изменений (~102 МБ) превышает лимит в 100 МБ.
  3. Попытка выполнить push отклонена с ошибкой.

Ошибочное решение
Кажется, что решение очевидно: удалить один файл и сделать новый коммит. Но это
не поможет. Git хранит всю историю, и в предыдущем коммите большой файл уже сохранён. При push система проверяет всю цепочку коммитов, включая старые.

Правильное решение: объединить коммиты с помощью rebase

Идея в том, чтобы объединить два проблемных коммита (добавление файлов и удаление одного из них) в один. На этапе объединения лишний файл будет окончательно удалён из истории, и новый, "очищенный" коммит можно будет успешно отправить на сервер.

Пошаговая инструкция по интерактивному rebase

Допустим, у нас есть три последних коммита:

  1. Коммит 3: Удаление файла video2.mp4 (попытка исправить ситуацию).
  2. Коммит 2: Добавление файла video2.mp4.
  3. Коммит 1: Добавление файла video1.mp4.

Нам нужно объединить их в один.

rebase

Это делается с помощью интерактивного ребейза git rebase -i. Давайте разберём пример. Мы хотим объединить три последних коммита в ветке в один коммит. Для этого выполняем команду:

git rebase -i HEAD~3

Откроется окно текстового редактора интерактивного ребейза:

pick bcdc461 fix something
pick 4133a5f the awesome commit
pick e0ca1b1 the last commit

# Rebase 44211de..e0cga8b onto 55012de
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell

Тут нужно заменить pick на squash для двух последних коммитов. Список читается снизу вверх, таким образом последний коммит, это самый нижний коммит в списке.

pick bcdc461 fix something
squash 4133a5f the awesome commit
squash e0ca1b1 the last commit

# Rebase 44211de..e0cga8b onto 55012de
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell

Сохраняем файл и в следующем открывшемся окне вводим комментарий для нового коммита. Аналогично сохраняем файл. Смотрим git log и проверяем, что всё получилось.

Заметка: Если редактор не переопределен, эти строки будут выведены в vim. Чтобы выйти из редактирования нажмите [Ctrl]+C и дальше ввести :w (это сохранить изменения) и :wq (сохранить и выйти)

Если файл больше 100Mб

У каждого репозитория есть ограничение 4Гб свободного места, если нужно прикрепить большой файл или сборку

Заходим во вкладку [Релизы] - и туда можно уже добавить файлы больше 100Мб

Ссылки

Как объединить несколько коммитов в один git - Q&A Хекслет
Как выйти из редактора git-rebase-todo?
Git LFS - Документация
Проекты - Документация