Migration von SVN zu GIT Angeforderte Authentifizierungstypen werden nicht unterstützt

Ich migriere das SVN-Repository unserer Organisation in ein Gitlab-Repository. Ich habe mich in vielen verschiedenen Quellen zum Stapelüberlauf umgesehen, die ich zu verknüpfen versucht habe, aber ich habe eine Warnung erhalten, dass meine Frage Spam zu sein scheint. Hier sind ein paar Links, die ich ausprobiert habe: Tutorial eins sowie lies mich für svn2git und keine Antwort gefunden. Ich verwende Windows 10. Ich habe Ruby, svn2git, svn2gitnet (svn2git, behauptet aber, Ihnen die Eingabe eines Passworts zu ermöglichen), TortoiseSVN und TortoiseGit installiert. Ich versuche den Befehl auszuführen:

svn2git http://*******-****/******* -v --username ********

und

svn2gitnet http://*******-****/******* -v --username ******** --password *******

die beide zurückkehren

Running command: git svn init --prefix=svn/ --username='********' --no-metadata --trunk='trunk' --tags='tags' --branches='branches' http://*******-****/*******
Initialized empty git repository in C:/Users/********/Desktop/.git/
Can't create session: Unable to connect to a repository at URL 'http://*******-****/*******': Error running context: The requested authentication type(s) are not supported at C:/Program Files/Git/mingw64/share/perl5/Git/SVN.pm line 310.

command failed:
git svn init --prefix=svn/ --username='********' --no-metadata --trunk='trunk' --tags='tags' --branches='branches' http://*******-****/*******

das umgebende Modul der Zeile 310 in SVN.pm ist:

sub init_remote_config {
    my ($self, $url, $no_write) = @_;
    $url = canonicalize_url($url);
    my $r = read_all_remotes();
    my $existing = find_existing_remote($url, $r);
    if ($existing) {
        unless ($no_write) {
            print STDERR "Using existing ",
                     "[svn-remote \"$existing\"]\n";
        }
        $self->{repo_id} = $existing;
    } elsif ($_minimize_url) {
        my $min_url = Git::SVN::Ra->new($url)->minimize_url;//line 310
        $existing = find_existing_remote($min_url, $r);
        if ($existing) {
            unless ($no_write) {
                print STDERR "Using existing ",
                         "[svn-remote \"$existing\"]\n";
            }
            $self->{repo_id} = $existing;
        }
        if ($min_url ne $url) {
            unless ($no_write) {
                print STDERR "Using higher level of URL: ",
                         "$url => $min_url\n";
            }
            my $old_path = $self->path;
            $url =~ s!^\Q$min_url\E(/|$)!!;
            $url = join_paths($url, $old_path);
            $self->path($url);
            $url = $min_url;
        }
    }
    my $orig_url;
    if (!$existing) {
        # verify that we aren't overwriting anything:
        $orig_url = eval {
            command_oneline('config', '--get',
                    "svn-remote.$self->{repo_id}.url")
        };
        if ($orig_url && ($orig_url ne $url)) {
            die "svn-remote.$self->{repo_id}.url already set: ",
                "$orig_url\nwanted to set to: $url\n";
        }
    }
    my ($xrepo_id, $xpath) = find_ref($self->refname);
    if (!$no_write && defined $xpath) {
        die "svn-remote.$xrepo_id.fetch already set to track ",
            "$xpath:", $self->refname, "\n";
    }
    unless ($no_write) {
        command_noisy('config',
                  "svn-remote.$self->{repo_id}.url", $url);
        my $path = $self->path;
        $path =~ s{^/}{};
        $path =~ s{%([0-9A-F]{2})}{chr hex($1)}ieg;
        $self->path($path);
        command_noisy('config', '--add',
                  "svn-remote.$self->{repo_id}.fetch",
                  $self->path.":".$self->refname);
    }
    $self->url($url);
}

Welche nächsten Schritte sollte ich unternehmen?

BEARBEITEN: Die folgende Codezeile entpuppt sich als Aufruf der Subversion-Fernzugriffsfunktion Neu. Diese Funktion füllt einige Standardparameter aus, einschließlich des Authentifizierungsschemas. Daher ist es wahrscheinlich, dass das verwendete Standardauthentifizierungsschema wahrscheinlich nicht NTLM ist. Das war die Authentifizierung, die unser Server verwendet hat. Es ist auch möglich, dass SVN die richtige Authentifizierung von der übergebenen URL erhalten hat, aber NTLM nicht mehr unterstützt.

my $min_url = Git::SVN::Ra->new($url)->minimize_url;//line 310


1 496
1

Antwort:

Gelöst

Lösung

  • Zuerst müssen Sie die Autorendatei abrufen, damit Sie den Commit-Verlauf abrufen können. Ich habe diesen Befehl in Powershell im Verzeichnis des svn-Repos auf dem Client-Rechner verwendet, um die Namen aller auszugeben, deren Commitment:
svn.exe log --quiet | ? { $_ -notlike '-*' } | % { "{0} = {0} <{0}>" -f ($_ -split ' \| ')[1] } | Select-Object -Unique
  • Es sollte ungefähr so ​​​​ausgedruckt werden:
     ***\**** = ***\**** <***\****>>     
     ***\**** = ***\**** <***\****>
     ******** = ******** <********>
     ******** = ******** <********>
  • Kopieren Sie das in eine Textdatei und merken Sie sich den Speicherort. Ändern Sie das Format so, dass jeder Eintrag seinen ursprünglichen SVN-Namen einem Vornamen, Nachnamen und zugewiesen bekommt:
    ***\**** = *** **** <***@example.com>
    ***\**** = *** **** <***@example.com>
    ******** = **** **** <****@example.com>
    ******** = *** ***** <***@example.com>
  • Dann habe ich Fernzugriff auf den Server erhalten und die Datei httpd.conf in D:\apachesvn\conf geändert, um alles zu entfernen, was versucht, die Authentifizierung einzurichten. Sie können die Authentifizierung bei Bedarf nach der Migration wieder hinzufügen. Zum Beispiel dieser Abschnitt:
<Location /phoneme>
DAV svn
SVNPath "d:/svn/phoneme/"

    AuthName "Subversion Phoneme repositories"
    AuthType SSPI
    NTLMAuth On
    NTLMAuthoritative On
    <RequireAll>
        <RequireAny>
            Require valid-user
            #require sspi-user EMEA\group_name
        </RequireAny>
        <RequireNone>
            Require user "ANONYMOUS LOGON"
            Require user "NT-AUTORITÄT\ANONYMOUS-ANMELDUNG"
        </RequireNone>
    </RequireAll>
    # use this to add the authenticated username to you header
    # so any backend system can fetch the current user
    # rewrite_module needs to be loaded then
    #RewriteEngine On
    #RewriteCond %{LA-U:REMOTE_USER} (.+)
    #RewriteRule . - [E=RU:%1]
    #RequestHeader set X_ISRW_PROXY_AUTH_USER %{RU}e
</Location>
  • Wurde so geändert:
<Location /phoneme>
DAV svn
SVNPath "d:/svn/phoneme/"
</Location>
  • Schließlich habe ich den Apache 2.4-Dienst auf dem Server mit dem Task-Manager neu gestartet und bin zum Client-Rechner zurückgekehrt und habe dieses Befehlsformat verwendet, um das svn-Repository endgültig auf git zu migrieren.
git svn clone "http://repo-url/root" "C:\path\to\new\git\repo" -stdlayout -A "C:/path/to/authors/file/authors.txt"