Skip to contentSkip to conversation

git-svn: follow parent after the fact?

DISCUSSION Steven Grimm 2 participants 3 messages Aug 11, 2016

lore
Share & tools
lore
#0 lore raw

One of the other git users here just noticed that his git-svn clone of a particular svn repo has an inconsistent set of files compared to the svn client. Turns out the repo has had its trunk moved around in the past. A fresh clone with --follow-parent (which he didn't use) produces the correct results.

Obviously he can blow away his current repo and make a new one, but it'd be nicer if he could preserve his local change history. Is there any way to retroactively apply the additional changes --follow-parent would have applied if it had been used on the initial fetch?

It would be better, IMO, if you didn't have to figure out whether or not a given remote svn repository has had branch renames in the past in order to figure out if you need to provide an extra option to git-svn fetch. Maybe --follow-parent should be the default behavior and there should be an option to turn it off? Or is there a good reason to not want that behavior most of the time? My assumption is that it's not the default simply because it's a recent addition.

By the way, I'm completely in favor of renaming commit to set-tree. +1 for that change.

#1 lore raw
Quoted 5 lines · Steven Grimm

One of the other git users here just noticed that his git-svn clone of a particular svn repo has an inconsistent set of files compared to the svn client. Turns out the repo has had its trunk moved around in the past. A fresh clone with --follow-parent (which he didn't use) produces the correct results.

The final set of files at the latest (svn) revision was inconsistent? That should never happen... If so, I'd very much like to look into this.

Quoted 4 lines

Obviously he can blow away his current repo and make a new one, but it'd be nicer if he could preserve his local change history. Is there any way to retroactively apply the additional changes --follow-parent would have applied if it had been used on the initial fetch?

git-svn graft-branches can probably work (if he imported the parent separately).

Quoted 7 lines

It would be better, IMO, if you didn't have to figure out whether or not a given remote svn repository has had branch renames in the past in order to figure out if you need to provide an extra option to git-svn fetch. Maybe --follow-parent should be the default behavior and there should be an option to turn it off? Or is there a good reason to not want that behavior most of the time? My assumption is that it's not the default simply because it's a recent addition.

It may behave unpredictably on some poorly organized repositories. I haven't quite debugged this problem fully as the current code to handle multiple repositories is a hacked-on mess.

I'm currently refactoring git-svn to work better on multi-remote operations and --follow-parent should be easier to debug as a result.

Quoted 2 lines

By the way, I'm completely in favor of renaming commit to set-tree. +1 for that change.

Noted, thanks for the input.

#2 lore raw
Quoted 3 lines · Eric Wong

The final set of files at the latest (svn) revision was inconsistent? That should never happen... If so, I'd very much like to look into this.

Yes, that's right; there are about 50 files that were in the original trunk before it was renamed but weren't in the branch that became the new trunk. Those files are present in the git repo if I use plain git-svn fetch, but they're not there in an svn client or in a git repo where I've used --follow-parent.

So far I haven't been able to come up with a from-scratch test case to demonstrate this behavior. The svn repository in question, unfortunately, isn't a public one. I've asked the person in charge of the repo if he remembers what exactly he did at the time of the branch reorganization; so far every permutation I've tried in my test repo has worked fine and not had the problem, so something odd must have happened in that repo's history.

I'll follow up if/when I manage to get a good test case.