2017-08-06 87 views
3

我想這樣做的Git倉庫一些審計維護操作,因爲有開發商,有時版本的文件,不應該是規則(健康)倉庫:編譯二進制文件,第三方文檔文件...Git倉庫的維護和審計工具

在過去的幾個月裏庫的規模已大大增加,我想知道爲什麼:已添加了哪些文件,哪些文件擴展名,什麼文件大小。 ..即使這些文件可能已被刪除後,元數據仍然存在,影響克隆,拉取命令,並且git元數據目錄確實很大。

我知道git的日誌命令提供了這樣的功能,但我不知道是否有其他工具(UI工具也許?),提供集成度更高,便於比較和對比有關git倉庫使用

所以,總結,什麼是我的選擇,以獲取有關Git的信息:

  1. 文件添加到一定大小的存儲庫,文件 擴展,從一定時間和(如果可能)這樣做。

  2. 文件,這些文件刪除是否可以刪掉呢?

+0

將會有一些變化 git log --format =%n%H --name-only --diff-filter = A | awk'/^$/{C =!C; next} C {commit = $ 1; next} {print commit「:」$ 0,commit「:」$ 0}'| git cat-file --batch-check ='%(objectsize)%(rest)'' 做任何你可以在這裏要求的東西。例如,在日誌中添加一個'--since = 2017-01-1T00:00',並在末尾添加一個'| sort -n',以便按照今年添加的文件的大小獲得一個很好的排序列表,而且您已經有awk和git,那麼你在這裏想要什麼具體缺失? – jthill

回答

0

您可以嘗試github.com存儲庫中的洞察選項卡,查看誰在貢獻多少時間,進一步檢查組成這些代碼部分的提交。如果你不在github上,你可以通過git gui獲得類似的見解。

+0

恐怕Git GUI太基礎了,我正在尋找更強大,更豐富的東西。無論如何感謝:) – Luis

5

大約GIT中的好處是,它暴露了其所有的膽量,所以你可以在他們採取偷看。

在你的情況,你大斑點照顧。如果您不熟悉git如何在內部工作,則基於將對象映射到其SHA-1散列的對象數據庫。提交是對象,每個承諾包含一個,它是一個列出目錄內容的對象,這些對象可以是其他樹(子目錄)或Blob(用於文件數據)。

這意味着如果兩個文件具有相同的內容,他們將共享一個blob。這也意味着如果你改變一個對象,它的ID也會改變(你會看到在這個答案結尾處的後果)。

如何獲得報告

首先,確保你在鏡子庫工作,因此與--mirror選項克隆:

git clone --mirror https://my-host/my-repo.git

好了,現在這裏是一個命令,將顯示你的200點最大的斑點:

git rev-list --objects --all | git cat-file --batch-check='%(objectname) %(objecttype) %(objectsize) %(rest)' | sort -nr -k 3 | perl -ne 'm#^(\w+) blob (\d+) (.+)# or next; print "$1\t$2\t$3\n";' | head -n 200 | column -t -s $'\t'

我們把這個道N A小:

  • git rev-list --objects --all將輸出所有對象ID(SHA-1散列)在你的倉庫使用,其後於BLOB文件路徑(docs)。
  • git cat-file --batch-check='%(objectname) %(objecttype) %(objectsize) %(rest)'將重新格式化git rev-list的輸出並插入一些我們感興趣的數據(如對象大小)(docs)。
    這裏,%(rest)將替換爲之後的部分輸入上的對象ID - 它是指向blob的文件路徑。
  • sort -nr -k 3會做一個反向排序上的斑點大小
  • perl -ne 'm#^(\w+) blob (\d+) (.+)# or next; print "$1\t$2\t$3\n";'將簡單過濾器出任何東西,這不是一個BLOB和格式化輸出
  • head -n 200會第一時間200個項目
  • column -t -s $'\t'將重新設置輸出很好

請注意您要刪除的斑點的對象ID。

請記住,我們正在談論斑點在這裏,而不是文件。如果您更改文件,那麼您將爲該文件創建2個Blob:每個提交的版本都有一個Blob。另外,請記住,由於git執行GC時發生的增量壓縮,總磁盤使用量將爲以下,而不是的總和。如果兩個blob非常相似(因爲提交通常只會改變文件的一小部分),則增量壓縮將非常有效。

現在您可以調整此命令來生成其他報告。下面是做同樣的事情不那麼花哨的版本:

git rev-list --objects --all | git cat-file --batch-check='%(objectname) %(objectsize) %(rest)' | sort -nr -k 2 | head -n 200

下面是如何讓斑點的大小按文件擴展名分組:

git rev-list --objects --all | git cat-file --batch-check='%(objectname) %(objecttype) %(objectsize) %(rest)' | perl -ne 'm#^(\w+) blob (\d+) .+?(?:\.(\w+))?$# or next; next if $h{$1}++; $ext = $3 ? lc $3 : "<none>"; $s{$ext} += $2; ++$c{$ext}; END { foreach $ext (keys %s) { print "$ext $s{$ext} $c{$ext}\n"; } }' | sort -nr -k 2 | column -t

相同的技術,但Perl腳本是不同。您可以通過在第一個腳本中插入grep來迭代,以獲取給定文件擴展名的所有對象ID及其大小。

如何抹殺不需要的數據

現在,你應該有你想要擺脫什麼好主意。時間使用BFG repo cleaner。請務必仔細閱讀網站上的說明。

非常重要:的BFG將改寫整個提交歷史,這意味着所有你的提交哈希了從第一個變化會有所不同。您和有權訪問回購的其他人將必須放棄舊存儲庫並將其替換爲新存儲庫。這是對象ID如何在git中工作的直接結果,對此你沒有什麼可以做的。

此工具的命令可讓您刪除給定擴展的所有文件,並且它還具有一個開關,可讓您提供要刪除的對象ID列表。結合上述報告的結果,這一點非常有用。假設你有對象ID列表中一個名爲blobs-to-delete.txt要刪除的文件:

java -jar bfg.jar --no-blob-protection --private --strip-blobs-with-ids blobs-to-delete.txt my-repo.git

這比使用選項,如--strip-blobs-bigger-than,出於顯而易見的原因更安全。

一對夫婦的注意事項:

  • --no-blob-protection將標誌着您的最新提交的修改(BFG默認不會以其他方式觸摸它的內容 - 只要確保你有一個備用)。
  • --private將阻止該工具在新提交的提交消息中包含舊的提交ID(如果需要保留每個提交消息中發生的事件的跟蹤,請將其刪除),但IMO會污染提交消息,工具反正輸出一個映射文件)。

然後,你必須到期引用日誌和觸發完整的GC已刪除對象的實際走:如果你確定你做了什麼,200%

git reflog expire --expire=now --all && git gc --prune=now --aggressive

現在,強制推動你的改變,然後你的團隊中的每個人都可以製作一個新的克隆。享受你的瘦身回購!

+0

感謝您的真棒解釋和命令提示;我熟悉Git內部組件,但我並不熟練掌握流水線命令......非常感謝! – Luis