我有一个巨大的git repo,最终想用bfg清理.
但首先,我想跟踪并删除HEAD哪个git视为二进制文件...
所以,我正在寻找的是一个命令来查找HEAD中git视为二进制文件的所有文件.
这些没有帮助:
预先感谢您的帮助.
jan*_*ler 17
diff <(git grep -Ic '') <(git grep -c '') | grep '^>' | cut -d : -f 1 | cut -d ' ' -f 2-
Run Code Online (Sandbox Code Playgroud)
打破它:
git grep -c ''打印存储库中每个文件的名称和行数.添加该-I选项会使命令忽略二进制文件.diff <(cmd1) <(cmd2)使用进程替换来提供diff命名管道,通过它发送cmd1和输出cmd2.grep和cut命令用于从输出提取的文件名diff.基于@jangler答案的简化解决方案(/sf/answers/2148346371/)
comm -13 <(git grep -Il '' | sort -u) <(git grep -al '' | sort -u)
Run Code Online (Sandbox Code Playgroud)
说明:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
或者是简短的形式:
$textFiles = git grep -Il .
git ls-files | where { $textFiles -notcontains $_ }
Run Code Online (Sandbox Code Playgroud)
这需要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
Run Code Online (Sandbox Code Playgroud)
这需要O(n)完成.
grep -Fvxf <(git grep -Il '') <(git grep -al '')
Run Code Online (Sandbox Code Playgroud)
解释:
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 '')
Run Code Online (Sandbox Code Playgroud)
或者您可以git ls-files使用如何确定 Git 将文件作为二进制文件还是文本处理?
| 归档时间: |
|
| 查看次数: |
4113 次 |
| 最近记录: |