Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:
Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference
или даже (чаще) a KeyNotFoundException
при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.
Если код NullReferenceException
задан кодом unsafe
, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero
или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.
(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)
В главе 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
, поскольку он
filter-branch
также сохраняют резервные копии, поэтому размер репо не будет уменьшаться немедленно, если вы не закончите блокировку и вывоз мусора собирать:
rm -Rf .git/refs/original # careful
git gc --aggressive --prune=now # danger
Вам понадобится git rebase в интерактивном режиме, например, здесь: Как удалить фиксацию на GitHub? и как удалить старые коммиты .
Если ваша фиксация находится в HEAD минус 10 коммитов:
$ git rebase -i HEAD~10
После издания вашей истории вам нужно нажать «новую» историю, вы необходимо добавить +
к силе (см. refspec в опциях push ):
$ git push origin +master
Если другие люди уже клонировали ваш репозиторий, вы должны сообщить им , потому что вы только что изменили историю.
Вы можете использовать инструмент git-extras. Команда obiterate полностью удаляет файл из репозитория, включая прошлые коммиты и теги.