From: Csaba Henk Date: Fri, 06 Mar 2009 13:29:38 GMT Subject: Re: import files w/ history Message-ID: In-Reply-To: <20090303130046.GA7867@coredump.intra.peff.net> On 2009-03-03, Jeff King wrote: > On Tue, Mar 03, 2009 at 12:54:54PM +0000, Csaba Henk wrote: > >> How could I import some files from an unrelated git repo with history? > > Just "git pull" from the other repo, which will include all of its > history. If you want to pretend that the other history contains just a > subset of the true history, use "git filter-branch" to rewrite it first. Thanks Jeff, but it didn't work well for a large repo. At least not what I could carve out myself. The repo in question is the DragonFlyBSD repository, and I wanted to cut out the history of sys/dev/disk/vn/vn.c. After reading git-filter-branch(1) I come up with the following: first I wanted to select those commits where the file in question was modified. I tried to use the following filtration: $ git filter-branch --commit-filter ' if [ $# -lt 3 ] || git diff --stat $3 $1 | grep -q 'sys/dev/disk/vn/vn\.c' then git commit-tree "$@" else skip_commit "$@" fi' HEAD It should select those commits where vn.c differs from the vn.c in the _first_ parent, so probably it's not exactly what I want, but anyway, I went on to give it a try. I have even tested this filter script on a small repo and it worked well. Then I ran it against the Dfly repo, and after 23 hours of processing I ended up with: ... 23575b3e0b087120b0475ae93c505c72a9779fdb 35ac2f0aa5ac0ca78109781817c524fa354e8691 23575b3e0b087120b0475ae93c505c72a9779fdb 35ac2f0aa5ac0ca78109781817c524fa354e8691 23575b3e0b087120b0475ae93c505c72a9779fdb 35ac2f0aa5ac0ca78109781817c524fa354e8691 23575b3e0b087120b0475ae93c505c72a9779fdb 35ac2f0aa5ac0ca78109781817c524fa354e8691 23575b3e0b087120b0475ae93c505c72a9779fdb 35ac2f0aa5ac0ca78109781817c524fa354e8691 WARNING: Ref 'refs/heads/__rewrite' points to the first one now. And the result is completely f*cked up. Neither those two commits which occur repeatedly at the end of the output, nor the commit at the actual position of the __rewrite brach has a parent, and the upstream commits from which these were derived didn't affect vn.c. * * * OK, I then tried to do more RTFM and be more clever and efficient, and find a way to specify directly those commits which affect vn.c. As "git rev-list" can be invoked like "git rev-list ", and the synopsis of "git filter-branch" is like git filter-branch [options] [--] [...] I then gave a try to: $ git filter-branch -- master sys/dev/disk/vn/vn.c but no dice -- I got: fatal: ambiguous argument 'sys/dev/disk/vn/vn.c': unknown revision or path not in the working tree. Use '--' to separate paths from revisions Could not get the commits Any idea? Thanks, Csaba