git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH/RFC] filter-branch: Fix to allow replacing submodules with another content

From
Michal Sojka <sojkam1@fel.cvut.cz>
Date
Jan 13, 2010, 14:56 UTC
Message-ID
<201001131556.40167.sojkam1@fel.cvut.cz>
In-Reply-To
<alpine.DEB.1.00.1001111901380.4985@pacific.mpi-cbg.de>
On Monday 11 of January 2010 19:02:06 Johannes Schindelin wrote:
Show 24 quoted lines
> Hi,
> 
> On Mon, 11 Jan 2010, Michal Sojka wrote:
> > When git filter-branch is used to replace a submodule with another
> > content, it always fails on the first commit. Consider a repository with
> > directory submodule 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 submodule &&
> > 				 git rm -q submodule &&
> > 				 mkdir submodule &&
> > 				 touch submodule/file'
> >
> > The error message is:
> > error: submodule: is a directory - add files inside instead
> >
> > The reason is that git diff-index, which generates a part of the list of
> > files to update-index, 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 passes correctly.
> 
> Have you tested replacing one revision of a submodule with another?
Hi,

no, I didn't try it. I wanted to test it now but it seems to me that it cannot work even without my patch. I may be trying wrong --tree-filter. If anybody has a better idea, let me know.

I suppose that in order to change the revision of the submodule within the tree filter, I need to checkout the original revision first. Then I could use e.g. git reset HEAD^ to change it. Unfortunately even checkout of the submodule fails:

$ git filter-branch --tree-filter "git submodule update --init" HEAD Clone of '/tmp/submod' into submodule path 'submod' failed tree filter failed: git submodule update --init

This is because filter-branch sets GIT_WORKING_TREE to "." which causes clone to fail.

Replacing a revision of a submodule can be done only by manipulating index, but for this case you would use index-filter rather than tree-filter. Right?

I have created a few tests for testing filter-branch with submodules. See the patch bellow.

Michal
>From 9aa38185d795061a2f00204d181244f906280b5a Mon Sep 17 00:00:00 2001
From: Michal Sojka <sojkam1@fel.cvut.cz>
Date: Wed, 13 Jan 2010 15:15:28 +0100
Subject: [PATCH] filter-branch: Add tests for submodules
Signed-off-by: Michal Sojka <sojkam1@fel.cvut.cz>
---
 t/t7003-filter-branch.sh |   26 ++++++++++++++++++++++++++
 1 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh
index 9503875..daebd17 100755
--- a/t/t7003-filter-branch.sh
+++ b/t/t7003-filter-branch.sh
@@ -306,4 +306,30 @@ test_expect_success '--remap-to-ancestor with filename filters' '
 	test $orig_invariant = $(git rev-parse invariant)
 '
 
+test_expect_success 'setup submodule' '
+	rm -rf * .*
+	git init &&
+	test_commit file &&
+	mkdir submod &&
+	submodurl="$PWD/submod"
+	( cd submod &&
+	  git init &&
+	  test_commit file-in-submod ) &&
+	git submodule add "$submodurl"
+	git commit -m "added submodule" &&
+	test_commit add-file &&
+	( cd submod && test_commit add-in-submodule ) &&
+	git add submod &&
+	git commit -m "changed submodule"
+'
+
+test_expect_failure 'rewrite submodule with another content' '
+	git filter-branch --tree-filter "test -d submod && {
+					 rm -rf submod &&
+					 git rm -rf --quiet submod &&
+					 mkdir submod &&
+					 : > submod/file
+					 } || :"
+'
+
 test_done
-- 
1.6.6
Previous: Johannes Schindelin
Message 3 of 3 in “filter-branch: Fix to allow replacing submodules with another content”
  1. filter-branch: Fix to allow replacing submodules with another contentMichal Sojka, Jan 11, 2010
  2. Johannes SchindelinJan 11, 2010
  3. Michal SojkaJan 13, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.