git-svn dcommit error: unable to determine upstrea

2020-07-08 06:32发布

问题:

I m trying out git-svn and I am getting the following error. What I've done so far is

 git svn init -T <my svn repo> 

then I've been committing to my repository with

 git commit -a

then once I did a few of those I did a

 git svn fetch

and then I tried a

 git svn dcommit

However, that fails with

Unable to determine the upstream SVN information from HEAD history. Perhaps the repository is empty

I can also see that the files in my file system are not marked as being used by svn (not sure if this should happen or not) though. If I browse the svn repository (with repo browser) I can see that the original files are there.

After this original failure I tried rebasing without much success (it throws some other error).

回答1:

The git svn commands are similar to dealing with a normal remote (the svn remote is named git-svn). fetch just downloads commits from the remote, it doesn't connect them to your tree in any way. It will work if you fetch right after initing, since you don't have a tree yet, but you committed first. You want to use git svn rebase, which will rebase your tree onto the svn head. Normally you git svn fetch right after git svn init, or just use git svn clone, which does both. Once the initial repository is set up you can just use git svn rebase all the time, which fetches and rebases in one operation



回答2:

I found that, when the SVN repo was empty git-svn throws

Unable to determine upstream SVN information from HEAD history

So using SVN I checked in a text file as the first commit

svn add test.txt; svn commit -m "test file"

Then I was able to do a git svn clone and that fixed everything.



回答3:

This site fixed the issue for me: http://eikke.com/importing-a-git-tree-into-a-subversion-repository/. Direct quote:

The issue is that the SVN metadata has been lost. To fix this, we can use a Git graft to link them. We’ll tell Git the commit which created the SVN folder in which we want to store the project is the parent commit of the first commit in our Git repository:

$ git show-ref trunk 
> 741ab63aea786882eafd38dc74369e651f554c9c refs/remotes/trunk 
$ $ git log --pretty=oneline master | tail -n1
> 88464cfdf549a82b30ee7c52e53e2b310f0d9ec4 Initial version  
$ echo "88464cfdf549a82b30ee7c52e53e2b310f0d9ec4 741ab63aea786882eafd38dc74369e651f554c9c" >> .git/info/grafts`


回答4:

Is it a general git-svn limitation? Or exists the problem between keyboard and chair?

This error message was introduced in git 1.5.1 (Feb. 2007) by commit a8ae262

Since you're committing from HEAD (or another commit that is a parent of HEAD), you'll be able to find a commit with metadata information containing the SVN URL that your HEAD was descended from anyways.

So git needs to find a commit including the SVN URL in order for a dcommit of one of your branch to work properly.

Or exists the problem between keyboard and chair?

That can happen if you select one of your branch created before git svn clone. You need to work with branches created on top of the ones imported from SVN by git svn clone.



回答5:

Just a guess, try git svn clone, then change/commit files, then git svn dcommit. This is the way I usually do it and it works (in my case).



标签: git-svn