Удалить файл из определенных коммитов git, оставив локальную версию без изменений - PullRequest
0 голосов
/ 11 декабря 2018

Ситуация следующая: у нас есть файл A.out в нашем репозитории git, который со временем увеличивался и стал слишком большим, чтобы его можно было отправить в github.Я понял, что последние несколько коммитов стали слишком большими, поэтому вот как выглядит репо:

  • COMMIT5 (HEAD) содержит A.out, превышающий 100 МБ
  • COMMIT4 несодержит A.out
  • COMMIT3 содержит A.out превышает 100 МБ
  • COMMIT2 (origin / HEAD) не содержит A.out
  • COMMIT1 содержит A.out не превышающий 100 МБ

COMMIT2 - это последний коммит, который я отправил на github, и теперь я не могу нажать после COMMIT5.

Как удалить A.out из коммитов 3 и 4, сохраняя его в своей последней версии> 100 МБ локально (и не отслеживая из git)?

РЕДАКТИРОВАТЬ: Вопрос возникает из-за большой проблемы с файломgithub, этот конкретный случай, вероятно, можно обработать, как описано в Как импортировать git-репозитории с большими файлами? (указано @phd).Но поставленный вопрос, конечно, не зависит от размеров файлов.В моем конкретном случае версия git слишком старая для поддержки git-lfs, но я не хочу ждать, пока обновится версия сервера.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Я предполагаю, что название ветки, в которой вы сейчас находитесь, 'master'

  1. Скопируйте a.out в папку вне git repo
  2. git checkout -b new-branch COMMIT2
  3. Добавьте a.out к вашему .gitignore, затем запустите git rm a.out.Зафиксируйте эти изменения
  4. git checkout master
  5. git rebase new-branch -i

Это должно привести к нескольким конфликтам перебазирования, потому что коммиты, которые вы перебазируете (от мастера), содержатa.out, в то время как ветвь, на которую вы перебазируете (новая ветвь), сделала a.out неотслеживаемым файлом

В каждом конфликте, в котором упоминается a.out, выполните git rm a.out, затем git rebase --continue для продолженияс rebase

В конце этого процесса вы можете безопасно удалить new-branch с помощью git branch -d new-branch и скопировать a.out снаружи git-репо обратно.

0 голосов
/ 11 декабря 2018

git rebase -i HEAD ~ 4 // перебазирует вашу историю git за последние 4 коммита

Он покажет вам список этих 4 коммитов.Вы можете отредактировать commit3 или даже commit2, если вы хотите изменить историю удаленного (не рекомендую)

Пока вы перебираете commit3, просто добавьте A.out в .gitignore.Добавьте его, чтобы зафиксировать и продолжить перебазирование.

Если вы раньше не использовали git rebase, я бы рекомендовал сначала ознакомиться с ним

...