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

Re: [PATCH] cogito: Avoid slowness when timewarping large trees.

From
Shawn Pearce <spearce@spearce.org>
Date
Mar 24, 2006, 16:43 UTC
Message-ID
<20060324164352.GA20684@spearce.org>
In-Reply-To
<20060324112246.GA5220@coredump.intra.peff.net>
Jeff King <peff@peff.net> wrote:
Show 27 quoted lines
> On Fri, Mar 24, 2006 at 03:01:35AM -0800, Junio C Hamano wrote:
> 
> > >   git-read-tree --reset "$base"
> > Exactly.  That's what I meant.  Thanks.
> 
> Hmm. That doesn't actually work, though. If I have a history like this:
> 
> $ cg-init -m "initial"
> $ cg-tag initial
> $ echo contents >file
> $ cg-add file
> $ cg-commit -m "added file"
> 
> and I try this:
> $ echo changes >file
> $ git-read-tree --reset master
> $ git-read-tree -m -u master initial
> 
> I get this:
> fatal: Entry 'file' not uptodate. Cannot merge.
> 
> If I do an update-index before the second read-tree, then I simply get:
> fatal: Entry 'file' would be overwritten by merge. Cannot merge.
> 
> Is there something I'm missing, or is a 'git reset --hard' really what
> we want here (in that case, the fact that git reset changes the HEAD
> might be a problem)?

This is sort of what I'm doing in pg-reset-tree, which is kind of like 'git-reset --hard' but I think it is faster when $force is unset:

  # Remove files left over from merge conflicts and files which are
  # somehow modified.  If this makes a directory empty it may have
  # been a new directory so delete that too.
  #
  (git-ls-files -z \
    --others \
    --ignored \
    --exclude='*#1' \
    --exclude='*#2' \
    --exclude='*#3' \
    --exclude='*.rej'
   git-diff-index --name-only -z HEAD
  ) | perl -n0e 'chomp; unlink; 1 while (s,/[^/]*$,, && rmdir)'
  
  # Rebuild the index and working directory.  We'll only checkout the
  # files which don't exist.  This resets the modified files we deleted
  # just above; remaining files will have their stat information updated
  # in the index.
  #
  git-read-tree --reset HEAD &&
  git-checkout-index --index --all $force \
    || die "Can't reset index and working directory."
  # Now that the working directory is clean we can safely merge it to
  # to our target tree, $new_base.
  #
  git-read-tree -m -u HEAD $new_base

The $force in git-checkout-index may or may not be set to '--force'; its usually not set as its not usually necessary. Unfortunately I've got a case where I'm mounting a directory exported by SAMBA onto a Windows 2000 system and if I don't include --force during git-checkout-index it doesn't work right about 1/3 of the time. (It appears to be bad stat information coming from Cygwin/Windows/SAMBA/Solaris.)

You can't skip the git-checkout-index step (I've tried) as the ls-files/diff-index above causes the modified files (in your test above 'changes') to disappear from the working directory and the read-tree may not bring it back.

Now that I think about it isn't this sort of where you were before in cg-seek?

-- 
Shawn.
Previous: Jeff KingNext: Jeff King
Message 6 of 10 in “cogito: Avoid slowness when timewarping large trees.”
  1. cogito: Avoid slowness when timewarping large trees.Jeff King, Mar 24, 2006
  2. Junio C HamanoMar 24, 2006
  3. Jeff KingMar 24, 2006
  4. Junio C HamanoMar 24, 2006
  5. Jeff KingMar 24, 2006
  6. Shawn PearceMar 24, 2006
  7. Jeff KingMar 25, 2006
  8. Avoid slowness when timewarping large trees.Jeff King, Mar 25, 2006
  9. Petr BaudisMar 26, 2006
  10. Junio C HamanoMar 25, 2006

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.