Git: полное удаление файла из истории (что-то не работает)

IDE, VCS и прочее

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

Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Git: полное удаление файла из истории

Сообщение t.t »

Нужно полностью удалить несколько файлов из истории. Делаю так:

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

git filter-branch --index-filter "git rm --cached --ignore-unmatch path/to/file" --prune-empty HEAD

Но...

Когда-то нашёл в сети совет для поиска больших файлов:

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

git rev-list --all --objects | sed -n $(git rev-list --objects --all |
  cut -f1 -d' ' | git cat-file --batch-check | grep blob |
     sort -n -k3 | tail | while read hash type size; do
       echo -n "-e s/$hash/$size/p "
     done) | sort -n -k1

После вышеназванной команды filter-branch удалённый файл в списке присутствует.
Удалил .git/refs/original, сделал

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

git reflog expire --expire=0 --all && git repack -da && git prune

Всё равно присутствует. Хотя git checkout path/to/file выдаёт:
error: pathspec 'path/to/file' did not match any file(s) known to git.


Вопрос, думаю, уже понятен: где всё же хранится информация об удалённом файле, почему, и как её удалить напрочь?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:


Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Git: полное удаление файла из истории

Сообщение t.t »

Это я помню. (; Хотелось бы понять, почему информация о файле остаётся в хранилище. Потому как без этого нет никакой гарантии, что тот способ решит эту проблему. А он ощутимо сложнее и требует ручной работы.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:

Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Git: полное удаление файла из истории

Сообщение sash-kan »

t.t писал(а):
05.06.2011 15:33
Нужно полностью удалить несколько файлов из истории. Делаю так:

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

git filter-branch --index-filter "git rm --cached --ignore-unmatch path/to/file" --prune-empty HEAD

Но...
протестировал. вот так проще увидеть «ошмётки» коммитов:
$ git log --name-only --follow --all -- path/to/file
сделал поиск в .git по хэшу самого верхнего коммита.
нашёл упоминания в .git/info/refs и .git/packed-refs
удалил эти строки из этих файлов (.git/logs/, где тоже были упоминания, не трогал).
сделал:
$ git gc
и «подвешенные» коммиты были удалены.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:

Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Git: полное удаление файла из истории

Сообщение t.t »

sash-kan писал(а):
05.06.2011 19:21
t.t писал(а):
05.06.2011 15:33
Нужно полностью удалить несколько файлов из истории. Делаю так:

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

git filter-branch --index-filter "git rm --cached --ignore-unmatch path/to/file" --prune-empty HEAD

Но...
протестировал. вот так проще увидеть «ошмётки» коммитов:
$ git log --name-only --follow --all -- path/to/file
сделал поиск в .git по хэшу самого верхнего коммита.
нашёл упоминания в .git/info/refs и .git/packed-refs
удалил эти строки из этих файлов (.git/logs/, где тоже были упоминания, не трогал).

Попробовал. Пусто.

sash-kan писал(а):
05.06.2011 19:21
сделал:
$ git gc
и «подвешенные» коммиты были удалены.

На всякий случай git gc тоже сделал. Ничего не изменилось.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:

Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Git: полное удаление файла из истории

Сообщение sash-kan »

t.t писал(а):
05.06.2011 19:42
Ничего не изменилось.
в каком смысле не изменилось?
$ git log --name-only --follow --all -- path/to/file
показывает несуществующие коммиты?
или тот длинный скрипт для «поиска больших файлов» выводит имя этого файла?

p.s. ну чтоб совсем следов не осталось, можно запустить:
$ git gc --aggressive --prune=now

p.p.s. проверил ещё раз с большим файлом (чтоб заметнее было).
с 2038729 байт размер репозитория уменьшился до 66262 байт — т.е. содержимое тестового файла _точно_ было из репозитория удалено.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:

Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Git: полное удаление файла из истории

Сообщение t.t »

sash-kan писал(а):
05.06.2011 20:43
t.t писал(а):
05.06.2011 19:42
Ничего не изменилось.
в каком смысле не изменилось?
$ git log --name-only --follow --all -- path/to/file
показывает несуществующие коммиты?
Оно их и сразу не показывало.

sash-kan писал(а):
05.06.2011 20:43
или тот длинный скрипт для «поиска больших файлов» выводит имя этого файла?
Да, выводит.

sash-kan писал(а):
05.06.2011 20:43
p.s. ну чтоб совсем следов не осталось, можно запустить:
$ git gc --aggressive --prune=now
Без изменений.

sash-kan писал(а):
05.06.2011 20:43
p.p.s. проверил ещё раз с большим файлом (чтоб заметнее было).
с 2038729 байт размер репозитория уменьшился до 66262 байт — т.е. содержимое тестового файла _точно_ было из репозитория удалено.
Размер, похоже, и у меня уменьшился. Но мне бы хотелось, чтобы и имя файла из хранилища удалилось.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:

Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Git: полное удаление файла из истории

Сообщение t.t »

Всё, похоже, нашёл. Оказывается, у меня не отработала полностью команда git push -f --all, потому эти файлы и отображались: из origin. Сейчас выполнил её повторно -- теперь всё нормально с отображением.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:

Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Git: полное удаление файла из истории

Сообщение sash-kan »

хм. в принципе, логично — это ты видел объекты не из своей ветки, а из ветки ремоута. если push не был сделан, то никаких «осиротевших» объектов и не находилось — всё имело своих «штатных родителей».

раз получилось, значит и замечательно — я не успел себе совсем голову сломать, представляя, что же у тебя там «не так» (улыбка)
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:

Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Git: полное удаление файла из истории

Сообщение t.t »

sash-kan писал(а):
05.06.2011 22:54
хм. в принципе, логично — это ты видел объекты не из своей ветки, а из ветки ремоута. если push не был сделан, то никаких «осиротевших» объектов и не находилось — всё имело своих «штатных родителей».
Ну да, я о том и говорю.

sash-kan писал(а):
05.06.2011 22:54
раз получилось, значит и замечательно — я не успел себе совсем голову сломать, представляя, что же у тебя там «не так» (улыбка)
Это радует. (: Я и сам почти не сломал: вовремя заметил отсутствие origin в git log и посмотрел на git log --all -- там и увидел, что он висит отдельной параллельной веткой. Всё время забываю, что log без --all может показать не всё дерево.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:

Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Git: полное удаление файла из истории

Сообщение sash-kan »

t.t писал(а):
06.06.2011 00:00
Всё время забываю, что log без --all может показать не всё дерево.
ааа, это, наверно, меркуриаловская привычка — там все коммиты в одной куче.
и как посмотреть историю текущей ветки (то, что показывает git log), местные знатоки hg мне, увы, не подсказали: Почитателям Git-а и другим — на рецензирование
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:

Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Git: полное удаление файла из истории

Сообщение t.t »

sash-kan писал(а):
06.06.2011 12:00
t.t писал(а):
06.06.2011 00:00
Всё время забываю, что log без --all может показать не всё дерево.
ааа, это, наверно, меркуриаловская привычка — там все коммиты в одной куче.
Откровенно говоря, это ещё cvs-овская привычка. (: Потом svn, потом mercurial... Закрепилась, одним словом.

Причём у меня ведь даже алиас специальный есть

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

la = log --all --graph --decorate --color-words
А всё равно забываю. Один плюс от этой темы точно есть: теперь, видимо, забывать уже не буду. (:
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: