Show HN: "Git who" - 用于工业级规模 Git Blaming 的全新 CLI 工具
Navigation Menu
Toggle navigation
- Product
- GitHub Copilot Write better code with AI
- Security Find and fix vulnerabilities
- Actions Automate any workflow
- Codespaces Instant dev environments
- Issues Plan and track work
- Code Review Manage code changes
- Discussions Collaborate outside of code
- Code Search Find more, search less Explore
- All features
- Documentation
- GitHub Skills
- Blog
- Solutions By company size
- Resources Topics
- Open Source
- Enterprise
- Pricing
Search or jump to...
Search code, repositories, users, issues, pull requests...
Search Clear Search syntax tips
Provide feedback
We read every piece of feedback, and take your input very seriously. Include my email address so I can be contacted Cancel Submit feedback
Saved searches
Use saved searches to filter your results more quickly
Name Query To see all available qualifiers, see our documentation. Cancel Create saved search Sign in Sign up Reseting focus You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert {{ message }} sinclairtarget / **git-who ** Public
- Notifications You must be signed in to change notification settings
- Fork 3
- Star 194
Git blame for file trees
License
MIT license 194 stars 3 forks Branches Tags Activity Star Notifications You must be signed in to change notification settings
Additional navigation options
sinclairtarget/git-who
master BranchesTags Go to file Code
Folders and files
Name| Name| Last commit message| Last commit date ---|---|---|---
Latest commit
History
270 Commits internal| internal screenshots| screenshots test-repo @ 1681886| test-repo @ 1681886 .gitignore| .gitignore .gitmodules| .gitmodules LICENSE| LICENSE README.md| README.md Rakefile| Rakefile cache.go| cache.go dump.go| dump.go gitwho_ed25519.pub| gitwho_ed25519.pub go.mod| go.mod go.sum| go.sum hist.go| hist.go log.go| log.go main.go| main.go parse.go| parse.go table.go| table.go tree.go| tree.go View all files
Repository files navigation
git-who
这段代码是谁写的?!
与 git blame
可以告诉你谁写了代码的_一行_不同,git-who
告诉你谁负责代码库中的整个组件或子系统。你可以将 git-who
视为类似于 git blame
,但用于文件树而不是单个文件。
Demo
此 README 包含全面的文档。 有关概述,请参见 Who Will Maintain Vim? A Demo of Git Who.
Installation
Precompiled Binaries
请参阅 releases.
From Source
从源代码构建需要你安装了 Go、Ruby 和 rake
Ruby gem。请注意,这些_仅_在从源代码构建时才需要; 你可以下载并运行其中一个二进制版本,而无需安装任何这些工具。
$ git clone git@github.com:sinclairtarget/git-who.git
$ cd git-who
$ rake
$ ./git-who --version
Usage
(在以下示例中,git-who
被调用为 git who
。只要 Git 可以在你的 PATH 中找到 git-who
,这就会自动生效。有关更多详细信息,请参见 Git Alias 部分。)
git who
有三个子命令。 每个子命令都让你从不同的角度查看 Git 存储库中的作者身份。
The table
Subcommand
table
子命令是默认子命令。 你可以将其显式地调用为 git who table
或隐式地调用为 git who
。
table
子命令打印一个表格,汇总了每个在存储库中提交过的作者的贡献:
~/clones/cpython$ git who
┌─────────────────────────────────────────────────────┐
│Author Last Edit Commits│
├─────────────────────────────────────────────────────┤
│Guido van Rossum 2 mon. ago 11,213│
│Victor Stinner 1 week ago 7,193│
│Fred Drake 13 yr. ago 5,465│
│Georg Brandl 1 year ago 5,294│
│Benjamin Peterson 4 mon. ago 4,724│
│Raymond Hettinger 1 month ago 4,235│
│Serhiy Storchaka 3 days ago 3,366│
│Antoine Pitrou 10 mon. ago 3,180│
│Jack Jansen 18 yr. ago 2,978│
│Martin v. Löwis 9 yr. ago 2,690│
│...3,026 more... │
└─────────────────────────────────────────────────────┘
你可以指定一个路径来过滤结果,仅显示触及给定路径下的文件的提交:
~/repos/cpython$ git who Tools/
┌─────────────────────────────────────────────────────┐
│Author Last Edit Commits│
├─────────────────────────────────────────────────────┤
│Guido van Rossum 8 mon. ago 820│
│Barry Warsaw 1 year ago 279│
│Martin v. Löwis 9 yr. ago 242│
│Victor Stinner 1 month ago 235│
│Steve Dower 1 month ago 228│
│Jeremy Hylton 19 yr. ago 178│
│Mark Shannon 4 hr. ago 131│
│Serhiy Storchaka 2 mon. ago 118│
│Erlend E. Aasland 1 week ago 117│
│Christian Heimes 2 yr. ago 114│
│...267 more... │
└─────────────────────────────────────────────────────┘
你还可以指定分支名称、标签名称或任何 "commit-ish" 来过滤结果,仅显示从指定的提交可访问的提交:
~/clones/cpython$ git who v3.7.1
┌─────────────────────────────────────────────────────┐
│Author Last Edit Commits│
├─────────────────────────────────────────────────────┤
│Guido van Rossum 6 yr. ago 10,986│
│Fred Drake 13 yr. ago 5,465│
│Georg Brandl 8 yr. ago 5,291│
│Benjamin Peterson 6 yr. ago 4,599│
│Victor Stinner 6 yr. ago 4,462│
│Raymond Hettinger 6 yr. ago 3,667│
│Antoine Pitrou 6 yr. ago 3,149│
│Jack Jansen 18 yr. ago 2,978│
│Martin v. Löwis 9 yr. ago 2,690│
│Tim Peters 10 yr. ago 2,489│
│...550 more... │
└─────────────────────────────────────────────────────┘
修订范围也有效。 这显示了在 3.10.9 版本之后直到 3.11.9 版本发布的提交:
~/clones/cpython$ git who v3.10.9..v3.11.9
┌─────────────────────────────────────────────────────┐
│Author Last Edit Commits│
├─────────────────────────────────────────────────────┤
│Miss Islington (bot) 9 mon. ago 2,551│
│Victor Stinner 9 mon. ago 367│
│Serhiy Storchaka 9 mon. ago 304│
│Erlend Egeberg Aasland 2 yr. ago 202│
│Christian Heimes 2 yr. ago 200│
│Mark Shannon 1 year ago 157│
│Irit Katriel 10 mon. ago 135│
│Nikita Sobolev 10 mon. ago 126│
│Pablo Galindo Salgado 1 year ago 117│
│Pablo Galindo 9 mon. ago 97│
│...574 more... │
└─────────────────────────────────────────────────────┘
就像 git
本身一样,当路径名和 commit-ish 之间存在歧义时,你可以使用 --
来澄清区别。 以下命令将向你显示对名为 foo
的文件或目录的贡献,即使你的存储库中也存在名为 foo
的分支:
$ git who -- foo
Options
-m
、-c
、-l
和 -f
标志允许你按不同的指标对表进行排序。
-m
标志按 "Last Edit" 列对表进行排序,显示谁最近编辑了存储库。 -c
标志按首次编辑对表进行排序,以便最早提交到存储库的作者位于顶部。
-l
标志按修改的行数对表进行排序,并添加一些更多的列:
$ git who -l
┌──────────────────────────────────────────────────────────────────────────────┐
│Author Last Edit Commits Files Lines (+/-)│
├──────────────────────────────────────────────────────────────────────────────┤
│Guido van Rossum 2 mon. ago 11,213 14,135 1.3m / 793,252│
│Antoine Pitrou 10 mon. ago 3,180 3,868 944,685 / 776,587│
│Jack Jansen 18 yr. ago 2,978 5,887 836,527 / 691,078│
│Benjamin Peterson 4 mon. ago 4,724 6,957 690,740 / 781,700│
│Georg Brandl 1 year ago 5,294 9,139 644,620 / 640,217│
│Martin v. Löwis 9 yr. ago 2,690 4,557 570,632 / 389,794│
│Victor Stinner 1 week ago 7,193 11,382 464,474 / 460,396│
│Brett Cannon 1 month ago 2,022 2,841 305,631 / 283,178│
│Serhiy Storchaka 3 days ago 3,366 9,955 335,209 / 208,899│
│Christian Heimes 1 year ago 1,553 4,191 339,706 / 178,947│
│...3,022 more... │
└──────────────────────────────────────────────────────────────────────────────┘
-f
标志按修改的文件数对表进行排序。
还有一个 -n
选项可用于打印更多行。传递 -n 0
会打印所有行。
运行 git-who table --help
查看 table
子命令的其他选项。
The tree
Subcommand
tree
子命令打印出一个文件树,显示工作树中的文件,就像 tree 一样。文件树中的每个节点都用信息进行注释,显示哪个作者对该路径或该路径下的文件贡献最大。
这是一个示例,显示了对 Python 解析器的贡献。 默认情况下,贡献将按提交次数来衡量:
~/repos/cpython$ git who tree Parser/
Parser/.........................Guido van Rossum (182)
├── lexer/......................Pablo Galindo Salgado (5)
│ ├── buffer.c................Lysandros Nikolaou (1)
│ ├── buffer.h................Lysandros Nikolaou (1)
│ ├── lexer.c
│ ├── lexer.h.................Lysandros Nikolaou (1)
│ ├── state.c
│ └── state.h
├── tokenizer/..................Filipe Laíns (1)
│ ├── file_tokenizer.c
│ ├── helpers.c...............Lysandros Nikolaou (1)
│ ├── helpers.h...............Lysandros Nikolaou (1)
│ ├── readline_tokenizer.c....Lysandros Nikolaou (1)
│ ├── string_tokenizer.c......Lysandros Nikolaou (1)
│ ├── tokenizer.h.............Lysandros Nikolaou (1)
│ └── utf8_tokenizer.c........Lysandros Nikolaou (1)
├── Python.asdl.................Benjamin Peterson (14)
├── action_helpers.c............Pablo Galindo Salgado (6)
├── asdl.py.....................Benjamin Peterson (7)
├── asdl_c.py...................Benjamin Peterson (42)
├── myreadline.c
├── parser.c....................Pablo Galindo Salgado (34)
├── peg_api.c...................Lysandros Nikolaou (2)
├── pegen.c.....................Pablo Galindo (33)
├── pegen.h.....................Pablo Galindo Salgado (13)
├── pegen_errors.c..............Pablo Galindo Salgado (16)
├── string_parser.c.............Victor Stinner (10)
├── string_parser.h.............Pablo Galindo Salgado (1)
└── token.c.....................Pablo Galindo Salgado (2)
你可能会注意到某些文件(如 lexer.c
)未被注释。 如果文件未被注释,那是因为对该文件贡献最大的作者与对包含该文件的目录贡献最大的作者相同。 这样做是为了尽量减少视觉干扰。
你可以强制 git-who tree
使用 -a
标志(表示 "all")来注释每个文件。 此标志还会打印在遍历提交历史记录时发现的所有文件路径,包括那些已不在工作树中的文件路径:
~/repos/cpython$ git who tree -a Parser/
Parser/.........................Guido van Rossum (182)
├── lexer/......................Pablo Galindo Salgado (5)
│ ├── buffer.c................Lysandros Nikolaou (1)
│ ├── buffer.h................Lysandros Nikolaou (1)
│ ├── lexer.c.................Pablo Galindo Salgado (4)
│ ├── lexer.h.................Lysandros Nikolaou (1)
│ ├── state.c.................Pablo Galindo Salgado (2)
│ └── state.h.................Pablo Galindo Salgado (1)
├── pegen/......................Pablo Galindo (30)
│ ├── parse.c.................Pablo Galindo (16)
│ ├── parse_string.c..........Pablo Galindo (7)
│ ├── parse_string.h..........Pablo Galindo (2)
│ ├── peg_api.c...............Pablo Galindo (3)
│ ├── pegen.c.................Pablo Galindo (17)
│ └── pegen.h.................Pablo Galindo (9)
├── pgen/.......................Pablo Galindo (8)
│ ├── __init__.py.............Pablo Galindo (2)
│ ├── __main__.py.............Pablo Galindo (5)
│ ├── automata.py.............Pablo Galindo (4)
│ ├── grammar.py..............Pablo Galindo (5)
│ ├── keywordgen.py...........Pablo Galindo (3)
│ ├── metaparser.py...........Pablo Galindo (2)
│ ├── pgen.py.................Pablo Galindo (5)
│ └── token.py................Pablo Galindo (4)
├── tokenizer/..................Filipe Laíns (1)
│ ├── file_tokenizer.c........Filipe Laíns (1)
│ ├── helpers.c...............Lysandros Nikolaou (1)
│ ├── helpers.h...............Lysandros Nikolaou (1)
│ ├── readline_tokenizer.c....Lysandros Nikolaou (1)
│ ├── string_tokenizer.c......Lysandros Nikolaou (1)
│ ├── tokenizer.h.............Lysandros Nikolaou (1)
│ └── utf8_tokenizer.c........Lysandros Nikolaou (1)
├── .cvsignore..................Martin v. Löwis (1)
├── Makefile.in.................Guido van Rossum (10)
├── Python.asdl.................Benjamin Peterson (14)
├── acceler.c...................Guido van Rossum (17)
├── action_helpers.c............Pablo Galindo Salgado (6)
├── asdl.py.....................Benjamin Peterson (7)
├── asdl_c.py...................Benjamin Peterson (42)
├── assert.h....................Guido van Rossum (11)
├── bitset.c....................Guido van Rossum (12)
├── firstsets.c.................Guido van Rossum (13)
├── grammar.c...................Guido van Rossum (20)
...
(以上输出继续,但为了本 README 的目的已被省略。)
请注意,无论是否使用 -a
标志,编辑不在工作树中的文件的提交仍将计入显示在该文件祖先目录旁边的总数。 在以上两个示例中,Guido van Rossum 显示为 Parser/
目录的总体最高提交者,尽管需要使用 -a
标志列出整个树才能看到他的大多数提交都是针对此后已被移动或删除的文件。
与 table
子命令一样,你可以指定一个 "commit-ish"。 下一个示例显示了在 3.