下面的資源描述瞭如何從git存儲庫中刪除敏感數據。如何驗證從git存儲庫中刪除敏感數據?
後來,我怎麼仔細檢查頑皮位真的走了,即,搜索所有斑點在倉庫中(無論是引用,垃圾,包裝,鬆散或其他方式)來驗證犯罪模式已被徹底銷燬?
當使用裸倉庫與使用工作樹的倉庫相比時,答案會改變嗎?
下面的資源描述瞭如何從git存儲庫中刪除敏感數據。如何驗證從git存儲庫中刪除敏感數據?
後來,我怎麼仔細檢查頑皮位真的走了,即,搜索所有斑點在倉庫中(無論是引用,垃圾,包裝,鬆散或其他方式)來驗證犯罪模式已被徹底銷燬?
當使用裸倉庫與使用工作樹的倉庫相比時,答案會改變嗎?
根據這一GitHub的頁面,任何承諾可以通過SHA1引用,即使沒有裁判指向它,所以你必須刪除存儲庫並重新創建它。我可以驗證一個提交在被解除引用至少兩週後仍然可見。一般來說,一旦你刪除了敏感數據 - 這樣它們就不能通過任何ref訪問 - 修剪Git的對象存儲的最簡單方法是克隆倉庫並銷燬舊倉庫。如果您沒有直接訪問存儲庫(如GitHub),則尤其如此。
(換句話說:如果垃圾SHA1是已知的,那麼GitHub上會很樂意爲它服務在網上Git協議,通常會拒絕給您無名提交,但它可以與daemon.uploadarch
配置啓用)
將被引用對象變成垃圾對象的方式是司法應用rebase
,filter-branch
,reflog
,update-ref
等。清除垃圾對象的方式是司法適用gc
,fsck
,prune
和repack
。
實施例的查詢:
列表懸空提交,這可能會用grep對於可能被垃圾收集敏感數據:
git fsck --no-reflogs | awk '/dangling commit/{print $3}' | while read sha1;
do git grep foo $sha1; done
列表的每一個對象從參考到達(添加--walk-reflogs
代替reflog):
git rev-list --objects --all | while read sha path;
do git show $sha | grep baz; done
另一種方法是使用fast-export
到整個存儲庫導出到一個基於文本的文件,你可以選擇通過和你想要的任何工具,那麼fast-import
到一個新的回購操作。這很好,因爲它沒有任何垃圾,並且可以非常容易地擦寫整個存檔。
如果您沒有工作樹,則答案不會更改,但filter-branch
等命令可能需要某些用例的工作樹。
不是'git log'只能搜索可到達的對象嗎?我想搜索*一切*。 – 2011-03-14 18:36:58
這是一個很好的觀點,查看jleedev的答案 – ctcherry 2011-03-14 18:45:19
我通過'fast-export',hack,'fast-import'建立了一個新的repo和'rm -rf'舊的構造來消除違規位。 – 2012-02-25 02:38:34