Bạn có thể lừa Git để sửa chữa khoảng trắng cho bạn, bằng cách lừa Git coi các thay đổi của bạn là một bản vá. Ngược lại với các giải pháp "hook pre-commit", các giải pháp này thêm các lệnh sửa lỗi khoảng trắng vào Git.
Vâng, đây là những hack.
Giải pháp mạnh mẽ
Các bí danh Git sau đây được lấy từ
của tôi~/.gitconfig
.
"Mạnh mẽ", ý tôi là những bí danh này chạy không có lỗi, làm đúng, bất kể cây hay chỉ mục có bị bẩn hay không. Tuy nhiên, chúng không hoạt động nếu một tương tác git rebase -i
đã được tiến hành; hãy xem phần kiểm tra bổ sung của tôi~/.gitconfig
nếu bạn quan tâm đến trường hợp góc này, trong đó git add -e
mẹo được mô tả ở cuối sẽ hoạt động.
Nếu bạn muốn chạy chúng trực tiếp trong shell, mà không tạo bí danh Git, chỉ cần sao chép và dán mọi thứ giữa các dấu ngoặc kép (giả sử shell của bạn giống Bash).
Sửa chỉ mục nhưng không phải cây
fixws
Bí danh Git sau đây sửa tất cả các lỗi khoảng trắng trong chỉ mục, nếu có, nhưng không chạm vào cây:
# Logic:
#
# The 'git stash save' fails if the tree is clean (instead of
# creating an empty stash :P). So, we only 'stash' and 'pop' if
# the tree is dirty.
#
# The 'git rebase --whitespace=fix HEAD~' throws away the commit
# if it's empty, and adding '--keep-empty' prevents the whitespace
# from being fixed. So, we first check that the index is dirty.
#
# Also:
# - '(! git diff-index --quiet --cached HEAD)' is true (zero) if
# the index is dirty
# - '(! git diff-files --quiet .)' is true if the tree is dirty
#
# The 'rebase --whitespace=fix' trick is from here:
# https://stackoverflow.com/a/19156679/470844
fixws = !"\
if (! git diff-files --quiet .) && \
(! git diff-index --quiet --cached HEAD) ; then \
git commit -m FIXWS_SAVE_INDEX && \
git stash save FIXWS_SAVE_TREE && \
git rebase --whitespace=fix HEAD~ && \
git stash pop && \
git reset --soft HEAD~ ; \
elif (! git diff-index --quiet --cached HEAD) ; then \
git commit -m FIXWS_SAVE_INDEX && \
git rebase --whitespace=fix HEAD~ && \
git reset --soft HEAD~ ; \
fi"
Ý tưởng là chạy git fixws
trước git commit
nếu bạn có lỗi khoảng trắng trong chỉ mục.
Sửa chỉ mục và cây
fixws-global-tree-and-index
Bí danh Git sau đây sửa tất cả các lỗi khoảng trắng trong chỉ mục và cây, nếu có:
# The different cases are:
# - dirty tree and dirty index
# - dirty tree and clean index
# - clean tree and dirty index
#
# We have to consider separate cases because the 'git rebase
# --whitespace=fix' is not compatible with empty commits (adding
# '--keep-empty' makes Git not fix the whitespace :P).
fixws-global-tree-and-index = !"\
if (! git diff-files --quiet .) && \
(! git diff-index --quiet --cached HEAD) ; then \
git commit -m FIXWS_SAVE_INDEX && \
git add -u :/ && \
git commit -m FIXWS_SAVE_TREE && \
git rebase --whitespace=fix HEAD~2 && \
git reset HEAD~ && \
git reset --soft HEAD~ ; \
elif (! git diff-files --quiet .) ; then \
git add -u :/ && \
git commit -m FIXWS_SAVE_TREE && \
git rebase --whitespace=fix HEAD~ && \
git reset HEAD~ ; \
elif (! git diff-index --quiet --cached HEAD) ; then \
git commit -m FIXWS_SAVE_INDEX && \
git rebase --whitespace=fix HEAD~ && \
git reset --soft HEAD~ ; \
fi"
Để sửa lỗi khoảng trắng trong các tệp không đảo ngược, hãy làm
git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index
Giải pháp đơn giản nhưng không mạnh mẽ
Các phiên bản này dễ sao chép và dán hơn, nhưng chúng không làm đúng nếu điều kiện phụ của chúng không được đáp ứng.
Sửa cây con gốc ở thư mục hiện tại (nhưng đặt lại chỉ mục nếu nó không trống)
Sử dụng git add -e
để "chỉnh sửa" các bản vá với trình chỉnh sửa danh tính :
:
(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
Khắc phục và bảo quản chỉ mục (nhưng không thành công nếu cây bị bẩn hoặc chỉ mục trống)
git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~
Sửa cây và chỉ mục (nhưng đặt lại chỉ mục nếu nó không trống)
git add -u :/ && git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset HEAD~
Giải thích về export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
mánh khóe
Trước khi tôi biết về git rebase --whitespace=fix
thủ thuật từ câu trả lời này, tôi đã sử dụng git add
thủ thuật phức tạp hơn ở mọi nơi.
Nếu chúng tôi làm bằng tay:
Đặt apply.whitespace
thành fix
(bạn chỉ phải thực hiện việc này một lần):
git config apply.whitespace fix
Điều này nói với Git để sửa khoảng trắng trong các bản vá .
Thuyết phục Git để coi những thay đổi của bạn như một bản vá :
git add -up .
Nhấn a+ enterđể chọn tất cả các thay đổi cho mỗi tệp. Bạn sẽ nhận được cảnh báo về việc Git sửa các lỗi khoảng trắng của bạn.
( git -c color.ui=auto diff
tại thời điểm này cho thấy các thay đổi không được lập chỉ mục của bạn chính xác là các lỗi khoảng trắng).
Xóa các lỗi khoảng trắng khỏi bản sao làm việc của bạn:
git checkout .
Mang lại những thay đổi của bạn (nếu bạn chưa sẵn sàng cam kết chúng):
git reset
Các GIT_EDITOR=:
phương tiện để sử dụng :
như là trình soạn thảo, và như một lệnh
:
là danh tính.