Я случайно запустил log/test.log, но никогда не подталкивал его. С тех пор я сделал git rm, чтобы избавиться от него. Но когда я пытаюсь нажать, я все равно получаю огромное количество данных, которые пытаются передать. Разве это не проблема git rm. Если нет, как я могу это исправить?
Git push после удаления большого файла
Ответ 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 терпит неудачу (или вы считаете, что это не сработает), вы можете сохранить исправления для всех своих коммитов после того, как проблема будет зафиксирована, удалить все их и повторно применить их в порядке.