Đây là một giải pháp xác định bí danh git, vì vậy bạn sẽ có thể sử dụng nó như thế:
git rblame -M -n -L '/REGEX/,+1' FILE
Ví dụ đầu ra:
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
Bạn có thể xác định bí danh trong .gitconfig hoặc chỉ cần chạy lệnh sau
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
Đây là một lớp lót xấu xí, vì vậy đây là một hàm bash tương đương bị che khuất:
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
}
Giải pháp pickaxe ( git log --pickaxe-regex -S'REGEX ' ) sẽ chỉ cung cấp cho bạn các bổ sung / xóa dòng, không phải là các thay đổi khác của dòng chứa biểu thức chính quy.
Một hạn chế của giải pháp này là git đổ lỗi chỉ trả về trận đấu REGEX thứ nhất, vì vậy nếu có nhiều trận đấu tồn tại, đệ quy có thể "nhảy" để đi theo một dòng khác. Hãy chắc chắn kiểm tra đầu ra lịch sử đầy đủ để phát hiện ra những "bước nhảy" đó và sau đó sửa REGEX của bạn để bỏ qua các dòng ký sinh trùng.
Cuối cùng, đây là một phiên bản thay thế chạy git show trên mỗi cam kết để có được sự khác biệt đầy đủ:
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