4

コマンドを使用して、Windows 7でsvnからgitに切り替えようとしていますgit svn clone

私のリポジトリの1つで、これを試します:

git svn clone --stdlayout --no-metadata -A users.txt --username=/CN=john https://path/to/my/repo ./

ここに私のusers.txtファイルがあります:

/CN=john = John Doe <john.doe@myself.com>

svn clone を git すると、すべてが正常であるがファイルが複製されていないかのように、何も表示されませんでした。C:/Users/John/.suversion/serversで、neon-debug-mask = 256ログ エラーを表示するように設定しました。

エラーが表示されるようになりました:Author: /CN=john not defined in users.txt fileユーザー名に等しいため、git clone コマンドはデータを適切に解析できないと思います。

エスケープ/CN\=johnと引用を試みましたが、何も機能して'/CN=john' "/CN=john"いないようです。

誰もこれを処理する良い方法について考えを持っていますか?

ありがとうございました

4

4 に答える 4

2

同様の問題がありました。私が見つけた最善の回避策は、--authors-progオプションを使用して、svn ユーザー名を変換するスクリプトを指定することでした。

#!/usr/bin/perl

$svnAuthor = $ARGV[0];
if ($svnAuthor =~ /^.*?emailAddress=(.*?)\/CN=(.*?)\/.*$/) {
    print "$2 <$1>";
} else {
     print $svnAuthor;

}

これは次を使用して設定できます。

git config svn.authors-prog <authorScript>  
于 2014-07-29T09:45:34.997 に答える
2

git-svnは現在、ユーザー名に等号「=」が含まれる SVN ユーザーを処理できません。

内部からの関連コードはgit-svnのとおりです。

# '<svn username> = real-name <email address>' mapping based on git-svnimport:
sub load_authors {
            open my $authors, '<', $_authors or die "Can't open $_authors $!\n";
            my $log = $cmd eq 'log';
            while (<$authors>) {
                            chomp;
                            next unless /^(.+?|\(no author\))\s*=\s*(.+?)\s*<(.+)>\s*$/;
                            my ($user, $name, $email) = ($1, $2, $3);
                            if ($log) {
                                            $Git::SVN::Log::rusers{"$name <$email>"} = $user;
                            } else {
                                            $users{$user} = [$name, $email];
                            }
            }
            close $authors or croak $!;
}

...ご覧のとおり、ファイルからユーザー名を抽出するために使用される正規表現は、SVNユーザー名の一部として最初の「=」までのテキストのみを考慮します。それ以降はすべて、git ユーザー名の一部と見なされます。

これは のバグですgit-svn

私の頭の上から考えられる回避策:

  • その正規表現の最初は貪欲で、最後の非.+?貪欲であるべきだと思います。.+next unless /^(.+|\(no author\))\s*=\s*(.+?)\s*<(.+?)>\s*$/;
    • 修正パッチを git プロジェクトに送信できますか?
    • 今のところ、ローカルの git スクリプトにパッチを適用し、それをプロジェクトのセットアップ手順に含めることができます
  • コマンドにエイリアスを付けて、毎回オプションgit svnを含めることができます。--authors-prog.bash_profile
  • 各 git-svn コマンドの前に perl スクリプトを実行できますか? もしそうなら、$Git::SVN::Log::rusersまたは$users{$user}直接設定するperlコードを書くことができますか?
于 2014-07-28T10:34:29.533 に答える
1

users.txtを使用しないことで、最終的に解決策を見つけました。

まずgit svn clone -s https://path/to/my/repo ./、リポジトリからすべてのファイルを複製します。

ここgit logで、すべてのユーザーの醜い名前とメールを取得すると、それをきれいにしたいと思います。私は単にこの要点を使用して、git filter-branch --env-filter作成者とメールを検索して、要旨で提供したものに置き換えます。

リポジトリ内の各コミットをクロールする必要があり、リポジトリのブランチごとにスクリプトを起動する必要があるため、このソリューションには注意してください。

それが役に立てば幸い!

于 2013-05-22T10:12:35.693 に答える
1

私の解決策は、(一時的に) git-svn の load_authors サブルーチンにパッチを適用して、正規表現パターン\s=\s\s*=\s*. 次に、作成者ファイルのすべての行で、等号の前後にちょうど 1 つのスペースがあることを確認しました。古いユーザー名の等号の両側にスペースがなかったので、これは私にとってはうまくいきました。

于 2014-08-19T00:07:03.760 に答える