我知道删除尾部空格可以使用预提交挂钩完成。我有兴趣手动完成它。我在这里读到了这个问题:
Make git automatically remove trailing whitespace before committing - Stack Overflow
最接近我想要的答案是the "automatic version" from ntc2:
(export VISUAL=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
该命令运行良好,除了它似乎只是对已存在于repo中的文件的更改,而不是新文件。我有一堆新文件,这意味着它们还没有在回购中。我想从这些文件中删除空格,所以我尝试添加-A而不是-u,但这没有什么区别。
答案 0 :(得分:30)
要手动清理过去3次提交中的空白,可以执行以下操作:
git rebase --whitespace=fix HEAD~3
当我处理主题分支时,我会跟踪上游分支(通常通过创建它)
git checkout -b topic -t
这允许我从git rebase
删除最后一个参数。所以一旦我完成了&准备合并,我可以快速清理整个主题分支:
git ws
#aliase to rebase --whitespace = fix
请注意,与HEAD~3示例不同,如果更改了上游分支,这实际上会对您的更改进行修改! (但这也是我想要的,在我的工作流程中。)
答案 1 :(得分:7)
我喜欢Luke的答案,除了手动指定基本提交所需的限制,或者使用历史线性化的rebase式工作流程。我提出了一个修改,它不需要额外的参数,也不会改变提交图的拓扑结构。作为shell命令:
git rebase --whitespace=fix --onto $(git merge-base HEAD @{u})
或者作为〜/ .gitconfig别名:
ws = "!git rebase --whitespace=fix --onto $(git merge-base HEAD @{u})"
我更喜欢这个,因为有时我想改变我的更改,但如果我认为可能存在合并冲突,我更愿意合并,这样我的原始更改和冲突解决方案都会记录在历史记录中。这样我可以稍后再猜测冲突解决方案并在必要时重做它。
鉴于我并不总是坚持不懈,我宁愿不将空白修复与变基混合在一起;因此修改了卢克的答案。
此外,我启用默认的预提交挂钩,该挂钩会在空白错误中中止:
cp .git/hooks/pre-commit.sample .git/hooks/pre-commit
这提供了以下工作流程,我喜欢这个工作流程,因为它足够手动,我知道发生了什么,但自动化程度不足以阻碍:
git commit --no-verify
提交git ws
使用别名修复关于--onto
的用法的注意事项:这里没有必要,但我发现更容易推断rebase如何以这种方式工作。在Luke的版本中,HEAD~3
是手册页中的<upstream>
,而在我的版本中<upstream>
保留了分支的真实上游的默认值。不管怎么说,你最终会得到相同的结果。
答案 2 :(得分:2)
您引用的命令
(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
如果您首先使用git add -N <files you want to fix>
添加要修复的文件,则有效。 add -N
基本上告诉Git假装你以前提交过文件的空版本。
我不明白为什么fatal: Empty patch. Aborted.
会出现add -Ae
错误,但它看起来像是一个错误,因为执行简单git add -A . && git diff --cached
表示该补丁实际上不应为空。< / p>
我最近更新了 my answer that you linked to 使用更好的Git别名来修复空格。这是别名的重写 运用 Luke's rebase trick和 一个不太冗余的控制流程:
fixws =!"\
if (! git diff-index --quiet --cached HEAD); then \
\
git diff-files --quiet `git rev-parse --show-toplevel` ; \
export NEED_TO_STASH=$? ; \
\
git commit -m FIXWS_SAVE_INDEX && \
if [ 1 = $NEED_TO_STASH ] ; then git stash save FIXWS_SAVE_TREE; fi && \
git rebase --whitespace=fix HEAD~ && \
git reset --soft HEAD~ && \
if [ 1 = $NEED_TO_STASH ] ; then git stash pop; fi ; \
fi"
这修复了索引中的空格,同时保留了索引,和 让树不受影响。使用此别名,您可以修复无版本 回购中的文件
git add --all :/ && git fixws && git reset
但是,它还处理了修复空白空间的更常见情况 承诺你正在努力。它很复杂,因为它甚至可以工作 索引或树是干净的。
答案 3 :(得分:-1)
如果您使用emacs,则可以在保存文件之前使用“M ^ x delete-trailing-whitespace”删除它们。 (也可以在.emacs中自定义)