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
这提供了以下工作流,我喜欢它,因为它是手动的,我知道正在发生什么,但自动化程度足够高,不会妨碍工作:
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