Как исправить застрявший GitHub Push

  • Введение
  • Диагностика проблемы
  • Причина проблемы
  • Решение
    • Шаг 1. Проверка журнала фиксации
    • Шаг 2. Сброс коммита на последний опубликованный коммит
    • Шаг 3. Добавьте файлы
    • Шаг 4. Зафиксируйте файлы
    • Шаг 5. Переместить файлы
    • Шаг 6. Промыть и повторить
  • Заключение
  • Ссылки

Введение

Недавно у меня возникла проблема, когда коммит, который я отправлял на GitHub, просто застрял в VS Code. Он просто показывал индикатор выполнения слева направо, а значок таймера отображался на значке управления исходным кодом.

Диагностика проблемы

Используя различные инструменты, я не смог найти причину возникновения проблемы. Вывод данных для push в VS Code ничего не показал, а команда git log просто показала, что коммит есть, но поскольку голова не двигалась, он не был отправлен на GitHub. Также проверка истории коммитов в репозитории GitHub в браузере не показала никаких признаков коммита.

Я попытался закрыть VS Code, открыть его заново, а затем снова выполнить push, думая, что он мог просто застрять в эфире межсетевого пространства, но все повторилось снова.

Переключение на терминал (не тот, что в VS Code) и выполнение git push оттуда привело к такому же поведению.

Ничто не указывало на ошибку. Downdetector показал, что на GitHub нет сообщений о проблемах, и это не расширение контроля исходных кодов VS Code виновато.

Причина проблемы

Итак, в чем же заключалась проблема и каково было ее решение?

Я свел проблему к тому, что слишком много файлов, в частности изображений, загружалось в один момент времени. Я уже делал коммит и пуш с большим количеством файлов исходного кода, но не с большим количеством изображений.

Эти файлы изображений (PNG) не были огромными по размеру (50KB — 150KB), что намного меньше максимального размера для GitHub, но они просто не отправлялись.

Решение

Решение, которое я придумал, выглядит следующим образом.

Примечание: Хотя это решение предназначено для GitHub, нет причин, почему оно не будет работать для других поставщиков репозиториев на основе git, таких как AWS CodeCommit, Azure DevOps или GitLab.

Шаг 1. Проверка журнала коммитов

Отказ от ответственности: Если у вас есть коммиты, ожидающие push, они будут потеряны.

Также, пожалуйста, сделайте резервную копию ваших файлов перед началом этого шага. Как говорится, лучше перестраховаться, чем потом жалеть.

Учитывая вышесказанное, сначала откройте терминал с помощью выбранного вами приложения. Далее, cd в каталог, где находится ваш git-репозиторий на локальной машине.

Затем запустите:

git log
Войти в полноэкранный режим Выйти из полноэкранного режима

В результате вы получите список коммитов, как показано ниже.

Шаг 2. Сброс коммита на последний опубликованный коммит

Теперь, когда вы видите список коммитов, следующий шаг — сбросить голову коммита на последний известный хороший коммит. Как правило, последний известный хороший коммит будет иметь (origin/main) рядом с ID коммита. Вам нужно выделить и скопировать номер. Пример идентификатора фиксации показан на рисунке ниже, он выделен синим цветом.

Скопировав номер, вы можете выполнить команду reset, чтобы вернуть локальный репозиторий к этому коммиту, который затем очистит все коммиты, сделанные после него.

git reset commit-id
Вход в полноэкранный режим Выход из полноэкранного режима

Пример показан ниже.

После выполнения сброса все коммиты после этого ID коммита исчезнут. Например, на рисунке ниже показано, что коммит «Добавлены изображения и блокнот» теперь удален.

Коммит, вызвавший проблему, по-прежнему будет виден в локальном списке коммитов, когда вы запустите git reflog, но когда вы сдвинете коммит, эти коммиты не будут сдвинуты и фактически будут потеряны, так как они не будут отображаться в истории GitHub.

Шаг 3. Добавьте файлы

Теперь, когда коммит, вызвавший проблему, был очищен, настало время попробовать снова выполнить коммит и push. Именно здесь находится решение проблемы.

Решение заключается в том, чтобы разбить каждый коммит на более мелкие партии примерно по пять файлов, продвинуть этот коммит, а затем перейти к следующему. При переходе к следующему коммиту вы можете попробовать увеличивать количество файлов каждый раз, пока проблема не возникнет снова. В этот момент просто вернитесь к первому шагу и продолжите работу с меньшим количеством файлов.

Сначала давайте посмотрим на список файлов, которые не фиксируются/отслеживаются.

git status
Вход в полноэкранный режим Выход из полноэкранного режима

Список файлов, которые не были зафиксированы / отслежены, выделен красным цветом.

Теперь, когда мы знаем, какие файлы должны быть зафиксированы, следующим шагом будет добавление пяти из этих файлов для отслеживания и добавления в следующий коммит. Для этого используйте команду git add. Например:

git add assets/images/2-2-1.png assets/images/2-3-1.png assets/images/2-4-1.png assets/images/3-1-1.png assets/images/3-2-1.png

Войти в полноэкранный режим Выйти из полноэкранного режима

Шаг 4. Зафиксировать файлы

Теперь, когда файлы добавлены, следующим шагом будет создание фиксации. Здесь не нужно делать ничего другого, чем обычно.

git commit -m "Change message to something suitable"
Войти в полноэкранный режим Выйти из полноэкранного режима

Что вы можете сделать, так это использовать одно и то же сообщение о фиксации для каждой фиксации или использовать разное сообщение для каждой партии.

Шаг 5. Переместите файлы

Наконец, выполните push фиксации на GitHub обычным образом.

git push
Вход в полноэкранный режим Выйдите из полноэкранного режима

Если вы снова запустите git log, то рядом с origin/main теперь должно стоять HEAD -> main (или имя ветки, которую вы используете). Например:

Шаг 6. Промыть и повторить

После успешной отправки коммита на GitHub повторите шаги со второго по пятый, пока все файлы не будут отправлены на GitHub.

Заключение

Эта странная проблема возникала у меня несколько раз, и каждый раз мне удавалось решить проблему с застрявшим push’ом с помощью приведенного выше решения.

Если у вас есть другие способы решения этой проблемы, пожалуйста, оставьте свои предложения в комментариях.

Спасибо за прочтение и хорошего дня!

Ссылки

Документация по сбросу Git

Git reset локального коммита

Оцените статью
devanswers.ru
Добавить комментарий