Как навсегда удалить коммит в git (приложение)?
Я начал использовать datalad, оболочку для приложения git, для контроля версий и сроков действия в моей лаборатории. Он отлично работает, за исключением того, что папка .git может незаметно увеличиваться в размерах, особенно при переходе назад и вперед по истории git для повторения определенных шагов. Например, иногда я делаю коммит, понимаю, что мне нужно что-то исправить, поэтому откатываю его с помощью
Например:
datalad create test
cd test
# create new branch
git branch tmp
git checkout tmp
# build up a git history to play with
echo a > f
datalad save -m a
datalad run -i . -o . bash -c "echo aa > f"
datalad run -i . -o . bash -c "echo aaa > f"
# cat all annexed files (where symlinks point)
find .git/annex/objects -type f | xargs -I{} cat {}
# prints out:
# a
# aaa
# aa
# remove last 2 commits
git reset --hard HEAD~2
# make another commit from 2 commits ago
datalad run -i . -o . bash -c "echo b > f"
# print out git annex'd files again
find .git/annex/objects -type f | xargs -I{} cat {}
# should print
# a
# aaa
# b
# aa
# everything is still there, despite the git reset --hard
git checkout master
git branch -D tmp
git gc --prune=now --aggressive
# check what's there again
find .git/annex/objects -type f | xargs -I{} cat {}
# everything is still in the annex, even after deleting the branch and running git gc!
1 ответ
Решено на neurostars: https://neurostars.org/t/how-to-permanently-delete-a-commit-in-git-annex/18235
git gc
позаботится об удалении коммитов из.git/objects
но прикрепленные файлы под.git/annex/objects
действительно будет сохраняться. Для вложенных файлов вы можете использовать git Annex unused, чтобы найти вложенные файлы, которые больше не используются в указанных вами ссылках (например, вы можете удалить данные для промежуточных шагов между помеченными «выпусками»), а затем использоватьgit annex drop --unused
. Обратите внимание, что ветка git-annex по-прежнему сохранит это в своей истории. Поэтому, если вы будете делать это тысячи раз, это может быть неполное решение, и вы можете дополнить егоgit annex forget
забыть историю аннексии напрочь