是否有一种简单的方法可以自动对任何只有空格更改的文件执行git checkout?我正在处理从Eclipse运行的Windows和一些代码生成,所以我得到新行更改和空白更改,这些更改会阻碍我的工作流程中的噪音,并且很难跟踪实际更改。
即使只是一个很好的方式报告哪些文件有真正的变化,哪些不是一个开始,而不是必须为每个文件做一个diff -w
答案 0 :(得分:24)
要暂存不仅仅是空格更改的更改,您可以执行以下操作:
git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero -
之后,要删除所有未分级的更改(仅在空格上有所不同的更改),您可以执行以下操作:
git checkout .
通过执行git reset --mixed
取消暂停您的更改,然后从此答案的顶部继续。请注意,mixed
是默认模式,可以省略。
答案 1 :(得分:2)
这很可能是一个行结束问题; Windows使用CRLF(回车符+换行符或\r\n
)行结尾,而大多数其他系统使用LF(换行符或\n
)。幸运的是,Git可以规范化文件,使它们始终存储为repo中的LF,但在Windows上将被检出为CRLF。您可以在Windows上将core.autocrlf
设置为true
来执行此操作:
$ git config --global core.autocrlf true
并在Mac和Linux上将core.autocrlf
设置为input
:
$ git config --global core.autocrlf input
有更多信息here(向下滚动到标题为 core.autocrlf 的部分)。
答案 2 :(得分:2)
(可能有一种更聪明的方法,但这对我有用)
mybranch=master
git checkout -b tmp origin/master
# compute the non-ws diff to mybranch and apply it
git diff -U0 -w --no-color $mybranch | git apply -R --cached --ignore-whitespace --unidiff-zero -
git commit -m "non ws changes"
git reset --hard # discard all non-staged data
您现在在新的“ tmp”分支上。您可能需要清理(注意:这丢失了$mybranch
的历史记录)
git checkout $mybranch
git reset --hard tmp
git branch -D tmp
答案 3 :(得分:0)
另一种方法是在unix上使用dos2unix命令或(将Windows pc作为特殊安装)转换行尾并提交并压入
答案 4 :(得分:0)
rumpel's answer是适合我的解决方案。我只想完成一点:
如果您的更改已被推送
一旦您遵循了rumpel的程序,请勿再次在分支机构上推送。 Github会要求您先拉,然后您将再次获得每个空格差异。而是从当前分支创建一个新分支,然后推送新分支:
# From $mybranch
git checkout -b $mybranch-v2
git push --set-upstream origin $mybranch-v2
然后在GitHub上关闭并删除$ mybranch