From: Sergio Callegari Date: Thu, 05 Feb 2009 13:13:54 GMT Subject: Re: Question about --tree-filter Message-ID: In-Reply-To: <498AA41D.3000609@viscovery.net> Johannes Sixt viscovery.net> writes: > > [ Don't cull Cc list, please! ] Sorry... first made a reply ignoring the list and then tried to fix! > I think I know what's going on. filter-branch has this code where the > tree-filter is applied: > > git checkout-index -f -u -a || > die "Could not checkout the index" > > This command may take a while to complete, and at the end it writes the > index file. At this point: > > (=) Some files may have the same timestamp as the index file. > > (<) Others have an earlier timestamp. > > Later we have this code: > > ( > git diff-index -r --name-only $commit > git ls-files --others > ) | > git update-index --add --replace --remove --stdin > > The files (=) are racily-clean, and are added to the database; they pass > through the clean filter (rezip). The files (<) are regarded as unchanged, > and are not added again, and are not rezipped. Ok it is because of a race... now I start understanding the non-consistent behaviour between different runs! Thanks a lot for the explanation. When you say "at the end it updates the index file" do you mean the effect of the -u switch? And when you say "Some files have the same timestamp as the index file" do you mean that diff-index uses the stat info inside the index only if a file is "<" than the index otherwise it is directly assumed that the file is changed wrt the index content? If so, would it make sense to re-touch the index after the checkout -u so that after the checkout the index is always > than every file it contains and one always starts at a non-racy situation? With this, one could only explicitly touch those files that need to get (re)filtered and gain in efficiency... or am I still missing something? Sergio