how to undo all whitespace changes with git

后端 未结 4 919
挽巷
挽巷 2021-01-31 14:54

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 li

4条回答
  •  [愿得一人]
    2021-01-31 15:31

    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

提交回复
热议问题