我已经开始在我的实验室中使用 datalad(git 附件的包装器)来控制版本控制数据和过期时间。它工作得很好,除了 .git 文件夹可以默默地变大,特别是在 git 历史中来回重复某些步骤时。例如,有时我做了一个提交,意识到我需要修复一些东西,所以回滚它,git reset HEAD~
然后从那里进行额外的提交。这会孤立以前是 HEAD 的提交,因此它不会出现在其中,git log
但其所有关联文件仍将在附件中,如果您有提交 sha,您仍然可以使用git show
它。如何永久删除这些孤立的提交,以使它们及其关联文件不占用磁盘空间?我试过git gc --prune=now --aggressive
了,但这似乎什么也没做。
例如:
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!