From: Johannes Sixt <j.sixt@viscovery.net>
To: James Sadler <freshtonic@gmail.com>
Cc: Jeff King <peff@peff.net>, git@vger.kernel.org
Subject: Re: git filter-branch --subdirectory-filter
Date: Fri, 09 May 2008 09:57:59 +0200 [thread overview]
Message-ID: <48240407.4080104@viscovery.net> (raw)
In-Reply-To: <e5e204700805090038k373bbabcyfb10d8c93ec5b3a7@mail.gmail.com>
James Sadler schrieb:
> Hi Jeff,
>
> After reading your reponse and re-reading my original email, I
> realised it was totally unclear
> so I have re-explained myself below.
>
> 2008/5/9 Jeff King <peff@peff.net>:
>> On Fri, May 09, 2008 at 11:01:47AM +1000, James Sadler wrote:
>>> and ran filter-branch with a --commit-filter to skip commits that were
>>> irrelevant to th subdir.
>> But that's part of what subdirectory-filter does, so this step is
>> unnecessary.
>
> Yes that's true, but...
>
> Clearer explanation:
>
> I originally tried --subdirectory-filter by itself to see if it would
> do the job, but it filtered
> more commits than I thought it should (some commits that touched the subdir were
> missing after filter-branch was run).
>
> I then began to question my understanding of the semantics of
> subdirectory-filter.
>
> Is it meant to:
> A) Only keep commits where ALL of the changes in the commit only touch
> content under $DIR?
> B) Only keep commits where SOME of the changes in the commit touch
> content under $DIR?
>
> I suspected that it was behaving as A.
It's expected to do B.
> That's when I decided to run the commit-filter first in combination
> with the tree-filter. This would
> leave me with all commits that touched the subdir but any commit that
> touched multiple subdirs
> would be cleaned up so it only touched the subdir I want to keep.
>
> At this point I have a bunch of commits that only make changes to
> subdir (verified using gitk), and I would
> expect subdirectory-filter to keep every single commit.
At this point you don't need subdirectory-filter. Use an --index-filter to
keep only the subdirectory *and* remove the directory name at the same
time. Something like this:
git filter-branch --index-filter \
'git ls-files -s thedir | sed "s-\tthedir/--" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
> However, after running it, I loose most of my commits. Strangely, the
> working tree is bit-for-bit correct
> with the original version or the subdir in the old repo, but the
> history leading up to it is not.
The bit-for-bit correctness is not surprising, but the incorrect history
is. What is your definition of "correct" (i.e. can you give an example of
your expectations that are not met)? Do you have complicated history (with
merges)? Note that merges are removed if all but one of the merged
branches do not touch the subdirectory.
-- Hannes
next prev parent reply other threads:[~2008-05-09 7:59 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-09 1:01 git filter-branch --subdirectory-filter James Sadler
2008-05-09 1:33 ` Jeff King
2008-05-09 7:38 ` James Sadler
2008-05-09 7:57 ` Johannes Sixt [this message]
2008-05-09 8:00 ` Jeff King
2008-05-10 3:31 ` James Sadler
2008-05-10 5:53 ` Jeff King
2008-05-10 7:10 ` James Sadler
2008-05-10 11:38 ` James Sadler
2008-05-10 11:44 ` Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=48240407.4080104@viscovery.net \
--to=j.sixt@viscovery.net \
--cc=freshtonic@gmail.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).