如何列出Git存储库中所有已跟踪文件的不同扩展名?

6

我希望知道在给定的仓库中,git跟踪的所有文件扩展名,并创建适当的.gitattributes文件。

期望输出示例:

bat
gitignore
gradle
html
jar
java
js
json
md
png
properties
py
svg
webp
xml
yml

我可以使用什么命令来实现这个功能?
2个回答

9
git ls-tree -r HEAD --name-only | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u 

当你将其声明为别名时,必须转义$1

alias gitFileExtensions="git ls-tree -r HEAD --name-only | perl -ne 'print \$1 if m/\.([^.\/]+)$/' | sort -u"

这比朴素的find更好,因为:

  • 它排除了未被跟踪(gitignored)的文件
  • 它排除了包含通常有数百/数千个文件并减慢搜索速度的.git目录

(启发自如何在文件夹层次结构中找到所有不同的文件扩展名?)


1
你为什么在perl部分使用双引号?也许使用哈希表而不是管道排序会更好 - 你可以添加&& !$a{$1}++(整个命令用单引号括起来)只打印每个结果的第一次出现。 - Tom Fenech
如果我使用单引号,它会打印 SCALAR(0xa031e3c)SCALAR(0xa031e3c)...。为了让它正常工作,我必须在 $1 前面删除转义。但是当我声明别名时,我必须再次添加转义。已更新。 - jakub.g
是的,在双引号内需要从 shell 转义 $。在我看来最好只使用一个函数。 - Tom Fenech
!$a{$1}++ 我在一个巨大的 Git 存储库(Chrome 的 Blink)上进行了测试,实际上速度差异微不足道(在我的机器上为 0.8 秒 vs 1.0 秒)。我认为我会保留 sort 以提高可读性 :) - jakub.g

1

如果您可以访问PowerShell,这里有一个不错的一行代码,它还会告诉您每种文件类型存在多少个:

$ext = @{}; git ls-tree -r HEAD --name-only | Get-Item | %{ $ext[$_.Extension]++ }; $ext

这只是给了我一个错误。Get-Ittem:路径中存在非法字符。 - Kim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接