Thêm phần sau vào .gitconfig
:
anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"
Cảm ơn câu trả lời của @Colin Herbert cho cảm hứng.
Giải thích cú pháp
Cuối cùng #
phải được trích dẫn để nó không được coi là một nhận xét bên trong .gitconfig
, mà thay vào đó được chuyển qua và được coi là một nhận xét bên trong vỏ - nó được chèn vào giữa phần cuối của các git apply
đối số do người dùng cung cấp git
tự động đặt tại cuối dòng lệnh. Các đối số này không muốn ở đây - chúng tôi không muốn git apply
sử dụng chúng, do đó, ký tự nhận xét trước. Bạn có thể muốn chạy lệnh này GIT_TRACE=1 git anw
để thấy điều này trong hành động.
Các --
tín hiệu kết thúc các đối số và cho phép trường hợp bạn có một tệp có tên -w
hoặc một cái gì đó trông giống như một chuyển đổi git diff
.
Các trích dẫn kép đã thoát $@
được yêu cầu để duy trì mọi đối số được trích dẫn do người dùng cung cấp. Nếu "
ký tự không được thoát, nó sẽ được .gitconfig
trình phân tích cú pháp sử dụng và không đến được vỏ.
Lưu ý: .gitconfig
alias phân tích cú pháp không công nhận đơn dấu ngoặc kép như bất cứ điều gì đặc biệt - nhân vật duy nhất đặc biệt của nó là "
, \
, \n
, và ;
(bên ngoài của một "
chuỗi -quoted). Đây là lý do tại sao "
phải luôn luôn được thoát, ngay cả khi có vẻ như nó nằm trong một chuỗi trích dẫn duy nhất (mà git hoàn toàn không biết về).
Điều này rất quan trọng, vd. nếu bạn có một bí danh tiện dụng để thực thi một bash
lệnh trong thư mục gốc của cây làm việc. Công thức không chính xác là:
sh = !bash -c '"$@"' -
Trong khi cái đúng là:
sh = !bash -c '\"$@\"' -
git apply --ignore-whitespace
nếu không bản vá sẽ không áp dụng vì những lý do rõ ràng.