Как удалить файлы из старой фиксации в git [duplicate]

Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:

Случай с краем # 1: одновременный доступ к Словарю

Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference или даже (чаще) a KeyNotFoundException при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.

Случай с краем # 2: небезопасный код

Если код NullReferenceException задан кодом unsafe, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.

(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)

94
задан marioosh 5 January 2012 в 11:29
поделиться

3 ответа

В главе 9 книги Pro Git есть раздел о Удаление объектов .

Позвольте мне кратко изложить здесь следующие шаги:

git filter-branch --index-filter \
    'git rm --cached --ignore-unmatch path/to/mylarge_50mb_file' \
    --tag-name-filter cat -- --all

Как и ранее описанная опция перезагрузки, filter-branch выполняет операцию перезаписи. Если вы опубликовали историю, вам нужно будет --force нажать новые ссылки.

Подход filter-branch значительно более мощный, чем подход rebase, поскольку он

  • позволяет вам работать на всех ветвях / refs сразу,
  • переименовывает любые теги на лету
  • работает чисто, даже если было выполнено несколько слияний с момента добавления файл
  • работает чисто, даже если файл был добавлен / удален несколько раз в истории (a) branch (es)
  • не создает новые, несвязанные коммиты , а скорее копирует их при изменении связанных с ними деревьев. Это означает, что сохраняются такие вещи, как подписанные коммиты, фиксации заметок и т. Д.

filter-branch также сохраняют резервные копии, поэтому размер репо не будет уменьшаться немедленно, если вы не закончите блокировку и вывоз мусора собирать:

rm -Rf .git/refs/original       # careful
git gc --aggressive --prune=now # danger
135
ответ дан Matthew Rankin 5 September 2018 в 07:06
поделиться

Вам понадобится git rebase в интерактивном режиме, например, здесь: Как удалить фиксацию на GitHub? и как удалить старые коммиты .

Если ваша фиксация находится в HEAD минус 10 коммитов:

$ git rebase -i HEAD~10

После издания вашей истории вам нужно нажать «новую» историю, вы необходимо добавить + к силе (см. refspec в опциях push ):

$ git push origin +master

Если другие люди уже клонировали ваш репозиторий, вы должны сообщить им , потому что вы только что изменили историю.

1
ответ дан Community 5 September 2018 в 07:06
поделиться

Вы можете использовать инструмент git-extras. Команда obiterate полностью удаляет файл из репозитория, включая прошлые коммиты и теги.

https://github.com/tj/git-extras/blob/master/Commands.md

1
ответ дан Ofer Segev 5 September 2018 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: