{"thread":{"id":"13463","subject":"filter-branch --subdirectory-filter fails on a branch","startedAt":"2008-05-10T19:22:32Z","lastAt":"2008-05-10T19:22:32Z","messageCount":1,"participants":["v s"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"76535","messageId":"ed2394df0805101222l3da4c3cfn4a8ab8d782770703@mail.gmail.com","threadId":"13463","inReplyTo":null,"subject":"filter-branch --subdirectory-filter fails on a branch","fromName":"v s","fromEmail":"git.viper@gmail.com","sentAt":"2008-05-10T19:22:32Z","receivedAt":"2008-05-10T19:22:32Z","isPatch":false,"sender":{"key":"git.viper@gmail.com","avatar":null},"body":"Hi there.\n\nWhile splitting up a repository using git-filter-branch I stumbled upon\na tad weird case in which --subdirectory-filter refuses to filter out\na subdir on one of the branches, but succeeds on others. In addition,\nin some cases git-filter-branch refuses to run unless git-status is\ninvoked first.\n\nIn a nutshell, I have 2 subdirs at top level which I want to turn into\nseparate repos, A and B. There are 2 topic branches in repo: Topic-A\nmodifying exclusively A subdir, Topic-B - modifying exclusively B\nsubdir, and master modifying both. Topic-B was branched off of Topic-A\nwhich was branched off of master. Splitting out subdir A works without\na hitch, splitting out subdir B doesn't - Topic-A remains unchanged,\nthough master and Topic-B are transformed fine. Given full symmetry\nof commits (at least in repro case), I find that strange.\n\nBelow please find the precise repro steps interleaved with git output,\nwith interesting points 1,2,3 and 4 commented. Sorry that it came out\nquite longish and cluttered. \"=====> \" represents bash prompt (in vain\nattempt to improve readability), grep-ping for it then sed-ding it out\nought to yield executable bash script, I think.\n\nAm I somehow misusing git-filter-branch? Perusing its man page didn't\nturn up anything immediately obvious that I might be overlooking. Any\nideas?\n\nThanks in advance.\n\nV.Solo.\n\n\n=====> git --version\ngit version 1.5.5.1\n=====> mkdir zzz-both\n=====> cd zzz-both\n=====> pwd\n/tmp/zzz-both\n=====> git init\nInitialized empty Git repository in .git/\n=====> mkdir left\n=====> mkdir right\n=====> date > left/left.txt\n=====> date > right/right.txt\n=====> git add left right\n=====> git commit -m \"initial commit\"\nCreated initial commit 525c08c: initial commit\n 2 files changed, 2 insertions(+), 0 deletions(-)\n create mode 100644 left/left.txt\n create mode 100644 right/right.txt\n=====> date > left/left.txt\n=====> git commit -am \"changed left\"\nCreated commit 352e43c: changed left\n 1 files changed, 1 insertions(+), 1 deletions(-)\n=====> date > right/right.txt\n=====> git commit -am \"changed right\"\nCreated commit 4c0decd: changed right\n 1 files changed, 1 insertions(+), 1 deletions(-)\n=====> date > left/left.txt\n=====> date > right/right.txt\n=====> git commit -am \"changed both\"\nCreated commit 4866710: changed both\n 2 files changed, 2 insertions(+), 2 deletions(-)\n=====> git checkout -b left-refact\nSwitched to a new branch \"left-refact\"\n=====> date > left/left.txt\n=====> git commit -am \"left-refact: changed left\"\nCreated commit 81fba4e: left-refact: changed left\n 1 files changed, 1 insertions(+), 1 deletions(-)\n=====> git show-branch\n* [left-refact] left-refact: changed left\n ! [master] changed both\n--\n*  [left-refact] left-refact: changed left\n*+ [master] changed both\n=====> git checkout -b right-refact\nSwitched to a new branch \"right-refact\"\n=====> date > right/right.txt\n=====> git commit -am \"right-refact: changed right\"\nCreated commit 5cbddaa: right-refact: changed right\n 1 files changed, 1 insertions(+), 1 deletions(-)\n=====> git checkout master\nSwitched to branch \"master\"\n=====> git show-branch --more=10\n! [left-refact] left-refact: changed left\n * [master] changed both\n  ! [right-refact] right-refact: changed right\n---\n  + [right-refact] right-refact: changed right\n+ + [left-refact] left-refact: changed left\n+*+ [master] changed both\n+*+ [master^] changed right\n+*+ [master~2] changed left\n+*+ [master~3] initial commit\n=====> ls *\nleft:\nleft.txt\n\nright:\nright.txt\n=====> cp -r . ../zzz-left\n=====> pwd\n/tmp/zzz-both\n=====> cd ../zzz-left/\n=====> pwd\n/tmp/zzz-left\n=====> git branch\n  left-refact\n* master\n  right-refact\n=====> # (1) weirdness #1 : why do I have to \"git status\" first?\n=====> git filter-branch --subdirectory-filter left HEAD left-refact\nright-refact\nCannot rewrite branch(es) with a dirty working directory.\n=====> git status\n# On branch master\nnothing to commit (working directory clean)\n=====> git filter-branch --subdirectory-filter left HEAD left-refact\nright-refact\nRewrite 81fba4e28d8b18bfcc4b139479ce547017a25dce (4/4)\nRef 'refs/heads/master' was rewritten\nRef 'refs/heads/left-refact' was rewritten\nRef 'refs/heads/right-refact' was rewritten\n=====> git reset --hard\nHEAD is now at 91fdc32 changed both\n=====> ls\nleft.txt\n=====> git show-branch --more=10\n! [left-refact] left-refact: changed left\n * [master] changed both\n  ! [right-refact] left-refact: changed left\n---\n+ + [left-refact] left-refact: changed left\n+*+ [master] changed both\n+*+ [master^] changed left\n+*+ [master~2] initial commit\n=====> git log --pretty=oneline --name-status left-refact\nea1d9b2391a94952658c0a1ccc7fd6f1b7fb9348 left-refact: changed left\nM   left.txt\n91fdc32587a7e688970fe8b77aac51820a53aed0 changed both\nM   left.txt\nc62bf71dc9f6684598212beb056a8ad2e17fea91 changed left\nM   left.txt\n360b8064403f7e86075eb6722919776e2d6981c5 initial commit\nA   left.txt\n=====> cp ../zzz-both/ ../zzz-right\ncp: omitting directory `../zzz-both/'\n=====> cp -r ../zzz-both/ ../zzz-right\n=====> pwd\n/tmp/zzz-left\n=====> cd ../zzz-right/\n=====> pwd\n/tmp/zzz-right\n=====> git branch\n  left-refact\n* master\n  right-refact\n=====> # (2) weirdness #1 : why do I have to \"git status\" first?\n=====> git filter-branch --subdirectory-filter right HEAD left-refact\nright-refact\nCannot rewrite branch(es) with a dirty working directory.\n=====> git status\n# On branch master\nnothing to commit (working directory clean)\n=====> # (3) weirdness #2 : filter-branch fails\n=====> git filter-branch --subdirectory-filter right HEAD left-refact\nright-refact\nRewrite 5cbddaa45ae4fa53170dbbd1adcf86d841709c36 (4/4)\nRef 'refs/heads/master' was rewritten\nWARNING: Ref 'refs/heads/left-refact' is unchanged\nRef 'refs/heads/right-refact' was rewritten\n=====> git reset --hard\nHEAD is now at 9a16605 changed both\n=====> ls\nright.txt\n=====> # (4) weirdness #2 : indeed, left-refact is intact\n=====> git show-branch --more=10\n! [left-refact] left-refact: changed left\n * [master] changed both\n  ! [right-refact] right-refact: changed right\n---\n  + [right-refact] right-refact: changed right\n *+ [master] changed both\n *+ [master^] changed right\n *+ [master~2] initial commit\n+   [left-refact] left-refact: changed left\n+   [left-refact^] changed both\n+   [left-refact~2] changed right\n+   [left-refact~3] changed left\n+   [left-refact~4] initial commit\n=====> git log --pretty=oneline --name-status left-refact\n81fba4e28d8b18bfcc4b139479ce547017a25dce left-refact: changed left\nM   left/left.txt\n4866710cda33fcf563486f94883550e6e41eedc1 changed both\nM   left/left.txt\nM   right/right.txt\n4c0decd9458301b474fa16be8344a436aaf4e97f changed right\nM   right/right.txt\n352e43c705fcdac0abeaae78a814820146130cb3 changed left\nM   left/left.txt\n525c08c8fdc51ef81aae40f26423259b1f394e61 initial commit\nA   left/left.txt\nA   right/right.txt\n=====> git log --pretty=oneline --name-status right-refact\n55f1c2a693e7447ae8f5cb3b9b4994c815a5c2b7 right-refact: changed right\nM   right.txt\n9a16605e9650d82abdf64edd102c9824d4468c71 changed both\nM   right.txt\nb5ebdf2d5027ca9372a0811636604a9670b762dd changed right\nM   right.txt\n56f5e5c2ad98cc1597bbb5b97e291452fd3b9fd9 initial commit\nA   right.txt\n=====> git checkout left-refact\nSwitched to branch \"left-refact\"\n=====> ls *\nleft:\nleft.txt\n\nright:\nright.txt\n=====>\n"}]}