44

有没有一种简单的方法可以对任何只有空格更改的文件自动执行 git checkout?我正在处理 Windows 和一些从 Eclipse 运行的代码生成,因此我得到了换行符更改和空白更改,它们用噪音阻塞了我的工作流程,并且难以跟踪实际更改。

甚至只是报告哪些文件有真正的变化,哪些不是一个开始的好方法,而不是必须为每个文件做一个 diff -w

4

5 回答 5

98

如果您的更改没有暂存

要暂存不仅仅是空白更改的更改,您可以执行以下操作:

git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero -

之后,要删除所有未暂存的更改(那些仅在空白处不同的更改),您可以执行以下操作:

git checkout .

如果您的更改是分阶段的

通过执行 a 来取消您的更改,git reset --mixed然后从该答案的顶部继续。请注意,这mixed是默认模式,可以省略。

于 2017-08-03T14:22:13.100 回答
5

这很可能是行尾问题;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的部分)。

于 2012-12-10T03:41:49.623 回答
5

如果您的更改已提交

(可能有更聪明的方法,但这对我有用)

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
于 2020-01-27T20:36:35.777 回答
0

另一种方法是在 unix 或(windows pc 作为特殊安装)上使用 dos2unix 命令来转换行尾并提交和推送

于 2020-02-20T18:56:29.290 回答
-1

rumpel 的回答对我来说是正确的解决方法。我只想完成一点:

如果您的更改已被推送

一旦你遵循了 rumpel 的程序,就不要再推你的分支了。Github 会要求你拉之前,你会再次得到每个空白差异。而是从当前分支创建一个新分支并推送新分支:

# From $mybranch
git checkout -b $mybranch-v2
git push --set-upstream origin $mybranch-v2

然后在 GitHub 上关闭并删除 $mybranch

于 2020-02-26T08:53:40.863 回答