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. If I want to remove the submodule and replace it with a file, the following command fails. git filter-branch --tree-filter 'rm -rf submod && git rm -q submod && mkdir submod && touch submod/file' The error message is: 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. Adding --ignored-submodules solves the problem for me and tests in t7003-filter-branch.sh pass correctly. If somebody wants to replace one revision of the module with another, it can be done with --index-filter. Using --tree-filter for this has no sense since --tree-filter "git submodule update --init" fails with Clone of '/tmp/submod' into submodule path 'submod' failed so that the revision must be replaced only in index. Signed-off-by: Michal Sojka <sojkam1@xxxxxxxxxxx> --- git-filter-branch.sh | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/git-filter-branch.sh b/git-filter-branch.sh index 195b5ef..d4ac7fb 100755 --- a/git-filter-branch.sh +++ b/git-filter-branch.sh @@ -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 \ -- 1.6.6 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html