git push после удаления большого файла - PullRequest
6 голосов
/ 24 февраля 2010

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

Ответы [ 2 ]

11 голосов
/ 24 февраля 2010

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

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

$ git reset HEAD^

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

Если вы сделали другие последующие коммиты, вам нужно будет 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

и закончить ребаз

$ git rebase --continue
2 голосов
/ 24 февраля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...