2016-09-20 80 views
1

我有許多來自maven插件的使用真實用戶憑證的遺留提交。 我知道如何通過電子郵件提交查找和更改作者(短版爲例):更改作者以提交特定消息

#!/bin/sh 

git filter-branch --env-filter ' 
    OLD_EMAIL="[email protected]" 
    CORRECT_EMAIL="[email protected]" 
    if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] 
    then 
     export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" 
    fi 
' --tag-name-filter cat -- --all 

我怎麼能由以「[Maven的插件] ...」開頭的消息過濾器提交?

+0

(哦,其中一些內容屬於主題)您是否要更改提交者電子郵件地址,作者電子郵件地址,作者和/或提交者姓名或其中多個? – torek

回答

3

首先請注意,git filter-branch的工作方式是由複製提交。它從現有的待過濾的提交中提取內容,運行您提供的每個過濾器,然後從結果中進行新的提交。如果新提交與舊提交完全匹配,則新提交的ID等於舊提交的ID,這意味着新提交舊提交;否則新提交會得到一個新的,不同的哈希。

當所有這些都在進行時,filter-branch記錄一張地圖:「舊散列是X,新散列是Y」。然後通過它的引用(分支和標籤名和例如)待過濾,並且如果參考- [R用於指向Xfilter-branch使得- [R指向ý代替。

事實上,你可以改變幾乎任何東西。棘手的部分是決定其中承諾應該改變,然後實際上改變只適合那些提交的權利。在這種情況下,您想修改消息以已知字符串開頭的提交副本。

標準--env-filter調用此方法:

eval "$filter_env" < /dev/null || 
    die "env filter failed: $filter_env" 

這意味着它不必提交消息即時訪問。它,然而,有承諾的ID(在$GIT_COMMIT),因此,所有你需要做的是閱讀提交信息,使你的環境變量變化對有條件的:

if git log --no-walk --pretty=format:%b $GIT_COMMIT | 
    grep '^\[maven-plugin] ' >/dev/null 
then 
    export GIT_AUTHOR_NAME="new author name" ... # set exports here 
fi 

使用git log --no-walk --format=<format>,您可以提取任何你就像之前的提交一樣。 (如果你的git log命令是很老的,你需要的--pretty=format:--pretty=tformat:拼寫。)

對於一套東西,你可以export,看到the git commit-tree documentation

+0

前兩段是我見過的'git filter-branch'的最佳解釋。 – fracz