2013-05-22 75 views
3

我试图从SVN切换到Windows 7上使用的git命令git svn clone作者姓名。的Git SVN克隆包含“/ CN = MYNAME”

在我的仓库之一,我试试这个:

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

这里是我的users.txt文件:

/CN=john = John Doe <[email protected]> 

当我的Git是显示SVN克隆什么,就像如果一切好的,但没有文件被克隆。所以在C:/Users/John/.suversion/servers我已经设置了neon-debug-mask = 256来显示日志错误。现在显示

我的错误:Author: /CN=john not defined in users.txt file,所以我认为,因为在我的用户名相同的混帐克隆命令不能正确解析DATAS。

我试过转义/CN\=john和引用'/CN=john'"/CN=john"但似乎没有任何工作。

有没有人有一个好办法来处理这个想法?

谢谢

+0

我找到了一种不使用users.txt的方法,并使用git svn clone -s https:// path/to/my/repo。/来克隆它。但是,如果我做了'git log'作者就像'作者:C:/ Program Files/Git/CN = john phemios

+0

对作者有类似的问题用'hypenated-name'。在我的情况下,它是由于解析问题导致的,因为我试图省略电子邮件。所以我只是伪造了电子邮件地址,并声称。 –

回答

1

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

首先我做一个git svn clone -s https://path/to/my/repo ./其中每个文件从存储库复制。

现在,如果我做一个git log我有丑陋的姓名和电子邮件为每个用户,我想以清洁工作。我简单地使用了this gist,它的作用是git filter-branch --env-filter,搜索&取代您在要点中提供的作者和邮件。

当心这种解决方案,因为它具有爬在你的仓库每一次提交,你必须启动脚本资源库的每一个分支。

希望它有帮助!

+0

Upvoted,因为有时你只需要做schtuff工作,你知道吗? –

2

git-svn目前不能处理它有一个等号“=”,在他们的用户名登录SVN用户。

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 $!; 
} 

...你可以看到,用于从文件中提取用户名会考虑正则表达式只有文字到第一个“=”作为其一部分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}
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> 
0

我的解决方案设置是(临时)补丁的git - svn的的load_authors子程序所以正则表达式有\s=\s,而不是\s*=\s*。然后,我只是确保我的作者文件中的所有行在每边都有一个围绕我等号的空格。这对我很有用,因为旧用户名中的等号不会在双方都有空格。