filter-branch: Fix to allow replacing submodules with another content
authorMichal Sojka <sojkam1@fel.cvut.cz>
Thu, 28 Jan 2010 09:08:46 +0000 (10:08 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 28 Jan 2010 21:49:53 +0000 (13:49 -0800)
When git filter-branch is used to replace a submodule with another
content, it always fails on the first commit.

Consider a repository with submod directory containing a submodule.  The
following command to remove the submodule and replace it with a file fails:

    git filter-branch --tree-filter 'rm -rf submod &&
                                     git rm -q submod &&
                                     mkdir submod &&
                                     touch submod/file'

with an error:

    error: submod: is a directory - add files inside instead

The reason is that git diff-index, which generates the first part of the
list of files updated by the tree filter, emits also the removed submodule
even if it was replaced by a real directory.

Signed-off-by: Michal Sojka <sojkam1@fel.cvut.cz>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-filter-branch.sh

index 195b5ef48ed3371b2010f9caf711e12089da9c06..7c4ad7dcf9c29030ac5c40a0ef3820c8b0287f8a 100755 (executable)
@@ -331,7 +331,7 @@ while read commit parents; do
                        die "tree filter failed: $filter_tree"
 
                (
-                       git diff-index -r --name-only $commit &&
+                       git diff-index -r --name-only --ignore-submodules $commit &&
                        git ls-files --others
                ) > "$tempdir"/tree-state || exit
                git update-index --add --replace --remove --stdin \