Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jira Subversion Mirror / SubGit remote error on push

So, using Subversion mirror(SubGit) with latest BitBucket (4.8.3). There are two changes made to master. One made directly and one made with a merge from a feature branch. When pushing the changes, get a SubGit error:

XC2T@B104315 MINGW64 /c/projects/repos/loct-demo (master)
$ git push
Total 0 (delta 0), reused 0 (delta 0)
remote: error: The following ref update is disallowed:
remote: error:   refs/heads/master: leads to replacement of SVN branch 'trunk'
remote: error:
remote: error: You can allow branch replacements by setting svn.allowBranchReplacement = true in SubGit configuration file.
remote: Fetching revisions from SVN repository:
remote:   up to date
remote: Sending commits to SVN repository:
To http://XC2T@localhost:7990/scm/loct/loct-demo.git 
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'http://XC2T@localhost:7990/scm/loct/loct-demo.git'

I'm sure I've done this in the past and it worked just fine. I will try reverting back and doing this again, but just wondering if others have seen this error and know what it means.

Thanks,

Brad

like image 982
BradW Avatar asked Aug 12 '16 21:08

BradW


1 Answers

This error message was introduced with SubGit version 3.2.1 and SVN Mirror add-on version 3.3.0.

SubGit/SVN Mirror rejects push operation that would result into branch replacement in Subversion repository. There are basically two cases when Git changes may lead to replacements on SVN side:

  1. Force push.

    When one forcefully pushes non-fast-forward update, SubGit/SVN Mirror has nothing to do but delete current version of the branch and re-create it from some older revision, because this is exactly what non-fast-forward update does: continuing branch history from a commit other than the branch tip.

  2. Fast-forward merge from one branch into another.

    When one creates a new branch foo from master:

    $ git checkout -b foo
    $ git commit -am 'fix foo'
    [foo ca3caf9] fix foo
    

    then pushes that branch to SubGit mirror:

    $ git push origin foo
    ...
    Sending commits to SVN repository:
      remote:   ca3caf9 => r10 branches/foo
    

    which gets ca3caf9 mapped to branches/foo@10.

    Finally, one merges branch foo back to master:

    $ git checkout master
    $ git merge foo
    Updating 0e39ad2..ca3caf9
    Fast-forward
    

    Noticed that Updating ... Fast-forward message? It means git merge found no new commits on master, hence there was no need to create a merge commit, i.e. git merge just moved the master pointer from older commit 0e39ad2 to a newer one ca3caf9.

    Now what happens when one pushes master to SubGit mirror:

    $ git push origin master
    

    SubGit finds out that master was updated from 0e39ad2 mapped to trunk@9 to ca3caf9 mapped to branches/foo@10. There's nothing SubGit can do but delete trunk and re-create it from branches/foo@10 which obviously leads to replacement of trunk.

And so we made sure that SubGit does not replace branches in these two scenarios unless SubGit administrator explicitly sets the following configuration option:

$ edit REPO/subgit/config
...
[svn]
    allowBranchReplacement = true
...
$ subgit install REPO

However, I'd recommend to keep svn.allowBranchReplacement set to false and follow these best practices to avoid the error message reported in the original question:

  • Never force push anything; prefer to merge, revert of branch out changes rather than overwrite them.

  • When merging one branch into another add --no-ff option: it forces git merge to create a merge commit when it would rather do a fast-forward update otherwise:

    $ git merge --no-ff foo
    

UPDATE:

If you're using SVN Mirror add-on, you can specify svn.allowBranchReplacement option at the Branches Mapping tab:

Branches Mapping

The text field should look as follows:

[svn]
    trunk = ...
    ...
    allowBranchReplacement = true

and then click on Apply changes button in order to activate this new setting.

like image 190
vadishev Avatar answered Oct 16 '22 14:10

vadishev