我正在使用 git-svn 存储一些 SVN 存储库的“登台”版本,允许其他用户从该登台存储库中提取并将更改提交回它,然后在登台存储库上的提交定期提交到上游SVN 回购。
我想知道是否有办法在 git 提交者的姓名和 SVN 用户名之间进行映射,以便在提交回 SVN 存储库时保持他们的信息完整?
Vincent Danen在使用 git svn 时确实提到了 -A 选项:
因此,使用 ~/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确实报告(在评论中)它正在工作,但没有--no-metadata
选项。
第二种选择是提供解决映射的程序/脚本。
如果提交者的数量未知但可能是从 SVN 提交者名称“生成”的,则非常有用!
如果…作者文件中不存在的 SVN 提交者名称,git svn 将中止操作。然后用户必须添加适当的条目。在修改作者文件后重新运行之前的 git svn 命令……</p>
所以,因此我们有:
--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 合并!