Chỉ sử dụng bash
, diff
, tput
, và less
, chúng ta có thể xấp xỉ chặt chẽ đầu ra của git diff
. Tuy nhiên, sẽ có một số khác biệt đáng chú ý do sự thiển cận của các diff
lập trình viên.
Đặt định nghĩa hàm Bash sau trong một số tệp được lấy tự động bởi tài khoản người dùng của bạn và bạn sẽ có thể truy cập hàm từ dòng lệnh:
function gdiff()
{
local REG=`tput op`
local GRP=`tput setaf 6`
local ADD=`tput setaf 2`
local REM=`tput setaf 1`
local NL=$'\n'
local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"
local UNCH_GRP_FMT=''
[[ "${1}" == '@full' ]] && {
UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
shift
}
diff \
--new-line-format="${ADD}+%L${REG}" \
--old-line-format="${REM}-%L${REG}" \
--unchanged-line-format=" %L${REG}" \
--new-group-format="${GRP_LABEL}${NL}%>" \
--old-group-format="${GRP_LABEL}${NL}%<" \
--changed-group-format="${GRP_LABEL}${NL}%<%>" \
--unchanged-group-format="${UNCH_GRP_FMT}" \
"${@}" | less -FXR
}
Chức năng này hoạt động như sau:
- Cuối cùng,
diff
được gọi với các tùy chọn định dạng khác nhau để chỉ định cách thay đổi trong các tệp sẽ được hiển thị.
tput
được sử dụng để chèn mã màu ANSI vào các tùy chọn định dạng đó. Lưu ý rằng khi sử dụng các thiết bị đầu cuối không phải ANSI, bạn có thể phải thay thế tput setaf
bằng tput setf
.
- Đầu ra của
diff
được dẫn vào less
. -R
cho phép màu ANSI được bảo tồn. -X
ngăn không cho less
xóa màn hình khi thoát. -F
ngăn không cho less
hoạt động như một máy nhắn tin nếu đầu ra vừa với một màn hình.
- Nếu tham số đầu tiên là
@full
, hàm sẽ hiển thị tất cả các dòng không thay đổi ngoài các dòng được thêm và xóa.
Lưu ý những khác biệt sau đây giữa phương pháp này và git diff
:
git diff
báo cáo ba dòng bối cảnh xung quanh mỗi thay đổi. Thật không may, diff
dường như phàn nàn và thoát nếu bạn muốn chỉ định số lượng dòng ngữ cảnh đồng thời chỉ định đồng thời các tùy chọn định dạng. (Ít nhất là trong Mac OS X Yosemite). Cảm ơn các diff
lập trình viên. Do đó, bạn có thể yêu cầu không có dòng ngữ cảnh nào xung quanh mỗi thay đổi, đó là hành vi mặc định hoặc bạn có thể yêu cầu tất cả các dòng không thay đổi trong tệp cũng được báo cáo, bằng cách chỉ định @full
làm tham số đầu tiên.
- Bởi vì các dòng của bối cảnh khác với
git diff
, số dòng được báo cáo bởi chức năng này cũng sẽ khác với các dòng được báo cáo bởi git diff
.
- Bạn có thể thấy sự hiện diện của các thay đổi một dòng được báo cáo, đó là hành vi chính xác, nhưng gây khó chịu khi tệp thay đổi của bạn chứa chèn các dòng trống đơn. Tôi nghĩ rằng
git diff
giao dịch với điều này tốt hơn, thông qua các dòng bối cảnh của nó. Bạn có thể thử chuyển các tùy chọn khác nhau để diff
xử lý tốt hơn khoảng trắng, nếu bạn thích.
newtext
trong/etc/colordiff
. Tôi nghĩ git sử dụng màu xanh lá cây?