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

Re: Filter-branch's "move tree to subdirectory" example fails with BSD sed?

From
Jeff King <peff@peff.net>
Date
Apr 16, 2012, 15:27 UTC
Message-ID
<20120416152737.GB14724@sigill.intra.peff.net>
In-Reply-To
<4F89CF11.7060309@kdbg.org>
On Sat, Apr 14, 2012 at 09:25:05PM +0200, Johannes Sixt wrote:
Show 19 quoted lines
> Am 14.04.2012 18:00, schrieb Christopher Tiwald:
> > The "Move tree to subdirectory" example in the 'git filter-branch'
> > manpage fails on Mac OSX 10.7.3, but succeeds on Ubuntu 10.04.
> 
> > git init "test"
> > cd "test"
> > mkdir -p subdirA/subdirB
> > echo content > subdirA/subdirB/file
> > git add .
> > git commit -m "initial commit"
> > git ls-files -s | sed "s-\t\"*-&newsubdir/-"
> > 
> > On Mac 10.7.3 the final command outputs:
> > 100644 d95f3ad14dee633a758d2e331151e950dd13e4ed 0	subdirA/subdirB/file
> > 
> > On Ubuntu 10.04:
> > 100644 d95f3ad14dee633a758d2e331151e950dd13e4ed 0	newsubdir/subdirA/subdirB/file
> 
> Perhaps a literal TAB instead of \t makes the example work?
Yes, I suspect that is the problem, too.
> It would be difficult, though, to write this down in the manual in an
> unambiguous way.
Maybe it would be simpler to just use perl:
 git filter-branch --index-filter '
   git ls-files -s |
     perl -pe "s{\t\"?}{$&newsubdir/}" |
     GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info &&
   mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE
 ' HEAD

I also think tweaking the indentation and line breaks as I did above makes it a little more readable. If we are using perl, we could also just use "-z" to get rid of the funny quote handling.

I wish we could also get rid of the temporary index. It exists solely for the side effect of removing the existing entries (otherwise, you get both "foo" and "newsubdir/foo" in the resulting history). It would be nice if there was some flag to update-index to say "before you do anything, clear the existing index" (or I guess, "don't bother reading the existing index"). And then result could look like:

  git filter-branch --index-filter '
    git ls-files -sz |
    perl -0pe "s{\t}{\tnewsubdir/}" |
    git update-index --from-scratch -z --index-info
  ' HEAD
which is IMHO much easier to read and understand.
-Peff
Previous: Johannes SixtNext: Jeff King
Message 3 of 9 in “Filter-branch's "move tree to subdirectory" example fails with BSD sed?”
  1. Christopher TiwaldApr 14, 2012
  2. Johannes SixtApr 14, 2012
  3. Jeff KingApr 16, 2012
  4. 1/2 update-index: add --clear optionJeff King, Apr 16, 2012
  5. Christopher TiwaldApr 16, 2012
  6. Christopher TiwaldApr 17, 2012
  7. 2/2 docs/filter-branch: clean up newsubdir exampleJeff King, Apr 16, 2012
  8. Junio C HamanoApr 16, 2012
  9. Jeff KingApr 16, 2012

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.