how to undo all whitespace changes with git

匿名 (未验证) 提交于 2019-12-03 02:45:02

问题:

I have a git repo, where I replaced a lot of files locally.

git status now shows many many modified files.

Some are "really modified", others only differ by line endings.

I want the ones that differ only by line endings to go away (git reset them), but I cannot seem to find the linux-piping-foo to make it happen.

Bonus points for how to remove files whose only difference is the executable bit.

回答1:

This will do it:

  git diff -b --numstat \ | egrep $'^0\t0\t' \ | cut -d$'\t' -f3- \ | xargs git checkout HEAD -- 
  1. Run a diff of the working copy against the index and give a machine-readable summary for each file, ignoring changes in whitespace.
  2. Find the files that had no changes according to diff -b.
  3. Take their names.
  4. Pass them to git checkout against the branch tip.

This pipe will do something sensible for each step you leave off, so you can start off with the just the first line and add more to see what happens at each step.

A possibly useful alternative last line:

| git checkout-index --stdin 

This would reset the files to their staged contents instead of to their last committed state.

You may also want to use git diff HEAD on the first line instead, to get a diff of the working copy against the last commit instead of against the index.


Note: if you have filenames with spaces in them, you will first need to add a tr:

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

Then you must add a -0/-z switch to whichever final command you wanted to use:

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


回答2:

Windows Users - don't despair!

  1. Install bash on ubuntu on windows.
  2. Open the bash on ubuntu on windows command prompt.
  3. Mount the drive that contains your repo. To access your C drive, execute cd /mnt/c.
  4. Change directory to your repo: cd repos/my-project
  5. Execute the command from Aristotle Pagaltzis's incredible answer:
git diff -b --numstat \ | egrep $'^0\t0\t' \ | cut -d$'\t' -f3- \ | xargs git checkout HEAD -- 
  1. Upvote Aristotle Pagaltzis's answer.


回答3:

Though it seems you were originally looking for a pipe-based solution and you got it from @aristotle-pagaltzis, since it's a bit hard to remember, I think this alternative is worth noting:

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

If not just changes to whitespace numbers, but also whitespaces that are completely new or completely removed should be ignored, replace -b by -w.

The outcome differs from the pipe-based solution in the removal of whitespace changes even in files that also contain relevant changes. Thus, it's not exactly the way you described it, but for most people coming here via a search engine are probably rather looking for this.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!