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

git在提交之前删除新文件中的尾随空白,git,whitespace,removing-whitespace,Git,Whitespace,Removing Whitespace,我知道删除尾随空格可以通过预提交挂钩来完成。我对手工操作感兴趣。我在这里读到了这个问题: 最接近我想要的答案是: 该命令运行良好,但似乎仅适用于repo中已有文件的更改,而不是新文件。我有一堆新的文件,这意味着它们还没有在回购协议中。我想删除这些文件中的空白,所以我尝试添加-A而不是-u,但没有任何区别。如果使用emacs,可以在保存文件之前使用“M^x delete training whitespace”删除它们。(也可以在.emacs中自定义) vi似乎也允许这样做:要手动清除最近3

我知道删除尾随空格可以通过预提交挂钩来完成。我对手工操作感兴趣。我在这里读到了这个问题:

最接近我想要的答案是:



该命令运行良好,但似乎仅适用于repo中已有文件的更改,而不是新文件。我有一堆新的文件,这意味着它们还没有在回购协议中。我想删除这些文件中的空白,所以我尝试添加-A而不是-u,但没有任何区别。

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


vi似乎也允许这样做:

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

git-rebase--whitespace=fix-HEAD~3

当我处理一个主题分支时,我会跟踪上游分支(通常是这样创建)

git签出-b主题-t

这允许我删除
git-rebase
中的最后一个参数。因此,一旦我完成并准备合并,我可以使用以下工具快速清理整个主题分支:

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

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

Simple fix 你引用的命令

(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
如果您首先添加要使用git add-N来修复的文件,则可以使用此功能。
add-N
本质上告诉Git假装您以前提交了文件的空版本

你犯的错误 我不明白你为什么会得到
致命:空补丁。中止。
add-Ae出现错误,但它看起来像一个bug,因为执行普通的
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
但是,它还处理更常见的情况,即在 承诺你正在做的事情。这很复杂,因为即使在
索引或树是干净的。

我喜欢Luke的答案,除了需要手动指定基本提交或使用重基样式的工作流的限制,其中历史是线性化的。我提出的修改不需要额外的参数,也不会改变提交图的拓扑结构。作为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
这提供了以下工作流,我喜欢它,因为它是手动的,我知道正在发生什么,但自动化程度足够高,不会妨碍工作:

  • hack-hack,引入空格错误
  • 企图犯
  • 由于预提交挂钩,提交失败,出现空白错误
  • git commit——无论如何都不需要验证
  • git-ws
    使用别名修复

  • 注意
    --on
    的用法:这里没有必要这样做,但是我发现可以更容易地解释rebase是如何以这种方式工作的。在Luke的版本中,
    HEAD~3
    是手册页中的
    ,而在我的版本中,
    保留分支真正上游的默认值。不管怎样,结果都是一样的。

    你的意思是“
    git add-Ae
    根本不添加新文件”?或者:“文件已添加,但未修复”@VonC它对未跟踪或新文件(首次添加但尚未提交)不起作用。对我来说,它显示了
    致命:空补丁。中止。
    我正在使用git版本1.8.3.msysgit.0。@测试:如果您在我的原始答案上留下了评论,询问如何使用我的命令,或者链接到您的问题,我会收到通知,并且可以告诉您关于
    添加-N
    。但是,SO很聪明,把你的问题放在了“相关”部分,所以我在今天编辑我的答案时看到了。vim用户可能也喜欢这样:Luke可以工作,但是你知道为什么我不能使用我在问题中问到的命令吗?恐怕我不知道;但是考虑到whitespace=fix是用于应用补丁(包括rebase)的,所以出现小问题并不奇怪。将ws从未跟踪的文件中剥离类似于在repo之外编辑文件:这不是git的工作。嘿,这里有一些我刚刚炮制的东西(来自基本命令)来清理阶段性的更改(之后保留添加文件的选择):
    git-commit-mTemp&&git-stash&&git-rebase-HEAD~--whitespace=fix&&git-reset--soft-HEAD~&&git-stash-pop
    。感谢Luke,我下次会试试这是一个好时机,如果您还需要修复初始提交,咒语将变成
    git-rebase--whitespace=fix--root
    (如果您关心存储库的克隆,当然不要这样做)如果这使树保持不变,这是否意味着索引中的任何空格修复将在
    git diff
    中反向显示,并且在将受影响的文件添加到索引时将被还原?我想这就是为什么管道中有
    git reset
    ,但看起来像是c
    cp .git/hooks/pre-commit.sample .git/hooks/pre-commit