如何验证从git存储库中删除敏感数据?

Gre*_*con 6 git

以下资源描述了如何从git存储库中删除敏感数据.

之后,我如何仔细检查顽皮位是否真的消失了,搜索存储库中的所有blob(被引用,垃圾,打包,松散还是其他)来验证违规模式是否已被完全破坏?

使用裸存储库与使用工作树的存储库时,答案是否会发生变化?

Jos*_*Lee 9

根据该GitHub页面,任何提交都可以通过SHA1引用,即使没有引用它,因此您必须删除存储库并重新创建它.我可以验证提交在取消引用后至少两周仍然可见.通常,一旦删除了敏感数据 - 这样就无法通过任何引用访问它们 - 修剪Git对象存储的最简单方法是克隆存储库并销毁旧存储库.如果您无法直接访问存储库(例如GitHub),则尤其如此.

(换句话说:如果垃圾SHA1已知,那么GitHub将很乐意通过网络提供服务.Git协议通常会拒绝为您提供未命名的提交,但可以通过daemon.uploadarch配置启用它.)

把引用的对象变成垃圾对象的方法是与司法适用rebase,filter-branch,reflog,update-ref等.清除垃圾对象的方法是与司法适用gc,fsck,prune,和repack.

示例查询:

  • 列出悬空提交,您可以查找可能被垃圾收集的敏感数据:

    git fsck --no-reflogs | awk '/dangling commit/{print $3}' | while read sha1;
      do git grep foo $sha1; done
    
    Run Code Online (Sandbox Code Playgroud)
  • 列出从ref可到达的每个对象(--walk-reflogs替换为reflogs 添加):

    git rev-list --objects --all | while read sha path;
      do git show $sha | grep baz; done
    
    Run Code Online (Sandbox Code Playgroud)

另一种方法是使用fast-export将整个存储库导出到基于文本的文件中,您可以使用任何所需的工具进行操作和操作,然后再fast-import使用新的存储库.这很好,因为它不带任何垃圾,你可以很容易地grep整个存档.

如果您没有工作树,则答案不会改变,但是filter-branch某些命令可能需要工作树来处理某些用例.