16

我知道可以使用预提交挂钩来删除尾随空格。我有兴趣手动完成。我在这里读到了这个问题:
让 git 在提交之前自动删除尾随空格 -
代码日志 最接近我想要的答案是来自 ntc2 的“自动版本”

(export VISUAL=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset


该命令运行良好,但它似乎仅适用于已在 repo 中的文件的更改,而不是新文件。我有一堆新文件,这意味着它们还没有在 repo 中。我想从这些文件中删除空格,所以我尝试添加 -A 而不是 -u 但这并没有什么不同。

4

4 回答 4

33

要从最近 3 次提交中手动清理空白,您可以执行以下操作:

git rebase --whitespace=fix HEAD~3

当我在主题分支上工作时,我会跟踪上游分支(通常通过这样创建它)

git checkout -b topic -t

这允许我从git rebase. 所以一旦我完成并准备好合并,我可以快速清理整个主题分支:

git ws # 别名为 rebase --whitespace=fix

请注意,与 HEAD~3 示例不同,如果上游分支发生更改,这实际上会将您的更改重新设置为基础!(但这也是我想要的,在我的工作流程中。)

于 2013-10-03T10:22:00.517 回答
8

我喜欢 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

这给出了以下工作流程,我喜欢它,因为它足够手动,我知道发生了什么,但足够自动化,不会妨碍:

  1. hack hack hack,引入空格错误
  2. 尝试提交
  3. 由于预提交挂钩,提交失败并出现空白错误
  4. git commit --no-verify无论如何都要承诺
  5. git ws使用别名修复

注意 : 的用法在--onto这里没有必要,但我发现更容易理解 rebase 如何以这种方式工作。在 Luke 的版本中,HEAD~3<upstream>在手册页中,而在我的版本中,<upstream>它保留了分支的实际上游的默认值。不管怎样,你最终都会得到相同的结果。

于 2014-03-05T23:47:15.307 回答
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表明补丁实际上不应该是空的。

更好的空白修复程序

我最近更新 了您链接到的答案,并 使用了更好的 Git 别名来修复空格。这是使用Luke 的 rebase 技巧和较少冗余的控制流对别名的重写 :

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"

这修复了索引中的空白,同时保留了索引,并使树保持不变。使用此别名,您可以使用以下命令修复 repo 中的未版本控制文件

git add --all :/ && git fixws && git reset

但是,它还可以处理更常见的情况,即在您正在处理的提交中修复空白。它很复杂,因为即使索引或树是干净的,它也可以工作。

于 2013-11-19T03:30:57.230 回答
0

如果您使用 emacs,您可以在保存文件之前使用“M^x delete-trailing-whitespace”删除它们。(也可以在您的 .emacs 中自定义)

vi 似乎也允许这样做:http: //vim.wikia.com/wiki/Remove_unwanted_spaces

于 2013-10-03T09:03:05.633 回答