首先請注意,git filter-branch
的工作方式是由複製提交。它從現有的待過濾的提交中提取內容,運行您提供的每個過濾器,然後從結果中進行新的提交。如果新提交與舊提交完全匹配,則新提交的ID等於舊提交的ID,這意味着新提交爲舊提交;否則新提交會得到一個新的,不同的哈希。
當所有這些都在進行時,filter-branch
記錄一張地圖:「舊散列是X,新散列是Y」。然後通過它的引用(分支和標籤名和例如)待過濾,並且如果參考- [R用於指向X,filter-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。
(哦,其中一些內容屬於主題)您是否要更改提交者電子郵件地址,作者電子郵件地址,作者和/或提交者姓名或其中多個? – torek