有没有一种简单的方法可以对任何只有空格更改的文件自动执行 git checkout?我正在处理 Windows 和一些从 Eclipse 运行的代码生成,因此我得到了换行符更改和空白更改,它们用噪音阻塞了我的工作流程,并且难以跟踪实际更改。
甚至只是报告哪些文件有真正的变化,哪些不是一个开始的好方法,而不是必须为每个文件做一个 diff -w
有没有一种简单的方法可以对任何只有空格更改的文件自动执行 git checkout?我正在处理 Windows 和一些从 Eclipse 运行的代码生成,因此我得到了换行符更改和空白更改,它们用噪音阻塞了我的工作流程,并且难以跟踪实际更改。
甚至只是报告哪些文件有真正的变化,哪些不是一个开始的好方法,而不是必须为每个文件做一个 diff -w
要暂存不仅仅是空白更改的更改,您可以执行以下操作:
git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero -
之后,要删除所有未暂存的更改(那些仅在空白处不同的更改),您可以执行以下操作:
git checkout .
通过执行 a 来取消您的更改,git reset --mixed
然后从该答案的顶部继续。请注意,这mixed
是默认模式,可以省略。
这很可能是行尾问题;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
此处提供了更多信息(向下滚动到标题为core.autocrlf的部分)。
(可能有更聪明的方法,但这对我有用)
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
另一种方法是在 unix 或(windows pc 作为特殊安装)上使用 dos2unix 命令来转换行尾并提交和推送
rumpel 的回答对我来说是正确的解决方法。我只想完成一点:
如果您的更改已被推送
一旦你遵循了 rumpel 的程序,就不要再推你的分支了。Github 会要求你拉之前,你会再次得到每个空白差异。而是从当前分支创建一个新分支并推送新分支:
# From $mybranch
git checkout -b $mybranch-v2
git push --set-upstream origin $mybranch-v2
然后在 GitHub 上关闭并删除 $mybranch