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

Re: copy selected history between repostories

From
Nick Andrew <nick@nick-andrew.net>
Date
Jul 19, 2008, 01:01 UTC
Message-ID
<20080719010122.GA12047@mail.local.tull.net>
In-Reply-To
<18533605.post@talk.nabble.com>
On Fri, Jul 18, 2008 at 09:58:49AM -0700, luisgutz wrote:
> Is there any way to import that directory into repoA with all it's history,
> but NOT the history from the other commits?
> Another way of putting is this: can I make git forget the history of all
> other commits but those from this directory?

I couldn't figure out git-filter-branch, so I did the following, which worked for me:

First, export commits as patches in mbox format:
	git log -p --first-parent --reverse --pretty=email $* > mbox

Second, run the mbox file through a filter which selectively renames files (since almost always I want the files in a different directory in the new repository):

	myfilter scripts=bin perllib=lib < mbox > mbox2
Finally, import into new repo:
	git-am mbox2
It's a bit slow on the import step but it meets my needs at this time.
Nick.
Filter script follows, for what it's worth ...

#!/usr/bin/perl # @(#) git-filter-rename.pl # # Read an mbox file containing patches on standard input, # modify the filenames within according to a list of substitutions # supplied on the command line, and write the modified mbox file # to standard output.

my @subs;
foreach (@ARGV) {
	if (/(.*)=(.*)/) {
		my $len = length($1);
		push(@subs, [ $1, $2, $len ]);
	} else {
		print STDERR "Unknown arg: $_\n";
	}
}
while (<STDIN>) {
	chomp;
	my $line = $_;
	if ($line =~ /^(---|\+\+\+) ([ab]\/)(.+)$/) {
		my $line_1 = $1;
		my $line_2 = $2;
		my $line_3 = $3;
		subFilename($line_3);
		print "$line_1 $line_2$line_3\n";
		next;
	}
	if ($line =~ /^diff --git ([ab]\/)(\S+) ([ab]\/)(\S+)/) {
		my ($line_1, $line_2, $line_3, $line_4) = ($1, $2, $3, $4);
		subFilename($line_2);
		subFilename($line_4);
		print "diff --git $line_1$line_2 $line_3$line_4\n";
		next;
	}
	print $line, "\n";
}
exit(0);

# ------------------------------------------------------------------------ # Substitute a filename in-place (modifies argument) # ------------------------------------------------------------------------

sub subFilename {
	foreach my $lr (@subs) {
		my ($lhs, $rhs, $len) = @$lr;
		if (substr($_[0], 0, $len) eq $lhs) {
			print STDERR "Match on $lhs, $_[0]\n";
			substr($_[0], 0, $len) = $rhs;
			last;
		}
	}
}
Previous: Avery PennarunNext: Johannes Schindelin
Message 3 of 5 in “copy selected history between repostories”
  1. luisgutzJul 18, 2008
  2. Avery PennarunJul 18, 2008
  3. Nick AndrewJul 19, 2008
  4. Johannes SchindelinJul 19, 2008
  5. Jeff KingJul 19, 2008

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.