如何使用git撤消所有空格更改

时间:2010-10-26 20:11:54

标签: git

我有一个git repo,我在本地替换了很多文件。

git status现在显示许多修改过的文件。

有些是“真正修改过”,有些只是因行结尾而不同。

我希望那些只有行结尾不同的东西消失(git重置它们),但是 我似乎无法找到linux-piping-foo来实现它。

如何删除唯一不同的是可执行位的文件的加分点。

4 个答案:

答案 0 :(得分:44)

这样做:

  git diff -b --numstat \
| egrep $'^0\t0\t' \
| cut -d$'\t' -f3- \
| xargs git checkout HEAD --
  1. 针对索引运行工作副本的diff,并为每个文件提供机器可读的摘要,忽略空格中的更改。
  2. 根据diff -b找到没有变化的文件。
  3. 取他们的名字。
  4. 将他们传递到git checkout对分支机构。
  5. 对于你离开的每一步,这个管道会做一些合理的事情,所以你可以从第一行开始,然后添加更多以查看每一步发生的事情。

    可能有用的替代最后一行:

    | git checkout-index --stdin
    

    这会将文件重置为其暂存内容而不是上次提交的状态。

    您可能还想在第一行使用git diff HEAD来获取工作副本与最后一次提交的差异而不是索引。


    注意:如果您的文件名中包含空格,则首先需要添加tr

      git diff -b --numstat \
    | egrep $'^0\t0\t' \
    | cut -d$'\t' -f3- \
    | tr '\n' '\0' \

    然后,您必须将-0 / -z开关添加到您想要使用的最终命令中:

    | xargs -0 git checkout HEAD --
    # or
    | git checkout-index --stdin -z

答案 1 :(得分:2)

Windows用户 - 不要绝望!

  1. 安装bash on ubuntu on windows
  2. 在Windows 命令提示符下打开ubuntu上的 bash。
  3. 安装包含您的存储库的驱动器。要访问C驱动器,请执行cd /mnt/c
  4. 将目录更改为您的仓库:cd repos/my-project
  5. 执行Aristotle Pagaltzis's incredible answer
  6. 中的命令
    git diff -b --numstat \
    | egrep $'^0\t0\t' \
    | cut -d$'\t' -f3- \
    | xargs git checkout HEAD --
    
    1. Upvote Aristotle Pagaltzis's answer

答案 2 :(得分:1)

如果您对bash过敏并且更喜欢powershell(为清晰起见而格式化)...

git diff  --numstat --ignore-space-change --ignore-all-space 
          --ignore-blank-lines --ignore-cr-at-eol 
          --ignore-space-at-eol 
| % {($added,$deleted,$path)= $_.Split("`t"); 
    if ("$added$deleted" -eq "00") {$path} 
| % { git checkout HEAD $_}

请注意,这是一种非常激进的方法-我在这里使用的git选项也将忽略添加/删除的空行。还请记住,当在字符串中间时,空格甚至换行符在语义上都是有意义的,因此请牢记这一点。

某些git选项可能是多余的,但出于偏执狂的缘故,我将它们包括在内。您不妨细读documentation来构成自己的解释。

这是用于剪切和粘贴的稍微麻烦的实现...

git diff --numstat -b -w --ignore-blank-lines --ignore-cr-at-eol --ignore-space-at-eol | % {($a,$d,$p)= $_.Split("`t");if ("$a$d" -eq "00") {$p}| % { git checkout HEAD -- $_}

正如其他地方所指出的那样,建议您先进行更改的副本,然后再通过运行git stash或先复制到备份文件夹来进行恢复。

答案 3 :(得分:0)

虽然看起来你最初正在寻找基于管道的解决方案而你从@ aristotle-pagaltzis那里得到它,因为它有点难以记住,我认为这个替代方案值得注意:

git diff -b > gitdiffb
git stash  # or git reset --hard if you feel confident
git apply --ignore-space-change gitdiffb

如果不仅仅是更改空白数字,而且应该忽略全新或完全删除的空格,请将-b替换为-w

即使在包含相关更改的文件中,结果也不同于基于管道的解决方案,即删除空白更改。 因此,它并不完全是你所描述的方式,但对于大多数通过搜索引擎来到这里的人来说,可能正在寻找这个。