How can I fix the SVN import line endings error?

前端 未结 9 1827
名媛妹妹
名媛妹妹 2021-02-05 22:25

I have to import an huge SVN repository that I have to transfer from one server to another. So I exported it from the old server:

svnadmin dump . > archive.sv         


        
相关标签:
9条回答
  • 2021-02-05 22:57

    With a little gymnastics you can work around this using svnsync, which has the ability to fix the EOLs. Let's say that your repository is dumped in archive.svn.

    First create the repository to load the repo back, ignoring the EOL problems:

    svnadmin create repo
    svnadmin load repo < archive.svn --bypass-prop-validation
    

    Now create a new repository for copying into:

    svnadmin create repo-fixed
    

    svnsync requires some pre-commit hook, even if you don't use it, so just use your editor to create an empty one in repo-fixed/hooks/pre-revprop-change:

    #!/bin/sh
    exit 0
    

    Initialize the destination repository for svnsync:

    svnsync init file:///path/to/repo-fixed file:///path/to/repo
    

    Now copy the entire repository over:

    svnsync sync file:///path/to/repo-fixed
    

    Whew! svnsync will even give you good news: NOTE: Normalized svn:* properties to LF line endings (Why the Subversion team didn't update svnadmin to do the same normalization is a mystery to me.)

    Once that's done, dump the new repository:

    svnadmin dump repo-fixed > archive-fixed.svn
    

    You now have archive-fixed.svn, which should be identical to archive.svn except the EOLs have been fixed as needed.

    (Optional) You can now remove the temporary repository you used for svnsync:

    rm -rf repo-fixed
    

    Update It turns out if you load this new dump, your Subversion client gets an error: Repository UUID does not match expected UUID. You'll have to use svnadmin setuuid ... to change the UUID ID to what it used to be.

    (This post is a culmination of a multitude of snippets and partial solutions I found around the web. Thanks to all the people who knew more than I did; I just put it all together.)

    See also:

    • Copying subversion repositories with history using svnsync
    • https://stackoverflow.com/a/28472420/421049
    • https://svn.apache.org/repos/asf/subversion/trunk/notes/svnsync.txt
    0 讨论(0)
  • 2021-02-05 22:59

    The first option of the answer of @ventura10 sounded good but didn't work for me. The sed command changed some versioned content outside the properties section resulting in md5 mismatches while loading the dump.

    Because my repository has no properties with binary content I changed the sed command to correct all properties and not only svn:log and svn:ignore. I was also sure that no versioned file contained a line starting with Prop-content-length:. Otherwise I would have got an error when loading the dump.

    sed -e '/^Prop-content-length: /,/^PROPS-END$/ s/^M/ /' svn.dump > svn.dump.repaired
    

    It's important to replace ^M with [blank], because the size of the property value must not change.

    The note of @ventura10 is still valid:

    ^M is a control character, that means 0D in hex. To get it use ^V^M (control V control M) instead ^M (circumflex M or control M)

    It's hard to believe that upgrading an existing repository from svn 1.4 to svn 1.7 makes this step nessecary, but I've found no other way to get rid of the carriage returns that are no longer accepted since svn 1.6.

    0 讨论(0)
  • 2021-02-05 22:59

    My problem was that the commentary of the commit was too big.

    0 讨论(0)
提交回复
热议问题