Tiếp tục https://stackoverflow.com/a/20574486/4935114 , @Mike đề xuất tạo một pre-commit
hook sẽ grep
nằm trong các tệp theo giai đoạn cho các dòng mà người ta có thể muốn bỏ qua. Cái móc sẽ kiểm tra xem những dòng đó có được dàn dựng hay không. Nếu vậy, nó là một echo
cảnh báo và nó exit
có mã 1
nên quá trình cam kết sẽ không tiếp tục.
Lấy cảm hứng từ câu trả lời của @ Mike , tôi thấy mình có lẽ đang sử dụng một phiên bản cải tiến của câu móc của anh ấy, tự động đặt reset
(có -p
cờ) dòng cụ thể mà chúng tôi muốn bỏ qua.
Tôi không chắc hook này sẽ hoạt động trong trường hợp bạn có nhiều tệp với dòng này bị bỏ qua, nhưng pre-commit
hook này tìm kiếm sự thay đổi trong dòng này trong một tệp cụ thể buildVars.java
. Tập lệnh hook trông như thế này khi tôi thử nghiệm nó trên máy tính của mình.
#!/bin/sh
# this hook looks for lines with the text `var isPhoneGap = false;` in the file `buildVars.java` and it resets these lines to the previous state before staged with `reset -p`
if [[ $(git diff --no-ext-diff --cached buildVars.java | grep --count -e "var\ isPhoneGap[\ ]*=[\ ]*") -ne 0 ]]; then
cat <<EOW
WARNING: You are attempting to commit changes which are not supposed to be commited according to this \`pre-commit\` hook
This \`pre-commit\` hook will reset all the files containing this line to it's previous state in the last commit.
EOW
echo /$'\n'isPhoneGap$'\n'y$'\n'q | git reset -p
# BONUS: Check if after reseting, there is no actual changes to be commited and if so, exit 1 so the commit process will abort.
if [[ $(git diff --no-ext-diff --cached | wc -l) -eq 0 ]]; then
echo there are no actual changes to be commited and besides the change to the variable \'isPhoneGap\' so I won\'t commit.
exit 1
fi
fi
Giải trình
Những gì tôi đã làm là lặp lại một chuỗi điều khiển tìm kiếm regex isPhoneGap
trong một reset
quá trình tương tác . Do đó, giả lập người dùng nhấn /
để tìm kiếm isPhoneGap
, nhấn y
khi được hỏi liệu anh ta có muốn hủy bản vá này hay không và cuối cùng nhấn q
để thoát khỏi tương tác reset
.
Quá trình vá ngược tương tác được ghi lại tại đây: https://git-scm.com/docs/git-add#git-add-patch
LƯU Ý: Tập lệnh trên giả định rằng biến interactive.singleKey
là false
. Nếu bạn đã định cấu hình của mình thành true
, hãy xóa bất kỳ lệnh nào $'\n'
khỏi echo
lệnh ngay sau cảnh báo.