您可以欺骗Git将您的更改视为补丁,从而让Git为您修复空白。与“预提交钩子”解决方案相比,这些解决方案向Git添加了空格修复命令。
是的,这些都是黑客。
健壮的解决方案
以下Git别名取自
我的~ / .gitconfig。
我所说的“健壮”是指这些别名运行时没有错误
正确的事情,不管树或索引是否脏。然而,如果交互式git rebase -i已经在进行中,它们就不起作用;看我的~/。如果您关心这种极端情况,可以使用Gitconfig进行额外检查,在这种情况下,最后描述的git add -e技巧应该可以工作。
如果您想直接在shell中运行它们,而不创建Git
别名,复制粘贴双引号之间的所有内容
(假设您的shell类似Bash)。
修正索引,但不修正树
以下修复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提交之前运行git fixws
索引中的空白错误。
修正索引和树
下面的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的解释。空格=fix add -ue。技巧
在我从这个答案中了解git rebase -whitespace=fix技巧之前,我在任何地方都使用更复杂的git添加技巧。
如果我们手动操作:
Set apply.whitespace to fix (you only have to do this once):
git config apply.whitespace fix
This tells Git to fix whitespace in patches.
Convince Git to treat your changes as a patch:
git add -up .
Hit a+enterto select all changes for each file. You'll get a warning about Git fixing your whitespace errors.
(git -c color.ui=auto diff at this point reveals that your non-indexed changes are exactly the whitespace errors).
Remove the whitespace errors from your working copy:
git checkout .
Bring back your changes (if you aren't ready to commit them):
git reset
GIT_EDITOR=:表示使用:作为编辑器和命令
:是恒等式。