美文网首页
git blame使用

git blame使用

作者: Hudi233 | 来源:发表于2019-06-10 20:07 被阅读0次

    命令名称:

          git-blame - 显示文件的每一行最后修改的版本和作者

    用法:

          git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental] [-L n,m]

                      [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>] [--abbrev=<n>]

                      [<rev> | --contents <file> | --reverse <rev>] [--] <file>

    描述

          在给定文件中的每一行中注释来自最后修改该行的修订者信息。可以选择从给定修订版本开始注释。

          该命令还可以限制注释的行范围。

          在整个文件重命名过程中自动跟踪行源(目前没有关闭重命名跟踪的选项)。要跟踪从一个文件移动到另一个文件的行,或要跟踪从另一个文件复制和粘贴的行,等等,请参见-C和-M选项。

          执行结果中不会展示已删除或替换的行;您需要使用以下工具获取,如git diff 或 “pickaxe”接口。

          除了支持文件注释之外,Git还支持搜索开发历史,以确定代码片段何时发生在更改中。这使得跟踪代码片段何时添加到文件中、何时在文件之间移动或复制、何时最终删除或替换成为可能。它通过在diff中搜索文本字符串来工作。例如

              $ git log --pretty=oneline -S'blame_usage'

              5040f17eba15504bad66b14a645bddd9b015ebb7 blame -S <ancestry-file>

              ea4c7f9bf69e781dd0cd88d2bccb2bf5cc15c9a7 git-blame: Make the output

    选项:

          -b

              为边界提交显示空白SHA-1。这也可以通过blame的blame.blankboundary选项来控制

          --root

              不要将root提交视为边界。这也可以通过blame的blame.showroot选项来控制

          --show-stats

              在blame输出的末尾包括附加统计数据。

          -L <start>,<end>

              只标注给定的行范围。 <start> 和 <end>采取形式:

              ·  数字

                  如果 <start> 或 <end> 是数字的话,意味着从一个绝对行号开始(行号从1开始计算)

              ·  /正则表达式/

                  这个形式将使用与给定的POSIX regex匹配的第一行。如果<end> 是正则, 它将从给出的<start>行开始搜索。

              ·  +offset or -offset

                  仅支持 <end> 并且需要指定<start>给出的行之前或之后的行数。

          -l

              展示long rev (Default: off).

          -t

              展示 raw timestamp (Default: off).

          -S <revs-file>

              使用来自revs-file的修订,而不是调用git-rev-list(1)。

          --reverse

              让历史记录从以前向后展示。这里显示的不是一行出现的修订,而是一行存在的最后一个修订。This requires a range of revision like START..END where the path to blame exists in START.

          -p, --porcelain

              以供机器使用的格式显示。

          --line-porcelain

              显示瓷器格式,但是输出每一行的提交信息,而不仅仅是第一次引用提交--porcelain.

          --incremental

              以一种为机器使用而设计的格式递增地显示结果。

          --encoding=<encoding>

              指定用于输出作者名称和提交摘要的编码。将其设置为none将使blame输出无法转换为数据。有关更多信息,请参阅git-log(1)手册页中关于编码的讨论。

          --contents <file>

              当<rev>没有指定时,命令从工作树副本开始向后注释更改。此标志使命令假装工作树副本具有指定文件的内容(指定-使命令从标准输入中读取)。

          --date <format>

              该值是以下选项之一: {relative,local,default,iso,rfc,short}. 如果--date没有在blame中提供,将使用 blame.date变量。如果 blame.date变量也没有设置,将使用iso格式。有关更多信息,请参见git-log(1)中关于--date选项的讨论。

          -M|<num>|

              Detect moved or copied lines within a file. When a commit moves or copies a block of lines (e.g. the original file has A and then B, and the commit changes it to B and then A), the traditional blame algorithm notices only half of the movement and typically blames the lines that were moved up (i.e. B) to the parent and assigns blame to the lines that were moved down (i.e. A) to the child commit. With this option, both groups of lines are blamed on the parent by running extra passes of inspection.

              <num> is optional but it is the lower bound on the number of alphanumeric characters that Git must detect as moving/copying within a file for it to associate those lines with the parent commit. The default value is 20.

          -C|<num>|

              In addition to -M, detect lines moved or copied from other files that were modified in the same commit. This is useful when you reorganize your program and move code around across files. When this option is given twice,

              the command additionally looks for copies from other files in the commit that creates the file. When this option is given three times, the command additionally looks for copies from other files in any commit.

              <num> is optional but it is the lower bound on the number of alphanumeric characters that Git must detect as moving/copying between files for it to associate those lines with the parent commit. And the default value is

              40. If there are more than one -C options given, the <num> argument of the last -C will take effect.

          -h

              Show help message.

          -c

              Use the same output mode as git-annotate(1) (Default: off).

          --score-debug

              Include debugging information related to the movement of lines between files (see -C) and lines moved within a file (see -M). The first number listed is the score. This is the number of alphanumeric characters detected as

              having been moved between or within files. This must be above a certain threshold for git blame to consider those lines of code to have been moved.

          -f, --show-name

              在原始提交中显示文件名。默认情况下,如果有来自不同名称的文件的任何行(由于重命名检测),则显示文件名。

          -n, --show-number

              显示原始提交中的行号(默认值:off)。

          -s

              从输出中取消作者名和时间戳。

          -e, --show-email

              显示作者的电子邮件而不是作者的名字(默认off)。

          -w

              在比较父版本和子版本时,忽略空格以查找行来自何处。

          --abbrev=<n>

              Instead of using the default 7+1 hexadecimal digits as the abbreviated object name, use <n>+1 digits. Note that 1 column is used for a caret to mark the boundary commit.

    THE PORCELAIN FORMAT

          In this format, each line is output after a header; the header at the minimum has the first line which has:

          ·  40-byte SHA-1 of the commit the line is attributed to;

          ·  the line number of the line in the original file;

          ·  the line number of the line in the final file;

          ·  on a line that starts a group of lines from a different commit than the previous one, the number of lines in this group. On subsequent lines this field is absent.

          This header line is followed by the following information at least once for each commit:

          ·  the author name ("author"), email ("author-mail"), time ("author-time"), and timezone ("author-tz"); similarly for committer.

          ·  the filename in the commit that the line is attributed to.

          ·  the first line of the commit log message ("summary").

          The contents of the actual line is output after the above header, prefixed by a TAB. This is to allow adding more header elements later.

          The porcelain format generally suppresses commit information that has already been seen. For example, two lines that are blamed to the same commit will both be shown, but the details for that commit will be shown only once.

          This is more efficient, but may require more state be kept by the reader. The --line-porcelain option can be used to output full commit information for each line, allowing simpler (but less efficient) usage like:

              # count the number of lines attributed to each author

              git blame --line-porcelain file |

              sed -n 's/^author //p' |

              sort | uniq -c | sort -rn

    SPECIFYING RANGES

          Unlike git blame and git annotate in older versions of git, the extent of the annotation can be limited to both line ranges and revision ranges. When you are interested in finding the origin for lines 40-60 for file foo, you

          can use the -L option like so (they mean the same thing — both ask for 21 lines starting at line 40):

              git blame -L 40,60 foo

              git blame -L 40,+21 foo

          Also you can use a regular expression to specify the line range:

              git blame -L '/^sub hello {/,/^}$/' foo

          which limits the annotation to the body of the hello subroutine.

          When you are not interested in changes older than version v2.6.18, or changes older than 3 weeks, you can use revision range specifiers similar to git rev-list:

              git blame v2.6.18.. -- foo

              git blame --since=3.weeks -- foo

          When revision range specifiers are used to limit the annotation, lines that have not changed since the range boundary (either the commit v2.6.18 or the most recent commit that is more than 3 weeks old in the above example)

          are blamed for that range boundary commit.

          A particularly useful way is to see if an added file has lines created by copy-and-paste from existing files. Sometimes this indicates that the developer was being sloppy and did not refactor the code properly. You can first

          find the commit that introduced the file with:

              git log --diff-filter=A --pretty=short -- foo

          and then annotate the change between the commit and its parents, using commit^! notation:

              git blame -C -C -f $commit^! -- foo

    INCREMENTAL OUTPUT

          When called with --incremental option, the command outputs the result as it is built. The output generally will talk about lines touched by more recent commits first (i.e. the lines will be annotated out of order) and is

          meant to be used by interactive viewers.

          The output format is similar to the Porcelain format, but it does not contain the actual lines from the file that is being annotated.

            1. Each blame entry always starts with a line of:

                  <40-byte hex sha1> <sourceline> <resultline> <num_lines>

              Line numbers count from 1.

            2. The first time that a commit shows up in the stream, it has various other information about it printed out with a one-word tag at the beginning of each line describing the extra commit information (author, email,

              committer, dates, summary, etc.).

            3. Unlike the Porcelain format, the filename information is always given and terminates the entry:

                  "filename" <whitespace-quoted-filename-goes-here>

              and thus it is really quite easy to parse for some line- and word-oriented parser (which should be quite natural for most scripting languages).

                  Note

                  For people who do parsing: to make it more robust, just ignore any lines between the first and last one ("<sha1>" and "filename" lines) where you do not recognize the tag words (or care about that particular one) at

                  the beginning of the "extended information" lines. That way, if there is ever added information (like the commit encoding or extended commit commentary), a blame viewer will not care.

    MAPPING AUTHORS

          If the file .mailmap exists at the toplevel of the repository, or at the location pointed to by the mailmap.file or mailmap.blob configuration options, it is used to map author and committer names and email addresses to

          canonical real names and email addresses.

          In the simple form, each line in the file consists of the canonical real name of an author, whitespace, and an email address used in the commit (enclosed by < and >) to map to the name. For example:

              Proper Name <commit@email.xx>

          The more complex forms are:

              <proper@email.xx> <commit@email.xx>

          which allows mailmap to replace only the email part of a commit, and:

              Proper Name <proper@email.xx> <commit@email.xx>

          which allows mailmap to replace both the name and the email of a commit matching the specified commit email address, and:

              Proper Name <proper@email.xx> Commit Name <commit@email.xx>

          which allows mailmap to replace both the name and the email of a commit matching both the specified commit name and email address.

          Example 1: Your history contains commits by two authors, Jane and Joe, whose names appear in the repository under several forms:

              Joe Developer <joe@example.com>

              Joe R. Developer <joe@example.com>

              Jane Doe <jane@example.com>

              Jane Doe <jane@laptop.(none)>

              Jane D. <jane@desktop.(none)>

          Now suppose that Joe wants his middle name initial used, and Jane prefers her family name fully spelled out. A proper .mailmap file would look like:

              Jane Doe        <jane@desktop.(none)>

              Joe R. Developer <joe@example.com>

          Note how there is no need for an entry for <jane@laptop.(none)>, because the real name of that author is already correct.

          Example 2: Your repository contains commits from the following authors:

              nick1 <bugs@company.xx>

              nick2 <bugs@company.xx>

              nick2 <nick2@company.xx>

              santa <me@company.xx>

              claus <me@company.xx>

              CTO <cto@coompany.xx>

          Then you might want a .mailmap file that looks like:

              <cto@company.xx>                      <cto@coompany.xx>

              Some Dude <some@dude.xx>        nick1 <bugs@company.xx>

              Other Author <other@author.xx>  nick2 <bugs@company.xx>

              Other Author <other@author.xx>        <nick2@company.xx>

              Santa Claus <santa.claus@northpole.xx> <me@company.xx>

          Use hash # for comments that are either on their own line, or after the email address.

    SEE ALSO

          git-annotate(1)

    GIT

          Part of the git(1) suite

    Git 1.8.3.1                                                                                                    08/23/2017                                                                                                  GIT-BLAME(1)

    相关文章

      网友评论

          本文标题:git blame使用

          本文链接:https://www.haomeiwen.com/subject/zmecxctx.html