[英]Find all binary files in git HEAD
我有一個巨大的git repo,最終想用bfg清理 。
但首先,我想跟蹤並刪除HEAD
中的文件,git將其視為二進制文件...
所以,我正在尋找的是一個命令來查找HEAD中git視為二進制文件的所有文件 。
這些沒有幫助:
預先感謝您的幫助。
diff <(git grep -Ic '') <(git grep -c '') | grep '^>' | cut -d : -f 1 | cut -d ' ' -f 2-
打破它:
git grep -c ''
打印存儲庫中每個文件的名稱和行數。 添加-I
選項使命令忽略二進制文件。 diff <(cmd1) <(cmd2)
使用進程替換為diff
提供命名管道,通過該管道發送cmd1
和cmd2
的輸出。 grep
和cut
命令用於從diff
的輸出中提取文件名。 基於@jangler答案的簡化解決方案( https://stackoverflow.com/a/30690662/808101 )
comm -13 <(git grep -Il '' | sort -u) <(git grep -al '' | sort -u)
說明:
git grep
-l
要求只打印匹配模式''
的文件的文件名(應與每個文件的每一行匹配) -I
此選項使命令忽略二進制文件 -a
此選項強制處理二進制文件,就像它們是文本一樣 sort -u
對grep的結果進行排序,因為comm
只處理已排序的文件
comm -13
列出第二個列表唯一的文件( git grep
列表包含所有文件,包括二進制文件)
以下是使用PowerShell的Windows的相同腳本:
$textFiles = git grep -Il .
$allFiles = git ls-files
foreach ($line in $allFiles){
if ($textFiles -notcontains $line) {
$line;
}
}
或者是簡短的形式:
$textFiles = git grep -Il .
git ls-files | where { $textFiles -notcontains $_ }
這需要O(n^2)
來完成,這是使用哈希表的更快方法:
$files = @{}
git ls-files | foreach { $files[$_] = 1 }
git grep -Il . | foreach { $files[$_] = 0 }
$files.GetEnumerator() | where Value -EQ 1 | sort Name | select -ExpandProperty Name
這需要O(n)
來完成。
grep -Fvxf <(git grep -Il '') <(git grep -al '')
說明:
git grep -Il ''
:列出git認為是文本的所有非空常規文件。 另請參閱: 如何列出git存儲庫中的所有文本(非二進制)文件? git grep -al ''
:列出所有非空的常規文件,包括二進制文件 grep -Fvxf
:從文件2中選擇未出現在文件1中的行,因此只選擇Git認為是二進制的非空文件。 請參閱: 如何從另一個文件A中刪除文件B上顯示的行? 還要考慮使用git add
但尚未提交的文件:
grep -Fvxf <(git grep --cached -Il '') <(git grep --cached -al '')
或者您可以在git ls-files
上執行for循環, 如何確定Git是將文件處理為二進制還是文本?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.