0

我已经开始在我的实验室中使用 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!
4

1 回答 1

1

解决了神经之星: https ://neurostars.org/t/how-to-permanently-delete-a-commit-in-git-annex/18235

git gc会注意删除提交,.git/objects但附件的文件.git/annex/objects确实会持续存在。对于附件文件,您可以使用 git附件未使用 来查找您指定的参考文件中不再使用的附件文件(例如,您可以删除标记为“发布”之间的中间步骤的数据),然后使用git annex drop --unused. 请注意,该 git-annex 分支仍会将其保留在其历史记录中。因此,如果您要这样做数千次,它可能不是一个完整的解决方案,您可能会称赞它git annex forget完全忘记了附件的历史

于 2021-02-08T04:12:27.103 回答