檢索文件中特定行的提交日誌?

有沒有辦法讓git給你一個提交日誌,只提交觸及文件中特定的提交? git

git blame同樣,可是git blame會告訴你觸及特定行的最後提交。 github

我真的想獲得一個相似的日誌,而不是文件中任何地方的提交列表,而只是提交到特定行的提交。 web


#1樓

這將爲每一個有意義的修訂調用git blame來顯示文件$FILE$LINE正則表達式

git log --format=format:%H $FILE | xargs -L 1 git blame $FILE -L $LINE,$LINE

像往常同樣,責備顯示每行開頭的修訂號。 你能夠追加 vim

| sort | uniq -c

獲取聚合結果,相似於更改此行的提交列表。 (不徹底是,若是代碼只是被移動了,這可能會爲該行的不一樣內容顯示兩次相同的提交ID。對於更詳細的分析,您必須對相鄰提交的git blame結果進行滯後比較。任何人?) bash


#2樓

這是一個定義git別名的解決方案,所以您能夠像這樣使用它: ide

git rblame -M -n -L '/REGEX/,+1' FILE

輸出示例: 函數

00000000 18 (Not Committed Yet 2013-08-19 13:04:52 +0000 728) fooREGEXbar
15227b97 18 (User1 2013-07-11 18:51:26 +0000 728) fooREGEX
1748695d 23 (User2 2013-03-19 21:09:09 +0000 741) REGEXbar

您能夠在.gitconfig中定義別名,或者只需運行如下命令 spa

git config alias.rblame !sh -c 'while line=$(git blame "$@" $commit 2>/dev/null); do commit=${line:0:8}^; [ 00000000^ == $commit ] && commit=$(git rev-parse HEAD); echo $line; done' dumb_param

這是一個醜陋的單行,因此這裏是一個去混淆的等效bash函數: firefox

git-rblame () {
    local commit line
    while line=$(git blame "$@" $commit 2>/dev/null); do
        commit="${line:0:8}^"
        if [ "00000000^" == "$commit" ]; then
            commit=$(git rev-parse HEAD)
        fi
        echo $line
    done
}

pickaxe解決方案( git log --pickaxe-regex -S'REGEX' )只會爲您提供行添加/刪除,而不是包含正則表達式的行的其餘更改。

此解決方案的侷限性在於git blame僅返回第一個REGEX匹配,所以若是存在多個匹配,則遞歸能夠「跳轉」以跟隨另外一行。 請務必檢查完整的歷史記錄輸出以發現這些「跳轉」,而後修復您的REGEX以忽略寄生蟲線。

最後,這是一個替代版本,在每次提交時運行git show以得到完整的diff:

git config alias.rblameshow !sh -c 'while line=$(git blame "$@" $commit 2>/dev/null); do commit=${line:0:8}^; [ 00000000^ == $commit ] && commit=$(git rev-parse HEAD); git show $commit; done' dumb_param

#3樓

另請參閱Git:發現哪些提交觸及了一系列行


從Git 1.8.4開始git log-L來查看一系列行的演變。

例如,假設你看看git blame的輸出。 這裏-L 150,+11表示「僅查看150到150 + 11行」:

$ git blame -L 150,+11 -- git-web--browse.sh
a180055a git-web--browse.sh (Giuseppe Bilotta 2010-12-03 17:47:36 +0100 150)            die "The browser $browser is not
a180055a git-web--browse.sh (Giuseppe Bilotta 2010-12-03 17:47:36 +0100 151)    fi
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 152) fi
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 153) 
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 154) case "$browser" in
81f42f11 git-web--browse.sh (Giuseppe Bilotta 2010-12-03 17:47:38 +0100 155) firefox|iceweasel|seamonkey|iceape)
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 156)    # Check version because firefox < 2.0 do
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 157)    vers=$(expr "$($browser_path -version)" 
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 158)    NEWTAB='-new-tab'
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 159)    test "$vers" -lt 2 && NEWTAB=''
a0685a4f git-web--browse.sh (Dmitry Potapov   2008-02-09 23:22:22 -0800 160)    "$browser_path" $NEWTAB "$@" &

而你想知道如今的第155行的歷史。

而後,使用git log 。 這裏, -L 155,155:git-web--browse.sh表示「跟蹤名爲git-web--browse.sh的文件中155到155行的演變」。

$ git log --pretty=short -u -L 155,155:git-web--browse.sh
commit 81f42f11496b9117273939c98d270af273c8a463
Author: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>

    web--browse: support opera, seamonkey and elinks

diff --git a/git-web--browse.sh b/git-web--browse.sh
--- a/git-web--browse.sh
+++ b/git-web--browse.sh
@@ -143,1 +143,1 @@
-firefox|iceweasel)
+firefox|iceweasel|seamonkey|iceape)

commit a180055a47c6793eaaba6289f623cff32644215b
Author: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>

    web--browse: coding style

diff --git a/git-web--browse.sh b/git-web--browse.sh
--- a/git-web--browse.sh
+++ b/git-web--browse.sh
@@ -142,1 +142,1 @@
-    firefox|iceweasel)
+firefox|iceweasel)

commit 5884f1fe96b33d9666a78e660042b1e3e5f9f4d9
Author: Christian Couder <chriscool@tuxfamily.org>

    Rename 'git-help--browse.sh' to 'git-web--browse.sh'.

diff --git a/git-web--browse.sh b/git-web--browse.sh
--- /dev/null
+++ b/git-web--browse.sh
@@ -0,0 +127,1 @@
+    firefox|iceweasel)

#4樓

一個很是簡單的方法是使用vim-fugitive 。 只需在vim中打開文件,使用V選擇您感興趣的行,而後輸入

:Glog

如今,您可使用:cnext:cprev來查看修改該行的文件的全部修訂版。 在任什麼時候候,輸入:Gblame以查看sha,做者和日期信息。


#5樓

嘗試使用Git 1.8.4中實現的如下命令。

git log -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

因此,你的狀況upperLimitlowerLimit是感動line_number

更多信息 - https://www.techpurohit.com/list-some-useful-git-commands

相關文章
相關標籤/搜索