Navigation Menu

Toggle navigation

Sign in

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

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

Vanity screenshot 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.