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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html