GIT: как корректно удалить ошибочно добавленный _большой_ файл? (из всего, чтобы можно было закоммитить изменения без него)

Любые разговоры которые хоть как-то связаны с тематикой форума

Модератор: Модераторы разделов

Аватара пользователя
devilr
Сообщения: 3680
ОС: Mandriva => Gentoo (~amd64)

GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение devilr »

Доброго времени суток!
Столкнулся с проблемой: есть репозитарий с неким проектом. В какой то момент в проект был добавлен каталог, в котором был ещё один скрытый каталог с большим файлом (> 100 MB).
Да, я знаю, что надо быть внимательнее, но что случилось, то случилось.
При попытке залить изменения, git ругнулся на это. Нашёл файл, удалил (файл всё равно был временный), добавил в проект файл .gitignore, попытался выполнить push и получил
Large files detected
Хотя самого файла там нет.
Как корректно решать подобную проблему?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Dionysius
Сообщения: 523
ОС: Manjaro

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение Dionysius »

Думаю, должен вот этот вариант помочь: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository
Там описано, как удалить файл из гита подчистую, включая историю коммитов.
Добавлено (12:32):
P.S. Оказывается в указанной статье есть ссылка на статью про большие файлы: https://docs.github.com/en/repositories/working-with-files/managing-large-files/about-large-files-on-github#removing-files-from-a-repositorys-history
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3680
ОС: Mandriva => Gentoo (~amd64)

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение devilr »

Пробовал я всё это - ошибка остаётся. Причём, припоминаю, что ранее как то натыкался на те же грабли. И точно так-же корректно не смог решить - просто пересоздал репо с нуля.
Тем вопрос появился снова.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Kopilov
Сообщения: 953
ОС: [K]Ubuntu, Debian

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение Kopilov »

В один клик — не знаю, можно ли решить. По шагам должно быть как-то так:
Откатываемся (git checkout commit_hash) на коммит, в котором был ошибочно добавлен этот файл.
Переходим на шаг назад по истории, сохраняя состояние локально (git reset --soft HEAD^)
Удаляем большой файл (git rm -f file) или просим забыть (git reset file)
Коммитим, как было, но без большого файла (git commit)
Все последующие коммиты, если они есть, накатываем rebase-ом или cherry-pickами. При наличии ветвлений не знаю, как себя поведёт.
Чистим (git gc), пушим (новой веткой или с force).
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3680
ОС: Mandriva => Gentoo (~amd64)

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение devilr »

Кстати, а может есть какая команда проверки перед пушем? Чтобы не выковыривать ещё не добавленное.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Kopilov
Сообщения: 953
ОС: [K]Ubuntu, Debian

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение Kopilov »

Проверки на наличие больших файлов — не знаю.
Проверка, что пушишь — git show (один коммит) или git diff (между ветками или коммитами). Ну и difftool с meld-ом и прочей обвеской
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20934
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение Bizdelnick »

В мане даже примеры есть как раз об этом: https://git-scm.com/docs/git-filter-branch#_examples
Добавлено (15:51):
devilr писал:
09.12.2022 14:53
может есть какая команда проверки перед пушем?
Можно написать хук: https://git-scm.com/book/ru/v2/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-Git-%D0%A5%D1%83%D0%BA%D0%B8-%D0%B2-Git
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
algri14
Сообщения: 1369
ОС: Mageia 5.1 & 8 x86_64, KDE

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение algri14 »

Bizdelnick писал:
09.12.2022 15:47
Можно написать хук:
Извините что не по теме, но по поводу "хука", помнится что здесь же был разговор про перевод слова "hooks", вплоть до "крючки" :D
Что сейчас посоветуете?, переводить как «ПЕРЕХВАТ»,
транслитировать «ХУК» (подходит меньше всего), годится для обихода,
или
наверное лучше всего оставить как есть «HOOKS»,
даже без дополнительного в скобках «HOOKS (перехват)»
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20934
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение Bizdelnick »

algri14 писал:
10.12.2022 12:10
Что сейчас посоветуете?
В своё время лучший перевод компьютерных терминов был у Microsoft. Если верить Мультитрану, они использовали слово «обработчик». Вполне нормальный перевод, хотя «хук» для айтишника более очевидно, а не для айтишника это вообще не нужно.
algri14 писал:
10.12.2022 12:10
переводить как «ПЕРЕХВАТ»
Нет, только не так! Перехват — это процесс, который hooking, но не hook. «Перехватчик» — тоже плохой вариант, потому что сам по себе хук ничего не перехватывает, он запускается из того места, где произошёл перехват.
algri14 писал:
10.12.2022 12:10
наверное лучше всего оставить как есть «HOOKS»
Переводить — так переводить. Слово «хук» вполне устоялось, если боитесь разночтений — используйте его.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
algri14
Сообщения: 1369
ОС: Mageia 5.1 & 8 x86_64, KDE

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение algri14 »

Bizdelnick писал:
10.12.2022 19:41
Переводить — так переводить.
лет пять назад так и думал, а сейчас уже нет твёрдого предпочтения для многих иностранных слов, они появились в английском языке, короткие и в твёрдом определении, аналог в русском — либо из пары фраз, либо вообще что-то туманное, пока они ещё не вжились в русский язык окончательно, но вот-вот вживутся и получается что нет смысла переводить, ибо перевод бывает сильно вымученным, калечным и хуже того даже жалким :(
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2863
ОС: Gentoo

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение ormorph »

Принудительно залить изменения.

Shell

$ git push -f origin <branch>
Т.е. можно просто откатиться к определённому комиту а далее заново добавить нужные комиты, а далее принудительно залить.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20934
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение Bizdelnick »

algri14 писал:
10.12.2022 20:23
пока они ещё не вжились в русский язык окончательно
Слово «хук» вжилось, английское слово вместо него смотрится уродливо. Альтернативу для славянофилов я тоже привёл. Выбирайте.
Но ещё лучше, как я уже неоднократно писал, просто не беритесь за перевод, если не знаете, как его делать.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
UnixNoob
Сообщения: 1447
ОС: Slackware

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение UnixNoob »

Не знаю правильно ли я понял вопрос, но в книжке бесплатной(если не ошибаюсь) Pro Git есть такой раздел:
Удаление файлов

Для того чтобы удалить файл из Git, вам необходимо удалить его из отслеживаемых файлов (точнее, удалить его из вашего индекса) а затем выполнить коммит. Это позволяет сделать команда git rm, которая также удаляет файл из вашего рабочего каталога, так что в следующий раз вы не увидите его как «неотслеживаемый».
Если вы просто удалите файл из своего рабочего каталога, он будет показан в секции «Changes not staged for commit» (измененные, но не проиндексированные) вывода команды git status:

Код: Выделить всё

$ rm PROJECTS.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    PROJECTS.md

no changes added to commit (use "git add" and/or "git commit -a")
Затем, если вы выполните команду git rm, удаление файла попадёт в индекс:

Код: Выделить всё

$ git rm PROJECTS.md
rm 'PROJECTS.md'
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    PROJECTS.md
После следующего коммита файл исчезнет и больше не будет отслеживаться. «Если вы изменили файл и уже проиндексировали его, вы должны использовать принудительное удаление с помощью параметра -f. Это сделано для повышения безопасности, чтобы предотвратить ошибочное удаление данных, которые ещё не были записаны в снимок состояния и которые нельзя восстановить из Git.
Другая полезная штука, которую вы можете захотеть сделать — это удалить файл из индекса, оставив его при этом в рабочем каталоге. Другими словами, вы можете захотеть оставить файл на жёстком диске, но перестать отслеживать изменения в нём. Это особенно полезно, если вы забыли добавить что-то в файл .gitignore и по ошибке проиндексировали, например, большой файл с логами, или кучу промежуточных файлов компиляции. Чтобы сделать это, используйте опцию --cached:

Код: Выделить всё

$ git rm --cached README
В команду git rm можно передавать файлы, каталоги или шаблоны. Это означает, что вы можете сделать что-то вроде:

Код: Выделить всё

$ git rm log/\*.log
Обратите внимание на обратный слеш (\) перед *. Он необходим из-за того, что Git использует свой собственный обработчик имён файлов вдобавок к обработчику вашего командного интерпретатора. Эта команда удаляет все файлы, имеющие расширение .log и находящиеся в каталоге log/. Или же вы можете сделать вот так:

Код: Выделить всё

$  git rm \*~
Эта команда удаляет все файлы, имена которых заканчиваются на ~.»

Отрывок из книги
Pro Git
»
Offtopic
Своими словами боюсь было бы не понятно, поэтому не ругайтесь :laugh:
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2863
ОС: Gentoo

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение ormorph »

UnixNoob писал:
11.12.2022 11:13
Не знаю правильно ли я понял вопрос, но в книжке бесплатной(если не ошибаюсь) Pro Git есть такой раздел:
Это то же самое, если просто удалить и выполнить

Shell

$ git add .
А тут как я понял нужно чтобы это вообще отсутствовало в коммитах. По этому тут нужно будет исправлять сам коммит - где напортачил, а затем принудительно залить с ключиком -f.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3680
ОС: Mandriva => Gentoo (~amd64)

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение devilr »

Тут проблема ещё и в том, что коммитов может быть несколько. А проблема возникнет при попытке фиксации всего этого на удалённом сервере. Ведь это не сам git отказывается принять файл в 100+ метров, а github.
Добавлено (15:36):
Идеальной была бы настройка гита, не позволяющая добавить файл больше определённого размера. Или с какими либо свойствами.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2863
ОС: Gentoo

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение ormorph »

devilr писал:
11.12.2022 15:09
Идеальной была бы настройка гита, не позволяющая добавить файл больше определённого размера. Или с какими либо свойствами.
Проще тогда взять за правило загружать изменения новой веткой и только потом после проверки делать слияние с основной.
Ну и всегда можно изменить определенный коммит:
Просто выполнить:

Shell

$ git rebase -i HEAD~5
Покажет 5 последних коммитов, это число можно изменить, откроется редактор. Далее на нужном коммите заменить pick на edit, после чего закрыть редактор записав изменения, далее головой станет указанный коммит edit. Далее можно внести изменения, в данном случае это удалить файл. И далее выполнить стандартные действия:

Shell

$ git add .
$ git commit --amend
Останется только закончить изменения командой:

Shell

$ git rebase --continue
А далее принудительно залить изменения.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3680
ОС: Mandriva => Gentoo (~amd64)

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение devilr »

ormorph писал(а):
11.12.2022 16:30
Проще тогда взять за правило загружать изменения новой веткой и только потом после проверки делать слияние с основной.
Всё равно ведь забыть можно. Хотя, как костыль - вполне пойдёт :)

А вариант с rebase завтра попробую.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20934
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение Bizdelnick »

devilr писал:
11.12.2022 15:09
Тут проблема ещё и в том, что коммитов может быть несколько.
Таки используйте filter-branch.
devilr писал:
11.12.2022 15:09
Идеальной была бы настройка гита, не позволяющая добавить файл больше определённого размера.
Таки используйте хуки.
iУведомление от модератора Bizdelnick
Я не понимаю, зачем все кинулись давать советы, не разобравшись в теме и даже не прочитав предыдущие ответы. ormorph, UnixNoob, прекратите замусоривать тему. Ответ уже дан, вы только мешаете ТСу.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2863
ОС: Gentoo

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение ormorph »

Bizdelnick писал:
11.12.2022 22:39
Я не понимаю, зачем все кинулись давать советы, не разобравшись в теме и даже не прочитав предыдущие ответы. ormorph, UnixNoob, прекратите замусоривать тему.
Ну так тема как раз как удалить уже добавленный файл, не последним коммитом. То что сделано это уже сделано и это нужно исправить. Я привел наиболее простой и рабочий вариант как это сделать. Остальное как сделать так, чтобы нельзя было добавить большой файл это уже другое.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20934
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: GIT: как корректно удалить ошибочно добавленный _большой_ файл?

Сообщение Bizdelnick »

ormorph писал(а):
11.12.2022 23:00
Я привел наиболее простой и рабочий вариант как это сделать. Остальное как сделать так, чтобы нельзя было добавить большой файл это уже другое.
!Предупреждение от модератора Bizdelnick
ormorph, устное предупреждение за заведомо ложную информацию. Научитесь читать, что Вам пишут, и не начинайте пустопорожние препирательства.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: