Bug
===

The command

  git rebase --whitespace=fix --keep-empty <commit>

does not fix whitespace in the rebased commits.

Example
=======

Set up a repo with a whitespace error commit and an empty commit:

  git init rebase-bug.git
  cd rebase-bug.git
  touch foo
  git add foo
  touch foo
  git add foo
  git commit -m "Empty foo"
  echo "xxx   " > foo
  git add foo
  git commit -m "Trailing whitespace foo"
  git commit --allow-empty -m "Empty commit

Now we have the following commits (adding '$' at EOL to make trailing
whitespace clear):

  git log --oneline --patch | sed -re 's/$/$/'

  d383707 Empty commit$
  4b71cd0 Trailing whitespace foo$
  diff --git foo foo$
  index e69de29..272a831 100644$
  --- foo$
  +++ foo$
  @@ -0,0 +1 @@$
  +xxx   $
  26d51d6 Empty foo$
  diff --git foo foo$
  new file mode 100644$
  index 0000000..e69de29$

Make a backup:

  cp -r ../rebase-bug.git{,.backup}

We can now fix the whitespace with 'git rebase --whitespace=fix', but
this drops the empty commit:

  git rebase --whitespace=fix HEAD~2

  Current branch master is up to date, rebase forced.
  First, rewinding head to replay your work on top of it...
  Applying: Trailing whitespace foo

  git log --oneline --patch | sed -re 's/$/$/'

  2f6f66d Trailing whitespace foo$
  diff --git foo foo$
  index e69de29..d6459e0 100644$
  --- foo$
  +++ foo$
  @@ -0,0 +1 @@$
  +xxx$
  26d51d6 Empty foo$
  diff --git foo foo$
  new file mode 100644$
  index 0000000..e69de29$

If we add '--keep-empty', then we keep the empty commit, but the
whitespace is not fixed:

  cd ../rebase-bug.git.backup
  git rebase --whitespace=fix --keep-empty HEAD~2

  Current branch master is up to date, rebase forced.
  First, rewinding head to replay your work on top of it...
  [detached HEAD a48c4c8] Trailing whitespace foo
   1 file changed, 1 insertion(+)
  [detached HEAD 8a15ca4] Empty commit

  git log --oneline --patch | sed -re 's/$/$/'

  f852c53 Empty commit$
  f8c3626 Trailing whitespace foo$
  diff --git foo foo$
  index e69de29..272a831 100644$
  --- foo$
  +++ foo$
  @@ -0,0 +1 @@$
  +xxx   $
  26d51d6 Empty foo$
  diff --git foo foo$
  new file mode 100644$
  index 0000000..e69de29$

Git version
===========

I'm using git version 1.8.2.3.

Motivation
==========

http://stackoverflow.com/a/15398512/470844

I wanted a Git alias to remove whitespace errors from the index and
tree. I tried this:

  fixws-global-tree-and-index = !"\
    git commit --allow-empty -m FIXWS_SAVE_INDEX && \
    git add -u :/ && \
    git commit --allow-empty -m FIXWS_SAVE_TREE && \
    git rebase --whitespace=fix --keep-empty HEAD~2 && \
    git reset HEAD~ && \
    git reset --soft HEAD~"

But, it does not work, because of the bug illustrated above.  So,
instead, I have this:

  fixws-global-tree-and-index = !"\
    if (! git diff-files --quiet .) && \
       (! git diff-index --quiet --cached HEAD) ; then \
      git commit -m FIXWS_SAVE_INDEX && \
      git add -u :/ && \
      git commit -m FIXWS_SAVE_TREE && \
      git rebase --whitespace=fix HEAD~2 && \
      git reset HEAD~ && \
      git reset --soft HEAD~ ; \
    elif (! git diff-files --quiet .) ; then \
      git add -u :/ && \
      git commit -m FIXWS_SAVE_TREE && \
      git rebase --whitespace=fix HEAD~ && \
      git reset HEAD~ ; \
    elif (! git diff-index --quiet --cached HEAD) ; then \
      git commit -m FIXWS_SAVE_INDEX && \
      git rebase --whitespace=fix HEAD~ && \
      git reset --soft HEAD~ ; \
    fi"

I.e., I calculate which commits are non-empty and only make those
commits.

Cheers,

-nathan
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to