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

时间:2012-03-02 21:41:59

标签: git svn

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

svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq

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

svn: E155007: '/var/subversion/' is not a working copy

2 个答案:

答案 0 :(得分:28)

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

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

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

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

答案 1 :(得分:0)

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

注意:仅显示运行订单项1的用户列表。

将SVN REPO转换为GIT REPO

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

 $ 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

这将抓取所有日志消息,拔出用户名,消除所有重复的用户名,对用户名进行排序,然后将其放入“ authors-transform.txt”文件中,现在编辑文件中的每一行,例如,转换:

username = username <username>

对此:

 username = Firstname Lastname <username@example.com>

2。使用git-svn

克隆Subversion存储库
git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

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

cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

4。将存储库推送到裸露的git存储库 首先,创建一个裸仓库,使其默认分支与svn的“ trunk”分支名称匹配。

git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk

cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare

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

5。将“ trunk”分支重命名为“ master” 您的主要开发分支将被命名为“ trunk”,与Subversion中的名称相匹配。您需要使用以下命令将其重命名为Git的标准“ master”分支:

cd ~/new-bare.git
git branch -m trunk master

6。清理分支和标签 git-svn将所有Subversions标签转换为Git中非常短的分支,形式为“标签/名称”。您需要使用以下方法将所有这些分支转换为实际的Git标签:

cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
   git tag "$ref" "refs/heads/tags/$ref";
   git branch -D "tags/$ref";
done

7。将裸存储库移至中央远程存储库 如何将本地裸仓库移至gitolite仓库的示例:

mv new-bare.git repository_name.git
tar czvf repository_name.git.tar.gz repository_name.git/
scp repository_name.git.tar.gz remote_host:
ssh remote_host
tar xzvf repository_name.git.tar.gz
sudo chown -R git:staff repository_name.git/
cd repository_name.git/
find . -type f -exec chmod go= {} \;  # remove group and world permissions
find . -type d -exec chmod go= {} \;  # remove group and world permissions
cd ../
mv repository_name.git /Users/git/repositories/

8。克隆新的本地副本

mv old-svn-copy old-svn-copy.backup
git clone git@remote_host:repository_name.git

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

cd old-svn-copy.backup
git clean -dXn  # Using this command because the old copy was a git-svn clone
cp example-file.txt ../repository_name/  # copy all files and directories from the list that you need in the new local git repository

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

9。完成。

来源here