首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用svn用户名的git svn dcommit

使用svn用户名的git svn dcommit
EN

Stack Overflow用户
提问于 2011-03-16 23:52:42
回答 6查看 4.5K关注 0票数 24

我正在尝试在一个较旧的subversion存储库上使用git。我们有多个用户在使用新的git remote (源/主),它是旧存储库的git svn克隆。问题是,当我们执行git svn dcommit将更改从新的git存储库推送到旧的subversion存储库时,提交者的用户名将丢失,取而代之的是git svn克隆的用户信息。有没有办法在dcommit时将提交者的信息保存到subversion中?

EN

回答 6

Stack Overflow用户

发布于 2011-05-10 03:00:32

您可以将git-svn与--add-author-from--use-log-author一起使用。前者在提交消息的From:行中表示git作者,后者进行反向转换。

也就是说,repository formats matter,subversion存储库格式比git格式差。它不支持很好地合并,也不支持提交者与作者或提交时间与推送时间不同。git-svn可以在本地获得git,但它不能对数据模型做太多事情。希望您能够迁移到git存储库,可能使用svn前端(目前有git-svnserver和github的闭源选项)。

票数 5
EN

Stack Overflow用户

发布于 2014-07-11 21:11:57

我知道这是一个非常古老的话题,但如果有人感兴趣,我将这个技巧添加到我的本地git-svn副本中:

代码语言:javascript
复制
23a24
> use POSIX qw/strftime/;
984a986
>           my $ra = Git::SVN::Ra->new($url);
987c989
<                           ra => Git::SVN::Ra->new($url),
---
>                           ra => $ra,
995a998,1014
>                                  my $cmt_author = get_commit_entry($d)->{author};
>                                  my $cmt_date   = get_commit_entry($d)->{date};
>                                  if ( defined $cmt_author ) {
>                                    foreach my $key ( keys %users ) {
>                                      my $i = index($cmt_author, $users{$key}[1]);
>                                      if ( $i != -1 ) {
>                                        print "Changed author to $key\n";
>                                        $ra->change_rev_prop($cmt_rev, 'svn:author', $key);
>                                        last;
>                                      }
>                                    }
>                                  }
>                                  if ( defined $cmt_date ) {
>                                    $cmt_date = strftime("%Y-%m-%dT%H:%M:%S.000000Z", gmtime($cmt_date));
>                                    print "Changed date to $cmt_date\n";
>                                    $ra->change_rev_prop($cmt_rev, 'svn:date', $cmt_date);
>                                  }
1758c1777
<   my %log_entry = ( log => '', tree => get_tree_from_treeish($treeish) );
---
>   my %log_entry = ( log => '', tree => get_tree_from_treeish($treeish), author => undef, date => undef );
1768a1788
>       my $date;
1774c1794,1797
<               $author = $1 if (/^author (.*>)/);
---
>           if (/^author (.*>) (\d+) ([\-\+]?\d+)$/o) {
>                 $author = $1;
>               $date   = Git::SVN::Log::parse_git_date($2, $3);
>         }
1792a1816,1817
>       $log_entry{author} = $author || undef;
>       $log_entry{date}   = $date   || undef;

这是针对1.9.1-1 ( Ubuntu 14.04上的deb包版本)。它是不可配置的,因为如果你有一个users.txt文件,它将使用它,并且总是试图设置日期。同样,如果你有多个SVN账户给一个给定的git用户,它只会选择一个。

我刚刚开始在愤怒中使用它,但我认为它可能会完成这项工作,祈祷吧!

向Adam致敬

票数 1
EN

Stack Overflow用户

发布于 2014-10-10 04:40:46

我对Adam Sutton提出的补丁做了一些修改,以便git svn dcommit接受--commit-author选项:

代码语言:javascript
复制
--- ./git-svn.orig  2014-10-09 23:11:40.032767542 +0300
+++ ./git-svn   2014-10-09 23:27:58.252753020 +0300
@@ -116,7 +116,7 @@
    $_before, $_after,
    $_merge, $_strategy, $_preserve_merges, $_dry_run, $_parents, $_local,
    $_prefix, $_no_checkout, $_url, $_verbose,
-   $_commit_url, $_tag, $_merge_info, $_interactive);
+   $_commit_url, $_commit_author, $_tag, $_merge_info, $_interactive);

 # This is a refactoring artifact so Git::SVN can get at this git-svn switch.
 sub opt_prefix { return $_prefix || '' }
@@ -194,6 +194,7 @@
              'dry-run|n' => \$_dry_run,
              'fetch-all|all' => \$_fetch_all,
              'commit-url=s' => \$_commit_url,
+             'commit-author=s' => \$_commit_author,
              'revision|r=i' => \$_revision,
              'no-rebase' => \$_no_rebase,
              'mergeinfo=s' => \$_merge_info,
@@ -982,6 +983,7 @@
                                             $rewritten_parent);
            }

+           my $ra = Git::SVN::Ra->new($url);
            my %ed_opts = ( r => $last_rev,
                            log => get_commit_entry($d)->{log},
                            ra => $ra,
@@ -993,6 +995,10 @@
                            editor_cb => sub {
                                   print "Committed r$_[0]\n";
                                   $cmt_rev = $_[0];
+                                  if (defined($_commit_author)) {
+                                    print "Changed author to $_commit_author\n";
+                                    $ra->change_rev_prop($cmt_rev, 'svn:author', $_commit_author);
+                                  }
                            },
                    mergeinfo => $_merge_info,
                            svn_path => '');
@@ -1790,6 +1796,7 @@
        }
        print $log_fh $msgbuf or croak $!;
        command_close_pipe($msg_fh, $ctx);
+       $log_entry{author} = $author || undef;
    }
    close $log_fh or croak $!;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5327924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档