【发布时间】:2009-03-24 14:54:11
【问题描述】:
我正在使用 git-svn 存储一些 SVN 存储库的“暂存”版本,允许其他用户从该暂存存储库中提取并将更改提交回它,然后在暂存存储库上的提交是定期的提交上游SVN repo。
我想知道是否有办法在 git 提交者的姓名和 SVN 用户名之间进行映射,以便在提交回 SVN 存储库时保持他们的信息完整?
【问题讨论】:
我正在使用 git-svn 存储一些 SVN 存储库的“暂存”版本,允许其他用户从该暂存存储库中提取并将更改提交回它,然后在暂存存储库上的提交是定期的提交上游SVN repo。
我想知道是否有办法在 git 提交者的姓名和 SVN 用户名之间进行映射,以便在提交回 SVN 存储库时保持他们的信息完整?
【问题讨论】:
Vincent Danen 确实提到了the -A option when using git svn:
因此,使用 ~/git 作为 Git 存储库的顶级目录
[...]创建一个 authors.txt 文件。
此文件会将 Subversion 提交者的名称映射到 Git 作者,从而生成导入的 Subversion 存储库的正确历史记录。
对于提交者数量较少的项目,这很容易。对于有很多提交者的大型项目,这可能需要一些时间。该文件的语法是:
user = Joe User <user@example.com>
vdanen = Vincent Danen <vdanen@somewhere.com>
短名称是 Subversion 的提交者名称,而长格式是 Git 使用的用户全名和电子邮件地址。
最后一步是克隆 Subversion 存储库,它会基于它创建一个本地 Git 存储库。假设您的存储库使用 /trunk、/tags 和 /branches 标准,请使用:
# git svn clone --no-metadata -A authors.txt -t tags -b branches -T trunk https://svn.example.com/svn/repo
-A<filename>
--authors-file=<filename>
语法与 git-cvsimport 使用的文件兼容:
loginname = Joe User <user@example.com>
如果指定了此选项并且
git-svn遇到了作者文件中不存在的 SVN 提交者名称,则 git-svn 将中止操作。
然后,用户必须添加适当的条目。
在修改作者文件后重新运行之前的git-svn命令应该可以继续操作。
config key: svn.authorsfile
这应该适用于所有git-svn 命令,包括git-svn dcommit(当您将推送到 SVN 时)(注意:虽然我没有直接测试过)。
Mohammed Gamal 确实报告(在 cmets 中)它正在工作,但没有 --no-metadata 选项。
【讨论】:
file: 方案,但我注意到您使用的是https:。您在 Apache 中使用什么身份验证方法允许设置 svn:author?
第二种选择是提供解决映射的程序/脚本。
如果提交者的数量未知但可能从 SVN 提交者名称“生成”,则非常有用!
如果……作者文件中不存在的 SVN 提交者名称, git svn 将中止操作。然后用户必须添加适当的条目。在修改作者文件后重新运行之前的 git svn 命令……
所以,我们有:
--authors-prog=mapMyCompanyUsers.sh
为了不强制每个用户先签出/curl/wget'ting map-Script,您可以提供如下内容:
$(tmpMapFile="$TMPDIR/mapSvnUsersAutomatically.$$.sh" && echo -e '#!/bin/sh\necho $1" <"$1"@example.com>"' > $tmpMapFile && chmod +x $tmpMapFile && echo $tmpMapFile)
克隆将如下所示:
$ git svn clone -s --authors-prog=$(tmpMapFile="$TMPDIR/mapSvnUsersAutomatically.$$.sh" && echo -e '#!/bin/sh\necho $1" <"$1"@example.com>"' > $tmpMapFile && chmod +x $tmpMapFile && echo $tmpMapFile) https://svn.example.com/svn/repo/
这将强制所有映射完全相同,并且 SVN 克隆可能被“共享”并通过 git 合并!
【讨论】: