?
This document uses PHP Chinese website manual Release
git-blame - 顯示修改和作者最后修改了文件的每一行
git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental] [-L <range>] [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>] [--progress] [--abbrev=<n>] [<rev> | --contents <file> | --reverse <rev>..<rev>] [--] <file>
使用上次修改該行的修訂版中的信息為給定文件中的每一行注釋?;蛘撸瑥慕o定修訂開始注釋。
指定一次或多次時,-L
將注釋限制為所請求的行。
行的起源會自動沿著整個文件重命名(目前沒有選項可以將重命名 - 關(guān)閉)。要追蹤從一個文件移動到另一個文件的行,或者遵循從其他文件復(fù)制并粘貼的行等,請參閱-C
和-M
選項。
報告沒有告訴你任何有關(guān)已刪除或替換的行; 您需要使用git diff
以下段落中簡要提及的工具或“pickaxe”接口。
除了支持文件注釋之外,Git 還支持搜索開發(fā)歷史記錄,以了解更改中發(fā)生代碼段的時間。這使得追蹤代碼片段何時被添加到文件,在文件之間移動或復(fù)制,并最終被刪除或替換成為可能。它通過在 diff 中搜索文本字符串來工作。搜索blame_usage
以下內(nèi)容的鎬接口的一個小例子:
$ git log --pretty=oneline -S'blame_usage'5040f17eba15504bad66b14a645bddd9b015ebb7 blame -S <ancestry-file>ea4c7f9bf69e781dd0cd88d2bccb2bf5cc15c9a7 git-blame: Make the output
-b
顯示邊界提交的空白 SHA-1。這也可以通過blame.blankboundary
配置選項來控制。
--root
不要將根提交視為邊界。這也可以通過blame.showRoot
配置選項來控制。
--show-stats
在責(zé)備輸出結(jié)尾包含更多統(tǒng)計數(shù)據(jù)。
-L <start>,<end> -L :<funcname>
僅注釋給定的線范圍??梢远啻沃付?。重疊范圍是允許的。
<開始>和<結(jié)束>是可選的。“-L <開始>”或“-L <開始>”跨越從<開始>到文件結(jié)束。“-L,<end>”從文件開始到<結(jié)束>。
<開始>和<結(jié)束>可以采取以下形式之一:
數(shù)字 如果<開始>或<結(jié)束>是一個數(shù)字,它將指定一個絕對行號(行數(shù)從1開始)。
/ regex / 此表單將使用與給定的 POSIX 正則表達(dá)式匹配的第一行。如果<start>是一個正則表達(dá)式,它將從前一個-L
范圍的末尾(如果有的話)開始搜索,否則從文件起始處開始搜索。如果<start>是“^ / regex /”,它將從文件開頭搜索。如果<end>是一個正則表達(dá)式,它將從<start>給出的行開始搜索。
+ offset 或 -offset 這僅對<end>有效,并將在<start>給出的行之前或之后指定行數(shù)。
如果給出“:<funcname>”來代替<start>和<end>,它是一個正則表達(dá)式,表示從匹配<funcname>的第一個funcname行到下一個funcname行的范圍?!埃?lt;funcname>”從上一個-L
范圍的末尾(如果有)搜索,否則從文件開頭搜索。“^:<funcname>”從文件開頭搜索。
-l
顯示長時間(默認(rèn):關(guān)閉)。
-t
顯示原始時間戳(默認(rèn)值:關(guān)閉)。
-S <revs-file>
使用 revs-file 中的修訂版而不是調(diào)用 git-rev-list [1]。
--reverse <rev>..<rev>
前進(jìn)而不是后退。它不是顯示一行出現(xiàn)的修訂,而是顯示一行存在的最后修訂。這需要一系列的修訂,如 START..END,在 START 中存在責(zé)任路徑。git blame --reverse START
是git blame --reverse START..HEAD
為了方便。
-p --porcelain
以設(shè)計用于機器消耗的格式顯示。
--line-porcelain
顯示 porcelain瓷格式,但輸出每行的提交信息,而不僅僅是第一次引用提交。意味著 - 瓷器。
--incremental
以設(shè)計用于機器消耗的格式逐步顯示結(jié)果。
--encoding=<encoding>
指定用于輸出作者姓名和提交摘要的編碼。將其設(shè)置為none
使責(zé)備輸出未轉(zhuǎn)換的數(shù)據(jù)。有關(guān)更多信息,請參閱有關(guān) git-log [1]手冊頁中編碼的討論。
--contents <file>
當(dāng)未指定<rev>時,該命令注釋從工作樹副本向后開始的更改。該標(biāo)志使命令假裝工作樹副本具有指定文件的內(nèi)容(指定-
使命令從標(biāo)準(zhǔn)輸入中讀?。?。
--date <format>
指定用于輸出日期的格式。如果未提供--date,則使用 blame.date 配置變量的值。如果 blame.date 配置變量也未設(shè)置,則使用 iso 格式。有關(guān)支持的值,請參閱 git-log [1]上的--date 選項的討論。
--no-progress
當(dāng)連接到終端時,默認(rèn)情況下標(biāo)準(zhǔn)錯誤流會報告進(jìn)度狀態(tài)。即使沒有附加到終端,該標(biāo)志也可以進(jìn)行進(jìn)度報告。不能--progress
與--porcelain
或者 --incrementa
一起使用l
。
-M<num>
檢測文件中移動或復(fù)制的行。當(dāng)提交移動或復(fù)制一行代碼塊時(例如,原始文件有A然后B提交將其更改為B然后A),傳統(tǒng)blame
算法只會注意到一半的移動,并且通常會將被移動的行(即B)交給父母,并將責(zé)任分配給向下移動(即A)到子女提交的行。有了這個選項,通過運行額外的檢查通道,這兩組線都被歸咎于父母。
<num>是可選的,但它是 Git 必須檢測的字母數(shù)字字符數(shù)的下限,以便在文件中移動/復(fù)制,以便將這些行與父提交相關(guān)聯(lián)。默認(rèn)值是20。
-C<num>
除了-M
檢測從同一提交中修改的其他文件移動或復(fù)制的行之外。當(dāng)您重新組織您的程序并在各個文件之間移動代碼時,這非常有用。當(dāng)該選項被賦予兩次時,該命令會另外在創(chuàng)建該文件的提交中查找來自其他文件的副本。當(dāng)該選項被賦予三次時,該命令還會在任何提交中查找來自其他文件的副本。
<num>是可選的,但它是 Git 必須檢測的字母數(shù)字字符數(shù)的下限,作為文件之間的移動/復(fù)制,以便將這些行與父提交相關(guān)聯(lián)。默認(rèn)值是40.如果有多個-C
選項,最后的<num>參數(shù)-C
將生效。
-h
顯示幫助信息。
-c
使用與 git-annotate [1]相同的輸出模式(默認(rèn)值:關(guān)閉)。
--score-debug
包含與文件之間的行移動有關(guān)的調(diào)試信息(請參閱參考資料-C
)和文件中移動的行(請參閱參考資料-M
)。列出的第一個數(shù)字是分?jǐn)?shù)。這是檢測為在文件之間或文件內(nèi)移動的字母數(shù)字字符的數(shù)量。這必須高于某個閾值git blame
才能考慮這些代碼行已被移動。
-f --show-name
在原始提交中顯示文件名。默認(rèn)情況下,如果由于重命名檢測而出現(xiàn)來自具有不同名稱的文件的任何行,則會顯示文件名。
-n --show-number
在原始提交中顯示行號(默認(rèn)值:關(guān)閉)。
-s
從輸出中抑制作者姓名和時間戳。
-e --show-email
顯示作者電子郵件而不是作者姓名(默認(rèn):關(guān)閉)。這也可以通過blame.showEmail
配置選項來控制。
-w
比較父母的版本和孩子的時候,忽略空格以找到行的來源。
--abbrev=<n>
使用默認(rèn)的 7 + 1 十六進(jìn)制數(shù)字作為縮寫對象名稱,而不是使用<n> +1個數(shù)字。請注意,1列用于插入符號來標(biāo)記邊界提交。
--indent-heuristic --no-indent-heuristic
這些是為了幫助調(diào)試和調(diào)整實驗啟發(fā)式(默認(rèn)情況下是關(guān)閉的),這些啟發(fā)式技術(shù)改變了差異邊界以使修補程序更易于閱讀。
在這種格式下,每一行在一個標(biāo)題后輸出; 最低標(biāo)題的第一行有:
該行提交的40字節(jié) SHA-1歸因于;
原始文件中行的行號;
最終文件中行的行號;
在從一個不同于上一個提交的提交開始一組行的行中,該行中的行數(shù)。在隨后的行中,該字段不存在。
對于每個提交,此標(biāo)題行后面至少有一次以下信息:
作者姓名(“作者”),電子郵件(“作者郵件”),時間(“作者時間”)和時區(qū)(“author-tz”); 提交者也是如此。
行被歸于的提交中的文件名。
提交日志消息的第一行(“摘要”)。
實際行的內(nèi)容在上面的標(biāo)題之后輸出,以 TAB 為前綴。這是為了稍后允許添加更多的標(biāo)題元素。
porcelain(瓷器)格式通常會抑制已經(jīng)看到的提交信息。例如,兩條指向同一提交的行都會顯示,但該提交的詳細(xì)信息只會顯示一次。這樣更有效率,但可能需要讀者保留更多的狀態(tài)。該--line-porcelain
選項可用于輸出每行的完整提交信息,從而允許更簡單(但效率較低)的用法,如:
# count the number of lines attributed to each author git blame --line-porcelain file |sed -n 's/^author //p' |sort | uniq -c | sort -rn
不同于git blame
與git annotate
在舊版本的 git 的,注釋的程度可以被限制到兩個線范圍和修訂的范圍。將-L
注釋限制為一系列行的選項可以多次指定。
當(dāng)你有興趣為foo
文件尋找40-60行的起源時,你可以使用-L
像這樣的選項(它們的意思是相同的 - 都要求從第40行開始的21行):
git blame -L 40,60 foo git blame -L 40,+21 foo
你也可以使用正則表達(dá)式來指定行范圍:
git blame -L '/^sub hello {/,/^}$/' foo
這將注釋限制在hello
子例程的主體中。
如果您對版本v2.6.18以前的更改不感興趣,或者更改時間超過3周,則可以使用類似于git rev-list
以下內(nèi)容的版本范圍說明符:
git blame v2.6.18.. -- foo git blame --since=3.weeks -- foo
使用修訂范圍說明符來限制注釋時,自范圍邊界(上圖中的提交v2.6.18或最近提交超過3周)以來未更改的行被指定為該范圍邊界承諾。
一種特別有用的方法是查看添加的文件是否具有通過從現(xiàn)有文件進(jìn)行復(fù)制和粘貼創(chuàng)建的行。有時候這表明開發(fā)人員馬虎,沒有正確重構(gòu)代碼。您可以首先找到引入該文件的提交:
git log --diff-filter=A --pretty=short -- foo
然后使用commit^!
符號注釋提交與其父母之間的更改:
git blame -C -C -f $commit^! -- foo
使用--incremental
選項調(diào)用時,該命令會在結(jié)果生成時輸出結(jié)果。輸出通常會首先討論最近提交時觸及的行(即行將被亂序注釋),并被交互式查看者使用。
輸出格式與 Porcelain 格式類似,但不包含正在注釋的文件中的實際行。
每個blame條目總是以一行:<40-byte hex sha1> <sourceline> <resultline> <num_lines>
Line numbers count from 1.
當(dāng)一次提交首次出現(xiàn)在流中時,它會在每行開始處描述額外提交信息(作者,電子郵件,提交者,日期,摘要等等)中打印出各種其他信息。 )。
與 Porcelain 格式不同,文件名信息總是給出并終止條目:“filename”<whitespace-quoted-filename-goes-here>
因此解析某些面向行和面向字的解析器(對于大多數(shù)腳本語言而言這應(yīng)該是很自然的)真的很容易。
Note
對于進(jìn)行解析的人來說:為了使其更加健壯,只要忽略第一個和最后一個(“<sha1>”和“文件名”行)之間不識別標(biāo)記詞(或關(guān)心那個特定詞)的任何行,在“擴展信息”的開頭。這樣,如果有任何增加的信息(如提交編碼或擴展提交評論),責(zé)備觀眾不會在意。
如果文件.mailmap
存在于存儲庫的頂層,或者位于 mailmap.file 或 mailmap.blob 配置選項所指向的位置,則它用于將作者和提交者名稱以及電子郵件地址映射到規(guī)范的實名和電子郵件地址。
在簡單的形式中,文件中的每一行由作者的標(biāo)準(zhǔn)真實姓名,空格以及在提交中使用的電子郵件地址(用<
and >
括起來)映射到名稱。例如:
Proper Name <commit@email.xx>
更復(fù)雜的形式是:
<proper@email.xx> <commit@email.xx>
它允許 mailmap 只替換提交的電子郵件部分,并且:
Proper Name <proper@email.xx> <commit@email.xx>
它允許 mailmap 替換與指定的提交電子郵件地址匹配的提交的名稱和電子郵件,以及:
Proper Name <proper@email.xx> Commit Name <commit@email.xx>
它允許 mailmap 替換與指定的提交名稱和電子郵件地址相匹配的提交的名稱和電子郵件。
示例1:您的歷史記錄包含兩位作者 Jane 和 Joe 的提交,他們的名字以幾種形式出現(xiàn)在存儲庫中:
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)>
現(xiàn)在假設(shè)喬想讓他的中間名得到最初的使用,而珍則更喜歡將她的姓氏完整地拼出來。一個合適的.mailmap
文件應(yīng)該是這樣的:
Jane Doe <jane@desktop.(none)>Joe R. Developer <joe@example.com>
注意如何不需要輸入<jane@laptop.(none)>
,因為該作者的真實姓名已經(jīng)是正確的。
示例2:您的存儲庫包含以下作者的提交:
nick1 <bugs@company.xx>nick2 <bugs@company.xx>nick2 <nick2@company.xx>santa <me@company.xx>claus <me@company.xx>CTO <cto@coompany.xx>
那么你可能需要一個如下所示的.mailmap
文件:
<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>
將散列#
用于自己的行中或電子郵件地址之后的注釋。