Gitclean
和smudge
过滤器可用于在存储库中存储与工作树中不同的表示。要追溯应用干净的过滤器,我可以运行
git filter-branch --tree-filter /the/script.sh -- --all
脚本触及那些需要重读的文件的地方clean
。不幸的是,这相当慢,因为它会为每次提交更新整个工作树。有没有办法在一个内重新应用干净的过滤器--index-filter
?
Gitclean
和smudge
过滤器可用于在存储库中存储与工作树中不同的表示。要追溯应用干净的过滤器,我可以运行
git filter-branch --tree-filter /the/script.sh -- --all
脚本触及那些需要重读的文件的地方clean
。不幸的是,这相当慢,因为它会为每次提交更新整个工作树。有没有办法在一个内重新应用干净的过滤器--index-filter
?
是的:在您的索引过滤器中,做git checkout -- path/to/file
,随心所欲,然后git add
再做一次
为了在不接触文件系统的情况下有效地重新清理,我过滤了输出git ls-files -s
以匹配我想要重新清理的那些文件,然后
git cat-file blob BLOB_TO_RECLEAN | my-clean-filter | git hash-object -w
为清理后的表示创建一个新对象。我将所有这些新对象(重新格式化以匹配 的输出git ls-files -s
)提供给git update-index --index-info
. 我的过滤器对缓存从旧 blob 到新(已清理) blob 的翻译进行了额外优化,以便任何给定 blob 只清理一次。查看git fat index-filter
完整的实现。