{"thread":{"id":"13443","subject":"git filter-branch --subdirectory-filter","startedAt":"2008-05-09T01:01:47Z","lastAt":"2008-05-10T11:44:13Z","messageCount":10,"participants":["James Sadler","Jeff King","Johannes Sixt"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"76425","messageId":"e5e204700805081801x314b02bek5d53a086b02dac83@mail.gmail.com","threadId":"13443","inReplyTo":null,"subject":"git filter-branch --subdirectory-filter","fromName":"James Sadler","fromEmail":"freshtonic@gmail.com","sentAt":"2008-05-09T01:01:47Z","receivedAt":"2008-05-09T01:01:47Z","isPatch":false,"sender":{"key":"freshtonic@gmail.com","avatar":"https://gravatar.com/avatar/b6650ce4e0ec8d7169a964ef15255a74205599a33a9cb8295a6018db566c2fdc?d=mp&s=160"},"body":"Hi All,\n\nI have some issues with git filter-branch.\n\nI have a git repository that I wish to split into multiple seperate\nrepositories for each logical\nmodule that it contains. Each logical module is already in its own\ndirectory at the root of the repo.\n\nMy experiments with 'git filter-branch' have been *partially* successful.\n\nTo extract a module into its own repo, I first copied the original\nrepo (this was a simple cp -r,\nas it seemed to be the simplest way as git clone doesn't get all the branches)\nand ran filter-branch with a --commit-filter to skip commits that were\nirrelevant to th subdir.\n\nThat step worked just fine.\n\nThe next pass was to 'hoist' the contents of the subdir in the new\nrepo into the root dir.\nI thought I could do this with a --subdirectory-filter argument to\nfilter-branch, except when I do\nthis, I loose tons of commits.  (The working tree is correct, i.e. the\nsame as the original repo\nworking tree, but the history is screwed).\n\nAnybody have any idea what I am doing wrong?  If it can't be done with\n--subdirectory-filter can\nit be done with the 'subtree' merge strategy somehow?\n\nCheers,\n-- \nJames\n"},{"id":"76426","messageId":"20080509013300.GA7836@sigill.intra.peff.net","threadId":"13443","inReplyTo":"e5e204700805081801x314b02bek5d53a086b02dac83@mail.gmail.com","subject":"Re: git filter-branch --subdirectory-filter","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2008-05-09T01:33:00Z","receivedAt":"2008-05-09T01:33:00Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Fri, May 09, 2008 at 11:01:47AM +1000, James Sadler wrote:\n\n> I have a git repository that I wish to split into multiple seperate\n> repositories for each logical module that it contains. Each logical\n> module is already in its own directory at the root of the repo.\n\nOK.\n\n> To extract a module into its own repo, I first copied the original\n> repo (this was a simple cp -r, as it seemed to be the simplest way as\n> git clone doesn't get all the branches)\n\nIt does copy them, but they're just \"remote tracking branches\". If you\nhave many branches, you can recreate them via a loop with git-branch, or\nby \"git fetch . refs/remotes/origin/*:refs/heads/*\". If you have only\none branch, you might just want to make a few copies of it with \"for i\nin repo1 repo2; do git branch $i master; done\", and then filter-branch\nthose branches.\n\nIn either case, your cp is fine, if just a little less efficient.\n\n> and ran filter-branch with a --commit-filter to skip commits that were\n> irrelevant to th subdir.\n\nBut that's part of what subdirectory-filter does, so this step is\nunnecessary.\n\n> The next pass was to 'hoist' the contents of the subdir in the new\n> repo into the root dir.\n\nAnd that's the other part of what subdirectory-filter does.\n\n> I thought I could do this with a --subdirectory-filter argument to\n> filter-branch, except when I do this, I loose tons of commits.  (The\n> working tree is correct, i.e. the same as the original repo working\n> tree, but the history is screwed).\n\nYou'll have to be more specific about what's wrong with history. Of\ncourse some commits will be gone after filtering the subdir (those that\ndidn't touch anything in the subdir); that's part of the point.\n\n-Peff\n"},{"id":"76446","messageId":"e5e204700805090038k373bbabcyfb10d8c93ec5b3a7@mail.gmail.com","threadId":"13443","inReplyTo":"20080509013300.GA7836@sigill.intra.peff.net","subject":"Re: git filter-branch --subdirectory-filter","fromName":"James Sadler","fromEmail":"freshtonic@gmail.com","sentAt":"2008-05-09T07:38:12Z","receivedAt":"2008-05-09T07:38:12Z","isPatch":false,"sender":{"key":"freshtonic@gmail.com","avatar":"https://gravatar.com/avatar/b6650ce4e0ec8d7169a964ef15255a74205599a33a9cb8295a6018db566c2fdc?d=mp&s=160"},"body":"Hi Jeff,\n\nAfter reading your reponse and re-reading my original email, I\nrealised it was totally unclear\nso I have re-explained myself below.\n\n2008/5/9 Jeff King <peff@peff.net>:\n> On Fri, May 09, 2008 at 11:01:47AM +1000, James Sadler wrote:\n>\n>> I have a git repository that I wish to split into multiple separate\n>> repositories for each logical module that it contains. Each logical\n>> module is already in its own directory at the root of the repo.\n>\n> OK.\n>\n>> To extract a module into its own repo, I first copied the original\n>> repo (this was a simple cp -r, as it seemed to be the simplest way as\n>> git clone doesn't get all the branches)\n\nI must have experienced a brain fart or something or missed the '-r' from\ngit branch...\n\n>> and ran filter-branch with a --commit-filter to skip commits that were\n>> irrelevant to th subdir.\n>\n> But that's part of what subdirectory-filter does, so this step is\n> unnecessary.\n\nYes that's true, but...\n\nClearer explanation:\n\nI originally tried --subdirectory-filter by itself to see if it would\ndo the job, but it filtered\nmore commits than I thought it should (some commits that touched the subdir were\nmissing after filter-branch was run).\n\nI then began to question my understanding of the semantics of\nsubdirectory-filter.\n\nIs it meant to:\nA) Only keep commits where ALL of the changes in the commit only touch\ncontent under $DIR?\nB) Only keep commits where SOME of the changes in the commit touch\ncontent under $DIR?\n\nI suspected that it was behaving as A.\n\nThat's when I decided to run the commit-filter first in combination\nwith the tree-filter.  This would\nleave me with all commits that touched the subdir but any commit that\ntouched multiple subdirs\nwould be cleaned up so it only touched the subdir I want to keep.\n\nAt this point I have a bunch of commits that only make changes to\nsubdir (verified using gitk), and I would\nexpect subdirectory-filter to keep every single commit.\n\nHowever, after running it, I loose most of my commits.  Strangely, the\nworking tree is bit-for-bit correct\nwith the original version or the subdir in the old repo, but the\nhistory leading up to it is not.\n\n--subdirectory-filter does not seem to behave as either A or B above\nbut something other way.  I'm sure\nit will turn out to be something silly, but I'm pulling my hair out\ntrying to figure this one out.\n\nHopefully that's a clearer explanation!\n\n-- \nJames\n"},{"id":"76448","messageId":"48240407.4080104@viscovery.net","threadId":"13443","inReplyTo":"e5e204700805090038k373bbabcyfb10d8c93ec5b3a7@mail.gmail.com","subject":"Re: git filter-branch --subdirectory-filter","fromName":"Johannes Sixt","fromEmail":"j.sixt@viscovery.net","sentAt":"2008-05-09T07:57:59Z","receivedAt":"2008-05-09T07:57:59Z","isPatch":false,"sender":{"key":"j6t@kdbg.org","avatar":"https://avatars.githubusercontent.com/u/14810926?v=4"},"body":"James Sadler schrieb:\n> Hi Jeff,\n> \n> After reading your reponse and re-reading my original email, I\n> realised it was totally unclear\n> so I have re-explained myself below.\n> \n> 2008/5/9 Jeff King <peff@peff.net>:\n>> On Fri, May 09, 2008 at 11:01:47AM +1000, James Sadler wrote:\n>>> and ran filter-branch with a --commit-filter to skip commits that were\n>>> irrelevant to th subdir.\n>> But that's part of what subdirectory-filter does, so this step is\n>> unnecessary.\n> \n> Yes that's true, but...\n> \n> Clearer explanation:\n> \n> I originally tried --subdirectory-filter by itself to see if it would\n> do the job, but it filtered\n> more commits than I thought it should (some commits that touched the subdir were\n> missing after filter-branch was run).\n> \n> I then began to question my understanding of the semantics of\n> subdirectory-filter.\n> \n> Is it meant to:\n> A) Only keep commits where ALL of the changes in the commit only touch\n> content under $DIR?\n> B) Only keep commits where SOME of the changes in the commit touch\n> content under $DIR?\n> \n> I suspected that it was behaving as A.\n\nIt's expected to do B.\n\n> That's when I decided to run the commit-filter first in combination\n> with the tree-filter.  This would\n> leave me with all commits that touched the subdir but any commit that\n> touched multiple subdirs\n> would be cleaned up so it only touched the subdir I want to keep.\n> \n> At this point I have a bunch of commits that only make changes to\n> subdir (verified using gitk), and I would\n> expect subdirectory-filter to keep every single commit.\n\nAt this point you don't need subdirectory-filter. Use an --index-filter to\n keep only the subdirectory *and* remove the directory name at the same\ntime. Something like this:\n\ngit filter-branch --index-filter \\\n        'git ls-files -s thedir | sed \"s-\\tthedir/--\" |\n                GIT_INDEX_FILE=$GIT_INDEX_FILE.new \\\n                        git update-index --index-info &&\n         mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD\n\n> However, after running it, I loose most of my commits.  Strangely, the\n> working tree is bit-for-bit correct\n> with the original version or the subdir in the old repo, but the\n> history leading up to it is not.\n\nThe bit-for-bit correctness is not surprising, but the incorrect history\nis. What is your definition of \"correct\" (i.e. can you give an example of\nyour expectations that are not met)? Do you have complicated history (with\nmerges)? Note that merges are removed if all but one of the merged\nbranches do not touch the subdirectory.\n\n-- Hannes\n"},{"id":"76449","messageId":"20080509080039.GA15393@sigill.intra.peff.net","threadId":"13443","inReplyTo":"e5e204700805090038k373bbabcyfb10d8c93ec5b3a7@mail.gmail.com","subject":"Re: git filter-branch --subdirectory-filter","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2008-05-09T08:00:39Z","receivedAt":"2008-05-09T08:00:39Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Fri, May 09, 2008 at 05:38:12PM +1000, James Sadler wrote:\n\n> I originally tried --subdirectory-filter by itself to see if it would\n> do the job, but it filtered more commits than I thought it should\n> (some commits that touched the subdir were missing after filter-branch\n> was run).\n> \n> I then began to question my understanding of the semantics of\n> subdirectory-filter.\n> \n> Is it meant to:\n> A) Only keep commits where ALL of the changes in the commit only touch\n> content under $DIR?\n> B) Only keep commits where SOME of the changes in the commit touch\n> content under $DIR?\n> \n> I suspected that it was behaving as A.\n\nMy understanding is that it should behave as B. E.g.:\n\n  git init\n  mkdir subdir1 subdir2\n  echo content 1 >subdir1/file\n  echo content 2 >subdir2/file\n  git add .\n  git commit -m initial\n  echo changes 1 >>subdir1/file\n  git commit -a -m 'only one'\n  echo more changes 1 >>subdir1/file\n  echo more changes 2 >>subdir2/file\n  git commit -a -m 'both'\n  git filter-branch --subdirectory-filter subdir1\n  git log --name-status --pretty=oneline\n\nshould show something like:\n\n  b119e21829b6039aa8fe938fb0304a9a7436b84d both\n  M       file\n  db2ad8e702f36a1df99dd529aa594e756010b191 only one\n  M       file\n  dacb4c2536e61c18079bcc73ea81fa0fb139c097 initial\n  A       file\n\nIOW, all commits touch subdir1/file, which becomes just 'file'.\n\nIt could be a bug in git-filter-branch. What version of git are you\nusing?\n\n-Peff\n"},{"id":"76486","messageId":"e5e204700805092031m14c3d6c2kb85b51af5a1ee8f7@mail.gmail.com","threadId":"13443","inReplyTo":"20080509080039.GA15393@sigill.intra.peff.net","subject":"Re: git filter-branch --subdirectory-filter","fromName":"James Sadler","fromEmail":"freshtonic@gmail.com","sentAt":"2008-05-10T03:31:37Z","receivedAt":"2008-05-10T03:31:37Z","isPatch":false,"sender":{"key":"freshtonic@gmail.com","avatar":"https://gravatar.com/avatar/b6650ce4e0ec8d7169a964ef15255a74205599a33a9cb8295a6018db566c2fdc?d=mp&s=160"},"body":"2008/5/9 Jeff King <peff@peff.net>:\n> On Fri, May 09, 2008 at 05:38:12PM +1000, James Sadler wrote:\n>\n>> I originally tried --subdirectory-filter by itself to see if it would\n>> do the job, but it filtered more commits than I thought it should\n>> (some commits that touched the subdir were missing after filter-branch\n>> was run).\n>>\n>> I then began to question my understanding of the semantics of\n>> subdirectory-filter.\n>>\n>> Is it meant to:\n>> A) Only keep commits where ALL of the changes in the commit only touch\n>> content under $DIR?\n>> B) Only keep commits where SOME of the changes in the commit touch\n>> content under $DIR?\n>>\n>> I suspected that it was behaving as A.\n>\n> My understanding is that it should behave as B. E.g.:\n>\n>  git init\n>  mkdir subdir1 subdir2\n>  echo content 1 >subdir1/file\n>  echo content 2 >subdir2/file\n>  git add .\n>  git commit -m initial\n>  echo changes 1 >>subdir1/file\n>  git commit -a -m 'only one'\n>  echo more changes 1 >>subdir1/file\n>  echo more changes 2 >>subdir2/file\n>  git commit -a -m 'both'\n>  git filter-branch --subdirectory-filter subdir1\n>  git log --name-status --pretty=oneline\n>\n> should show something like:\n>\n>  b119e21829b6039aa8fe938fb0304a9a7436b84d both\n>  M       file\n>  db2ad8e702f36a1df99dd529aa594e756010b191 only one\n>  M       file\n>  dacb4c2536e61c18079bcc73ea81fa0fb139c097 initial\n>  A       file\n>\n\nBehaving as B is definitely the desired behaviour, but I am not observing that.\nI'll see if I can create a test case to demonstrate.  Unfortunately,\nI don't have the right to distribute our repo so will have to attempt\nto reproduce the\nproblem another way.\n\nDoes anybody have a script that can take an existing repo,\nand create a new one with garbled-but-equivalent commits?  i.e.  file\nand directory structure\nis same with names changed, and there is a one-one relationship\nbetween lines of text\nin new repo and old one except the lines have been scrambled?  It would be\na useful tool for distributing private repositories for debugging reasons.\n\n> IOW, all commits touch subdir1/file, which becomes just 'file'.\n>\n> It could be a bug in git-filter-branch. What version of git are you\n> using?\n\nI am using git version 1.5.5\n\n>\n> -Peff\n>\n\n-- \nJames\n"},{"id":"76495","messageId":"20080510055332.GB11556@sigill.intra.peff.net","threadId":"13443","inReplyTo":"e5e204700805092031m14c3d6c2kb85b51af5a1ee8f7@mail.gmail.com","subject":"Re: git filter-branch --subdirectory-filter","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2008-05-10T05:53:32Z","receivedAt":"2008-05-10T05:53:32Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Sat, May 10, 2008 at 01:31:37PM +1000, James Sadler wrote:\n\n> Does anybody have a script that can take an existing repo, and create\n> a new one with garbled-but-equivalent commits?  i.e.  file and\n> directory structure is same with names changed, and there is a one-one\n> relationship between lines of text in new repo and old one except the\n> lines have been scrambled?  It would be a useful tool for distributing\n> private repositories for debugging reasons.\n\nThis is only lightly tested, but the script below should do the trick.\nIt works as an index filter which munges all content in such a way that\na particular line is always given the same replacement text. That means\nthat diffs will look approximately the same, but will add and remove\nlines that say \"Fake line XXX\" instead of the actual content.\n\nYou can munge the commit messages themselves by just replacing them with\nsome unique text; in the example below, we just replace them with the\nmd5sum of the content.\n\nThis will leave the original author, committer, and date, which is\npresumably non-proprietary.\n\n-- >8 --\n#!/usr/bin/perl\n#\n# Obscure a repository while still maintaining the same history\n# structure and diffs.\n#\n# Invoke as:\n#   git filter-branch \\\n#     --msg-filter md5sum \\\n#     --index-filter /path/to/this/script\n\nuse strict;\nuse IPC::Open2;\nuse DB_File;\nuse Fcntl;\ntie my %blob_cache, 'DB_File', 'blob-cache', O_RDWR|O_CREAT, 0666;\ntie my %line_cache, 'DB_File', 'line-cache', O_RDWR|O_CREAT, 0666;\n\nopen(my $lsfiles, '-|', qw(git ls-files --stage))\n  or die \"unable to open ls-files: $!\";\nopen(my $update, '|-', qw(git update-index --index-info))\n  or die \"unable to open upate-inex: $!\";\n\nwhile(<$lsfiles>) {\n  my ($mode, $hash, $path) = /^(\\d+) ([0-9a-f]{40}) \\d\\t(.*)/\n    or die \"bad ls-files line: $_\";\n  $blob_cache{$hash} = munge($hash)\n    unless exists $blob_cache{$hash};\n  print $update \"$mode $blob_cache{$hash}\\t$path\\n\";\n}\n\nclose($lsfiles);\nclose($update);\nexit $?;\n\nsub munge {\n  my $h = shift;\n\n  open(my $in, '-|', qw(git show), $h)\n    or die \"unable to open git show: $!\";\n  open2(my $hash, my $out, qw(git hash-object -w --stdin));\n\n  while(<$in>) {\n    $line_cache{$_} ||= 'Fake line ' . $line_cache{CURRENT}++ . \"\\n\";\n    print $out $line_cache{$_};\n  }\n\n  close($in);\n  close($out);\n\n  my $r = <$hash>;\n  chomp $r;\n  return $r;\n}\n"},{"id":"76498","messageId":"e5e204700805100010k4f1bee78y7d387d660cca3f35@mail.gmail.com","threadId":"13443","inReplyTo":"20080510055332.GB11556@sigill.intra.peff.net","subject":"Re: git filter-branch --subdirectory-filter","fromName":"James Sadler","fromEmail":"freshtonic@gmail.com","sentAt":"2008-05-10T07:10:21Z","receivedAt":"2008-05-10T07:10:21Z","isPatch":false,"sender":{"key":"freshtonic@gmail.com","avatar":"https://gravatar.com/avatar/b6650ce4e0ec8d7169a964ef15255a74205599a33a9cb8295a6018db566c2fdc?d=mp&s=160"},"body":"Excellent!  I'll give that a whirl, thanks.\n\n- James.\n\n2008/5/10 Jeff King <peff@peff.net>:\n> On Sat, May 10, 2008 at 01:31:37PM +1000, James Sadler wrote:\n>\n>> Does anybody have a script that can take an existing repo, and create\n>> a new one with garbled-but-equivalent commits?  i.e.  file and\n>> directory structure is same with names changed, and there is a one-one\n>> relationship between lines of text in new repo and old one except the\n>> lines have been scrambled?  It would be a useful tool for distributing\n>> private repositories for debugging reasons.\n>\n> This is only lightly tested, but the script below should do the trick.\n> It works as an index filter which munges all content in such a way that\n> a particular line is always given the same replacement text. That means\n> that diffs will look approximately the same, but will add and remove\n> lines that say \"Fake line XXX\" instead of the actual content.\n>\n> You can munge the commit messages themselves by just replacing them with\n> some unique text; in the example below, we just replace them with the\n> md5sum of the content.\n>\n> This will leave the original author, committer, and date, which is\n> presumably non-proprietary.\n>\n> -- >8 --\n> #!/usr/bin/perl\n> #\n> # Obscure a repository while still maintaining the same history\n> # structure and diffs.\n> #\n> # Invoke as:\n> #   git filter-branch \\\n> #     --msg-filter md5sum \\\n> #     --index-filter /path/to/this/script\n>\n> use strict;\n> use IPC::Open2;\n> use DB_File;\n> use Fcntl;\n> tie my %blob_cache, 'DB_File', 'blob-cache', O_RDWR|O_CREAT, 0666;\n> tie my %line_cache, 'DB_File', 'line-cache', O_RDWR|O_CREAT, 0666;\n>\n> open(my $lsfiles, '-|', qw(git ls-files --stage))\n>  or die \"unable to open ls-files: $!\";\n> open(my $update, '|-', qw(git update-index --index-info))\n>  or die \"unable to open upate-inex: $!\";\n>\n> while(<$lsfiles>) {\n>  my ($mode, $hash, $path) = /^(\\d+) ([0-9a-f]{40}) \\d\\t(.*)/\n>    or die \"bad ls-files line: $_\";\n>  $blob_cache{$hash} = munge($hash)\n>    unless exists $blob_cache{$hash};\n>  print $update \"$mode $blob_cache{$hash}\\t$path\\n\";\n> }\n>\n> close($lsfiles);\n> close($update);\n> exit $?;\n>\n> sub munge {\n>  my $h = shift;\n>\n>  open(my $in, '-|', qw(git show), $h)\n>    or die \"unable to open git show: $!\";\n>  open2(my $hash, my $out, qw(git hash-object -w --stdin));\n>\n>  while(<$in>) {\n>    $line_cache{$_} ||= 'Fake line ' . $line_cache{CURRENT}++ . \"\\n\";\n>    print $out $line_cache{$_};\n>  }\n>\n>  close($in);\n>  close($out);\n>\n>  my $r = <$hash>;\n>  chomp $r;\n>  return $r;\n> }\n>\n\n\n\n-- \nJames\n"},{"id":"76505","messageId":"e5e204700805100438v6984593oada51daa4d456fd3@mail.gmail.com","threadId":"13443","inReplyTo":"20080510055332.GB11556@sigill.intra.peff.net","subject":"Re: git filter-branch --subdirectory-filter","fromName":"James Sadler","fromEmail":"freshtonic@gmail.com","sentAt":"2008-05-10T11:38:59Z","receivedAt":"2008-05-10T11:38:59Z","isPatch":false,"sender":{"key":"freshtonic@gmail.com","avatar":"https://gravatar.com/avatar/b6650ce4e0ec8d7169a964ef15255a74205599a33a9cb8295a6018db566c2fdc?d=mp&s=160"},"body":"2008/5/10 Jeff King <peff@peff.net>:\n> On Sat, May 10, 2008 at 01:31:37PM +1000, James Sadler wrote:\n>\n>> Does anybody have a script that can take an existing repo, and create\n>> a new one with garbled-but-equivalent commits?  i.e.  file and\n>> directory structure is same with names changed, and there is a one-one\n>> relationship between lines of text in new repo and old one except the\n>> lines have been scrambled?  It would be a useful tool for distributing\n>> private repositories for debugging reasons.\n>\n> This is only lightly tested, but the script below should do the trick.\n> It works as an index filter which munges all content in such a way that\n> a particular line is always given the same replacement text. That means\n> that diffs will look approximately the same, but will add and remove\n> lines that say \"Fake line XXX\" instead of the actual content.\n>\n> You can munge the commit messages themselves by just replacing them with\n> some unique text; in the example below, we just replace them with the\n> md5sum of the content.\n>\n> This will leave the original author, committer, and date, which is\n> presumably non-proprietary.\n>\n\n> <snip>\n\nJeff,\n\nI have run your script on my repo and now have an obfuscated version.\nWhen I run 'git filter-branch -subdirectory filter $DIR' on this repo, the same\nproblem occurs, i.e. there are fewer commits remaining than I would expect.\n\nIf I place this repo somewhere you can download it, would you be kind enough\nto take a look?  I'll detail the steps required to reproduce in another post.\n\nThanks,\n\nJames\n"},{"id":"76506","messageId":"20080510114412.GA26461@sigill.intra.peff.net","threadId":"13443","inReplyTo":"e5e204700805100438v6984593oada51daa4d456fd3@mail.gmail.com","subject":"Re: git filter-branch --subdirectory-filter","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2008-05-10T11:44:13Z","receivedAt":"2008-05-10T11:44:13Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Sat, May 10, 2008 at 09:38:59PM +1000, James Sadler wrote:\n\n> I have run your script on my repo and now have an obfuscated version.\n> When I run 'git filter-branch -subdirectory filter $DIR' on this repo,\n> the same problem occurs, i.e. there are fewer commits remaining than I\n> would expect.\n\nGreat, I'm glad the obfuscation worked.\n\n> If I place this repo somewhere you can download it, would you be kind\n> enough to take a look?  I'll detail the steps required to reproduce in\n> another post.\n\nSure.\n\n-Peff\n"}]}