您可以通过诱使Git将更改视为补丁来诱使Git为您修复空白。与“预提交挂钩”解决方案相比,这些解决方案向Git添加了空格固定命令。
是的,这些都是骇客。
强大的解决方案
以下Git别名取自
我的~/.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=:
装置使用:
作为编辑器,并作为命令
:
是标识。