Git svn克隆,作者名称如“/ CN = myname”

时间:2013-05-22 08:34:41

标签: git git-svn

我正在尝试使用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 个答案:

答案 0 :(得分:2)

git-svn目前无法处理具有等号的SVN用户&#34; =&#34;在他们的用户名中。

Here is来自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 $!;
}

...正如您所看到的,用于从文件中提取用户名的正则表达式将只考虑第一个&#34; =&#34;作为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代码吗?

答案 1 :(得分: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>  

答案 2 :(得分:1)

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

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

现在,如果我做了git log我为每个用户提供了丑陋的名字和邮件,我想要清理它。我只使用了this gist git filter-branch --env-filter来搜索&amp;用你在要点中提供的作者和邮件替换作者和邮件。

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

希望它有所帮助!

答案 3 :(得分:0)

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