변경 사항을 패치로 처리하도록 Git을 속여서 Git이 공백을 수정하도록 속일 수 있습니다. "사전 커밋 후크"솔루션과 달리이 솔루션은 Git에 공백 수정 명령을 추가합니다.
예, 이것은 해킹입니다.
강력한 솔루션
다음 Git 별칭은 my~/.gitconfig
에서 가져옵니다
.
"견고한"이란 트리 나 인덱스가 더티인지에 관계없이 이러한 별칭이 오류없이 실행되고 올바른 작업을 수행함을 의미합니다. 그러나 대화식 git rebase -i
이 이미 진행중인 경우 작동하지 않습니다 . 마지막에 설명 된 트릭이 작동하는 이 코너 케이스에 관심이 있다면 추가 확인을 위해 내~/.gitconfig
참조하십시오 git add -e
.
Git 별칭을 만들지 않고 쉘에서 직접 실행하려면 큰 따옴표 사이에 모든 것을 복사하여 붙여 넣으십시오 (쉘이 Bash와 같다고 가정).
색인을 수정하지만 트리는 수정하지 마십시오
다음 fixws
Git 별칭은 인덱스의 모든 공백 오류를 수정하지만 트리를 건드리지 않습니다.
# 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"
아이디어는 색인에 공백 오류가있는 경우 git fixws
전에 실행하는 것입니다 git commit
.
인덱스와 트리를 수정
다음 fixws-global-tree-and-index
Git 별명은 색인 및 트리의 모든 공백 오류를 수정합니다 (있는 경우).
# 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"
버전이 지정되지 않은 파일에서 공백을 수정하려면
git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index
단순하지만 강력한 솔루션
이러한 버전은 복사 및 붙여 넣기가 더 쉬워 지지만 해당 조건이 충족되지 않으면 올바른 작업을 수행하지 않습니다.
현재 디렉토리를 기반으로하는 하위 트리 수정 (비어 있지 않은 경우 인덱스 재설정)
git add -e
아이디 편집기로 패치를 "편집"하는 데 사용 :
:
(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
색인 수정 및 보존 (트리가 더럽거나 색인이 비어있는 경우 실패)
git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~
나무와 색인을 수정하십시오 (그러나 비어 있지 않으면 색인을 재설정하십시오)
git add -u :/ && git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset HEAD~
export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
트릭의 설명
이 답변 에서 git rebase --whitespace=fix
트릭 에 대해 배우기 전에 더 복잡한 트릭을 사용했습니다 .git add
우리가 수동으로 한 경우 :
설정 apply.whitespace
에 fix
(당신은 한 번만 수행하면) :
git config apply.whitespace fix
이것은 Git에게 패치 에서 공백을 수정하도록 지시 합니다.
Git이 변경 사항을 패치 로 취급하도록 설득 하십시오 .
git add -up .
각 파일에 대한 모든 변경 사항을 선택하려면 a+ enter를 누르십시오 . Git의 공백 오류 수정에 대한 경고가 표시됩니다.
( git -c color.ui=auto diff
이 시점에서 색인이 생성되지 않은 변경 사항은 정확히 공백 오류임을 나타냅니다).
작업 사본에서 공백 오류를 제거하십시오.
git checkout .
변경 사항을 다시 가져 오십시오 (커밋 할 준비가되지 않은 경우).
git reset
편집기 및 명령
GIT_EDITOR=:
으로 사용 하는 수단 은 ID입니다.:
: