【问题标题】:Make git undo any whitespace-only changes?让 git 撤消任何仅限空格的更改?
【发布时间】:2012-12-10 00:01:23
【问题描述】:

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

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

【问题讨论】:

标签: git


【解决方案1】:

如果您的更改未暂存

要进行不仅仅是空白更改的更改,您可以这样做:

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

之后,要删除所有未暂存的更改(仅在空白处不同的更改),您可以:

git checkout .

如果您的更改已分阶段

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

【讨论】:

  • 我从 FTP 上复制了大量文件,以查看我的本地 repo 和远程主机之间有什么不同,并且所有文件都有不同的行尾,这使得识别非空白更改。这有助于识别那些实际上不同的人。
  • 起初,这对我不起作用,因为我不在存储库的根目录中(尽管我认为不应该要求在根目录中)。因此,如果git apply 不执行任何操作返回成功 (0),请尝试转到存储库的根目录。
  • 注意如果你有diff.noprefix = true,上面的git apply会失败。要修复它,请添加选项-p0
  • 这为我节省了十亿年的时间......在我的情况下需要注意一个问题 - 它不会忽略添加/删除的完整空白行。要包含它,请将 --ignore-blank-lines 添加到差异中。
【解决方案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 的部分)。

【讨论】:

  • 我知道它为什么这样做,并且我知道 core.autocrlf 并将其设置为 true。这些东西都不能很容易地丢弃代码生成所做的仅空白更改(例如 GraniteDS 的插件即使在 Windows 上也会吐出 unix 换行符)
  • @moonlightcheese:他们几年前更改了 Git 网页,显然有些重定向错误。我更新了网址。
【解决方案3】:

如果您的更改已提交

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      如果您的更改已提交并推送...

      ...您对高级 git 命令行的使用不满意,但通常可以访问 JetBrains Rider IDE 或 JB 系列工具,通过 GUI 执行混合 git reset 会自动删除空格更改。然后提交。从 200 多个文件中,它只漏掉了一个,我可以手动还原。

      此过程 99% 可以通过 GUI 完成。右键单击 Git 选项卡中的基本分支,然后进行重置。它将撤消提交并暂存非空白更改以进行提交。现在提交并推送 -f (我总是通过命令行强制推送)。就这样,大功告成!

      【讨论】:

        【解决方案6】:

        rumpel's answer 对我来说是正确的解决方案。我只是想完成一点:

        如果您的更改已被推送

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

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

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

        【讨论】:

        • 如果你和你的团队讨论过,我看不出有什么理由不强行推动你自己的分支
        猜你喜欢
        • 2016-12-07
        • 2015-01-30
        • 2021-02-17
        • 1970-01-01
        • 2019-10-12
        • 1970-01-01
        • 2016-08-02
        • 2013-03-11
        • 2021-09-30
        相关资源
        最近更新 更多