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

loo*_*oop 13 git whitespace removing-whitespace

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

(export VISUAL=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
Run Code Online (Sandbox Code Playgroud)


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

Luk*_*ood 32

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

git rebase --whitespace=fix HEAD~3

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

git checkout -b topic -t

这让我可以放弃最后一个参数git rebase.所以一旦我完成并准备合并,我可以快速清理整个主题分支:

git ws #hashase到rebase --whitespace = fix

请注意,与HEAD~3示例不同,如果更改了上游分支,这实际上会对您的更改进行修改!(但这也是我想要的,在我的工作流程中.)

  • 嘿,这是我刚刚编写的东西(从基本命令)到刷新只是阶段性的更改(之后保留添加文件的选择):`git commit -mTemp && git stash && git rebase HEAD~ --whitespace = fix && git reset --soft HEAD~ && git stash pop`. (2认同)
  • 这是一个很好的评论,如果您还需要修复初始提交,则咒语变为`git rebase --whitespace=fix --root`(当然,如果您关心自己的克隆,请不要这样做)存储库) (2认同)

jby*_*ler 7

我喜欢Luke的答案,除了手动指定基本提交所需的限制,或使用历史线性化的rebase风格工作流.我提出了一个修改,它不需要额外的参数,也不会改变提交图的拓扑结构.作为shell命令:

git rebase --whitespace=fix --onto $(git merge-base HEAD @{u})
Run Code Online (Sandbox Code Playgroud)

或者作为〜/ .gitconfig别名:

ws = "!git rebase --whitespace=fix --onto $(git merge-base HEAD @{u})"
Run Code Online (Sandbox Code Playgroud)

我更喜欢这个,因为有时我想改变我的更改,但如果我认为可能存在合并冲突,我更愿意合并,这样我的原始更改和冲突解决方案都将记录在历史记录中.这样我可以稍后再猜测冲突解决方案并在必要时重做它.

鉴于我并不总是坚持不懈,我宁愿不将空白修复与重新组合混合; 因此修改了卢克的答案.

另外,我启用默认的预提交挂钩,它在空白错误中中止:

cp .git/hooks/pre-commit.sample .git/hooks/pre-commit
Run Code Online (Sandbox Code Playgroud)

这提供了以下工作流程,我喜欢它,因为它足够手动,我知道发生了什么,但自动化程度不足以阻碍:

  1. hack hack hack,引入空白错误
  2. 试图提交
  3. 由于预提交挂钩,提交因空白错误而失败
  4. git commit --no-verify 无论如何要提交
  5. git ws 使用别名来修复

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