On Tue, 26 May 2015 23:43:43 +0530 Kalpa Welivitigoda <callka...@gmail.com> wrote:
[...] > >> Following is the output of $ git log --all --graph --decorate > >> --oneline > >> > >> * 9c97cd4 (HEAD, master) Merge tag 'tags/Bdir12' > >> |\ > >> | * af56821 (tag: Bdir12) updating dir1-2 > >> | * d0b8f8a adding dir1-2 > >> * 2f4b0ae adding dir1 > >> * 854521c adding dir1/dir1-3 > >> * 6f54cfb adding dir1/dir1-1 > >> * 2ff6f17 adding dir2 > >> * 0710523 init commit [...] > Extremely sorry for the confusion made. Let me explain, > > In repoB, > > $ git log --oneline dir1-2/ > 43b1361 updating dir1-2 > e68c343 adding dir1-2 > > In repoA, > $ git log --oneline dir1/dir1-2/ > 9c97cd4 Merge tag 'tags/Bdir12' > > My question is, shouldn't both of them return the same outcome (it is > ok not to have the same hash, but the commits in repoB should be there > in repoA, aren't they?) ? Ah, I think I understand now, thanks. The reason for this, apparently, is that tree objects referenced by commits af56821 and d0b8f8a do not actually "hang off" dir1 prefix as `git subtree split` did not know about it (and apparently there's no way to artifically make it think it's there). To spell it in other words, the first (and only) commit in repoB which has "dir1-2" under "dir1" is the merge commit 9c97cd4. The commits in the chain produced by `git subtree split` do not even know about "dir1-2" (you can verify this by running `git ls-tree --name-only -r af56821`) as they refer to tree object that merely contain *the contents* of "dir1-2". Well, I'm not sure what to do now... Do running $ git log --follow dir1/dir1-2 work for you -- descending into the history to the right side of the merge commit 9c97cd4? If yes, I'd stop here. If not, I'm afraid, some sort of `git filter-branch` mumbo-jumbo will be required on the chain produced by `git subtree split`: the idea is to rewrite each commit on that artifical branch with sort of the same commit but with all its files moved under the "dir1/dir1-2" directory so that both names actually exist in the produced tree objects attached to the commits in the rewritten branch. Basically something along these lines (untested): $ cd repoA $ git branch Bdir12 $(git subtree split dir1-2) $ git filter-branch --tree-filter 'mkdir -p ./dir1/dir1-2 && find . -mindepth 1 -path ./dir -prune -o -print | xargs mv -t ./dir/dir1-2' Bdir12 $ cd repoB $ git fetch ..\repoA Bdir12 ... and continue as before The script passed to `git filter-branch --tree-filter` is run once for each commit in the history of the branch being rewritten and will operate on the work tree of that commit checked out. The script creates the target directory hierarchy, then finds, recursively, all the files and directories in the work tree, except the newly created directory, and then moves them under that directory. The new commit produced by filter-branch will have all the files under dir1/dir1-2. -- You received this message because you are subscribed to the Google Groups "Git for human beings" group. To unsubscribe from this group and stop receiving emails from it, send an email to git-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.