Git push после удаления большого файла

Я случайно запустил log/test.log, но никогда не подталкивал его. С тех пор я сделал git rm, чтобы избавиться от него. Но когда я пытаюсь нажать, я все равно получаю огромное количество данных, которые пытаются передать. Разве это не проблема git rm. Если нет, как я могу это исправить?

Ответ 1

Не отменяйте фиксацию, а затем нажмите, потому что огромный массив по-прежнему будет перенесен в историю.

Учитывая, что вы еще не нажали его и что фиксация, которую вы хотите переделать, является самой последней, удалите эту фиксацию из своей истории:

$ git reset HEAD^

Это вернет ваш индекс в состояние, в котором он находился, на родительском коммите (HEAD^). Теперь у вас есть mulligan: добавьте и зафиксируйте то, что вы имели в виду в первый раз.

Если вы совершили другие последующие коммиты, вам нужно git rebase -i <commit>, где <commit> является SHA-1 родителя плохого фиксации.

Например (и обратите внимание, что SHA-1 будет отличаться в вашем репо)

$ git rebase -i 57d0b28

выведет вас в редактор, похожий на

pick 366eca1 This has a huge file
pick d975b30 delete foo
pick 121802a delete bar

# Rebase 57d0b28..121802a onto 57d0b28
#
# 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
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Замените pick на edit на линии с тяжелой фиксацией

edit 366eca1 This has a huge file
pick d975b30 delete foo
pick 121802a delete bar

Сохраните и закройте редактор, чтобы вернуться в оболочку, где вы увидите сообщение формы

Stopped at 366eca1... This has a huge file
You can amend the commit now, with

    git commit --amend

Once you are satisfied with your changes, run

    git rebase --continue

Оттуда удалите оскорбительный файл (--cached удаляет файл только из индекса)

$ git rm --cached big-nasty-file
rm 'big-nasty-file'

изменить фиксацию

$ git commit --amend

и завершить rebase

$ git rebase --continue

Ответ 2

Если вы не нажали, вы можете использовать git rebase -i для редактирования истории фиксации, удаляя как add, так и rm. Одно из предостережений заключается в том, что вы должны быть осторожны, чтобы не редактировать какие-либо коммиты, которые уже были нажаты.

http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive

Вы спросили, можете ли вы все это сделать, если есть другие изменения в фиксации и другие коммиты после этого. Это зависит. Вы должны иметь возможность редактировать/удалять любые неустановленные фиксации, а не только самые последние. Но rebase может выйти из строя, если последующие изменения сильно зависят от изменений в удаленной фиксации (например, вы добавили файл, а затем отредактировали его позже). Если вы удалите фиксацию, вы потеряете все изменения в этой фиксации. Я не знаю, как удалить одно изменение из фиксации. Если вы не хотите потерять другие изменения в commit.rb commit, вы можете сгенерировать патч (с помощью git show <commitid> > /tmp/patch или со встроенными функциями git patch) перед удалением фиксации. Затем отредактируйте файл исправления, чтобы удалить большой файл test.rb, но оставьте желаемые изменения и повторно примените патч к голове.

Если у вас есть проблема, о которой я упоминал ранее, когда rebase терпит неудачу (или вы считаете, что это не сработает), вы можете сохранить исправления для всех своих коммитов после того, как проблема будет зафиксирована, удалить все их и повторно применить их в порядке.