git 在提交之前删除新文件中的尾随空格



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

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


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

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

git rebase --whitespace=fix HEAD~3

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

git checkout -b topic -t

这使我可以从git rebase中删除最后一个参数。因此,一旦我完成并准备好合并,我就可以通过以下方式快速清理整个主题分支:

git ws # 别名以变基 --空格=修复

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

我喜欢 Luke 的答案,除了您需要手动指定基本提交或使用 rebase 样式工作流的限制,其中您的历史记录是线性化的。 我提出了一个不需要额外参数并且不会更改提交图拓扑的修改。 作为外壳命令:

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. 黑客,引入空格错误
  2. 尝试提交
  3. 由于预提交挂钩,提交失败并出现空格错误
  4. 无论如何都要提交git commit --no-verify
  5. git ws使用别名进行修复

关于--onto用法的说明:这里没有必要,但我发现更容易推理变基是如何以这种方式工作的。 在 Luke 的版本中,HEAD~3 是手册页中的<upstream>,而在我的版本中,<upstream>保留其分支上游的默认值。 不过,无论哪种方式,您最终都会得到相同的结果。

简单修复

您引用的命令

(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 别名来修复空格。这是该别名的重写用卢克的变基技巧和冗余较少的控制流:

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

但是,它也处理在提交你正在处理。这很复杂,因为它即使在索引或树是干净的。

如果你使用

emacs,你可以在保存文件之前使用 "M^x delete-tailing-whitespace" 来删除它们。(也可以在您的.emacs中自定义(

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

最新更新