获取Subversion的SVN用户列表 - > Git migration?

xre*_*ref 23 svn git

我一直在查看一些SVN - > Git迁移,他们都提到在迁移之前获取正确的用户列表,特别是通过使用命令:

svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq
Run Code Online (Sandbox Code Playgroud)

我可以访问托管单个存储库的Ubuntu服务器(包含9个项目),但本地没有SVN安装.是否可以在服务器上运行该命令以获取用户名列表?目前它只是回报错误:

svn: E155007: '/var/subversion/' is not a working copy
Run Code Online (Sandbox Code Playgroud)

Ric*_*sen 29

将路径作为URL传递到存储库:

svn log -q file:///var/subversion | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果您需要按照第一次提交的时间顺序列出作者列表(我发现从svn转换为git时有用一次),您可以执行以下操作:

svn log -q -r 1:HEAD url://to/repo | grep '^r' | awk -F'|' '!x[$2]++{print$2}'
Run Code Online (Sandbox Code Playgroud)


Tyl*_*rty 6

请参阅以下说明将 SVN 存储库转换为 git 存储库

\n\n

注意:要仅查看用户列表,请运行行项目 1。

\n\n

将 SVN 存储库转换为 GIT 存储库

\n\n

1. 检索所有 Subversion 提交者的列表

\n\n
 $ svn log -q https://svn.example.com/repository_name | awk -F \'|\' \'/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}\' | sort -u > authors-transform.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将抓取所有日志消息,取出用户名,消除任何重复的用户名,对用户名进行排序并将它们放入“authors-transform.txt\xe2\x80\x9d 文件中。现在编辑文件中的每一行。例如, 转变:

\n\n
username = username <username>\n
Run Code Online (Sandbox Code Playgroud)\n\n

进入这个:

\n\n
 username = Firstname Lastname <username@example.com>\n
Run Code Online (Sandbox Code Playgroud)\n\n

2. 使用 git-svn 克隆 Subversion 存储库

\n\n
git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp\n
Run Code Online (Sandbox Code Playgroud)\n\n

3. 将 svn:ignore 属性转换为 .gitignore \n如果您的 svn 存储库使用 svn:ignore 属性,您可以使用以下命令轻松地将其转换为 .gitignore 文件:

\n\n
cd ~/temp\ngit svn show-ignore > .gitignore\ngit add .gitignore\ngit commit -m \'Convert svn:ignore properties to .gitignore.\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

4. 将存储库推送到裸 git 存储库\n首先,创建一个裸存储库并使其默认分支匹配 svn\xe2\x80\x99s "trunk\xe2\x80\x9d 分支名称。

\n\n
git init --bare ~/new-bare.git\ncd ~/new-bare.git\ngit symbolic-ref HEAD refs/heads/trunk\n\ncd ~/temp\ngit remote add bare ~/new-bare.git\ngit config remote.bare.push \'refs/remotes/*:refs/heads/*\'\ngit push bare\n
Run Code Online (Sandbox Code Playgroud)\n\n

您现在可以安全地删除 ~/temp 存储库。

\n\n

5. 将“trunk”分支重命名为“master” \n您的主开发分支将被命名为“trunk\xe2\x80\x9d”,与 Subversion 中的名称相匹配。您\xe2\x80\x99 将希望将其重命名为 Git\ xe2\x80\x99s 标准“master\xe2\x80\x9d 分支使用:

\n\n
cd ~/new-bare.git\ngit branch -m trunk master\n
Run Code Online (Sandbox Code Playgroud)\n\n

6. 清理分支和标签\ngit-svn 使所有 Subversions 标签在 Git 中变成非常短的分支,格式为“tags/name\xe2\x80\x9d”。您\xe2\x80\x99 将想要转换所有这些分支使用以下命令进入实际的 Git 标签:

\n\n
cd ~/new-bare.git\ngit for-each-ref --format=\'%(refname)\' refs/heads/tags |\ncut -d / -f 4 |\nwhile read ref\ndo\n   git tag "$ref" "refs/heads/tags/$ref";\n   git branch -D "tags/$ref";\ndone\n
Run Code Online (Sandbox Code Playgroud)\n\n

7. 将裸存储库移动到中央远程存储库\n如何将本地裸存储库移动到 gitolite 存储库的示例:

\n\n
mv new-bare.git repository_name.git\ntar czvf repository_name.git.tar.gz repository_name.git/\nscp repository_name.git.tar.gz remote_host:\nssh remote_host\ntar xzvf repository_name.git.tar.gz\nsudo chown -R git:staff repository_name.git/\ncd repository_name.git/\nfind . -type f -exec chmod go= {} \\;  # remove group and world permissions\nfind . -type d -exec chmod go= {} \\;  # remove group and world permissions\ncd ../\nmv repository_name.git /Users/git/repositories/\n
Run Code Online (Sandbox Code Playgroud)\n\n

8.克隆新的本地副本

\n\n
mv old-svn-copy old-svn-copy.backup\ngit clone git@remote_host:repository_name.git\n
Run Code Online (Sandbox Code Playgroud)\n\n

列出旧本地 svn 存储库中所有未版本控制的文件,并将它们复制到新的本地 git 存储库:

\n\n
cd old-svn-copy.backup\ngit clean -dXn  # Using this command because the old copy was a git-svn clone\ncp example-file.txt ../repository_name/  # copy all files and directories from the list that you need in the new local git repository\n
Run Code Online (Sandbox Code Playgroud)\n\n

您现在可以将本地 svn 副本备份移至垃圾箱。在确定一切正常之前,最好不要清空垃圾箱。

\n\n

9. 完成。

\n\n

来源在这里

\n