Re: git-svn and repository hierarchy?
From: Michael J Gruber <hidden>
Date: 2016-06-15 22:46:18
Josef Wolf venit, vidit, dixit 27.02.2009 18:12:
On Wed, Feb 25, 2009 at 10:26:10AM +0100, Michael J Gruber wrote:quoted
Josef Wolf venit, vidit, dixit 24.02.2009 23:34:quoted
quoted
I have set up a repository hierarchy like this: subversion-repos | git-svn-repos / | \ clone1 clone2 clone3Recent enough git should even warn you against doing that, "that" being pushing into checked out branches.I've now tried to synchronize via pull instead of push, but I still get conflicts.quoted
Your diagram above is missing important info, namely which branches you are pushing into. But the problem indicates that you are pushing into a checked out branch.In order to get a better understanding what's going on, I've written a small script which can be copy-pasted into some terminal window: ( set -ex # create test directory # TESTDIR=`mktemp --tmpdir=. git-svn-hierarchy-test-XXXXXXXX` rm -rf $TESTDIR mkdir -p $TESTDIR cd $TESTDIR SUBVERSION_REPOS=file://`pwd`/subversion-repos # create subversion repos with some history # svnadmin create subversion-repos svn -m "create standard layout" mkdir \ $SUBVERSION_REPOS/trunk \ $SUBVERSION_REPOS/branches \ $SUBVERSION_REPOS/tags svn co $SUBVERSION_REPOS/trunk subversion-wc echo change1 >>subversion-wc/test svn add subversion-wc/test svn ci -m "commit 1" subversion-wc # create git-svn-repos # git svn init --stdlayout $SUBVERSION_REPOS git-svn-repos (cd git-svn-repos; git svn fetch) # create a clone and do some work on it # git clone git-svn-repos clone1 for i in 2 3 4; do ( cd clone1; echo change$i >>test ; git commit -a -m "commit $i") done (cd git-svn-repos; git pull ../clone1)
Gives you 1-2-3-4
(cd git-svn-repos; git svn rebase)
Does nothing here (but is good practice)
(cd git-svn-repos; git svn dcommit)
Creates 2-3-4 on the svn side. *Then rebases* your master, which creates 1-2'-3'-4' on master. Note that 2 is different from 2' (git-svn id).
(cd git-svn-repos; git pull ../clone1) # if this line is executed,
That's the problem. This creates a merge after which you 1-2-3-4 and 1-2'-3'-4' plus the merge of 4 and 4'. Instead, use git pull --rebase here. You don't want merges in the branch from which you dcommit. Borrowing from some other vcs: Repeat the soothing mantra: a merge is no merge is no merge - it it's in svn ;)
(cd git-svn-repos; git svn rebase) # this command gives the conflict ) When I comment out the second "git pull ../clone1", the conflict does not happen on the last "git svn rebase", but on some later pull, rebase or dcommit command. Obviously, I'm doing something wrong. But I can't figure what. Any hints?
I guess when we said integrated we should have said rebase. Haven't we? Cheers, Michael