4

我正在尝试使用git svn clone命令在 Windows 7 上从 svn 切换到 git。

在我的一个存储库中,我尝试这样做:

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>

当我 git svn clone 什么都没有显示,就像一切正常但没有文件被克隆一样。所以在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

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 脚本吗?如果是这样,您可以编写perl代码设置$Git::SVN::Log::rusers还是$users{$user}直接?
于 2014-07-28T10:34:29.533 回答
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 回答
1

我终于找到了不使用 users.txt 的解决方案。

首先,我git svn clone -s https://path/to/my/repo ./从存储库中克隆每个文件。

现在,如果我这样做git log,每个用户的名字和邮件都很难看,我想清理它。我只是使用了这个 gistgit filter-branch --env-filter搜索和替换你在 gist 中提供的作者和邮件。

请注意此解决方案,因为它必须抓取存储库中的每个提交,并且您必须为存储库的每个分支启动脚本。

希望能帮助到你!

于 2013-05-22T10:12:35.693 回答
1

我的解决方案是(暂时)修补 git-svn 的 load_authors 子例程,因此正则表达式模式有\s=\s而不是\s*=\s*. 然后,我只是确保我的作者文件中的所有行在每一侧的等号周围都有一个空格。这对我有用,因为旧用户名中的等号两边都没有空格。

于 2014-08-19T00:07:03.760 回答