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 gittự độ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 applysử 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 -whoặ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 .gitconfigtrình phân tích cú pháp sử dụng và không đến được vỏ.
Lưu ý: .gitconfigalias 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 bashlệ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-whitespacenếu không bản vá sẽ không áp dụng vì những lý do rõ ràng.