宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
アドオンの開発にはずっと須藤さんに用意してもらったSubversionのリポジトリを使ってたんだけど、
と思っていて、Git(あるいは他の分散型バージョン管理システム)ならそれが解消されると期待してて、でもずっと移行できていなかった。
というのがその理由だった。でも
という事で、思い切って移行してみる事にしました。具体的な手順はSourceForge.JP のプロジェクトを Subversion から Git へ移行するに従いました。
大まかに言うとこういう事だと僕は理解してる。
ツリー型タブのSubversionリポジトリをgithub上の同名のリポジトリに移行する手順を振り返ってみる。
$ git svn clone --prefix svn/ -s https://www.cozmixng.org/repos/piro/treestyletabこれでローカルにtreestyletabという名前のディレクトリができて、これがGitリポジトリになってる。コミットを1件1件取り込むので、コミット数が多いとメチャメチャ時間がかかるけど、黙って待つ。たまに失敗するので、そういう時はできたゴミディレクトリを消してもう一度やり直す。
$ git remote add origin git@github.com:piroor/treestyletab.gitこれによって、「このリポジトリはgithubのリポジトリをcloneした物ですよ」「このリポジトリに行われた変更を元のリポジトリにpushする時は、githubにpushしますよ」ということになる。
$ git push origin masterこれで、Subversionのリポジトリから持ってきたコミット履歴が全部github上のリポジトリに反映される。
$ git branch -rこれでブランチの一覧を見れるので、
$ git checkout svn/tags/0.10.2010102501という風にしてブランチを切り替えて
$ git tag 0.10.2010102501でタグを打って
$ git push --tags originでタグの情報をgithubのリポジトリにpushする。タグの数だけこの操作を繰り返す。
$ git checkout svn/my-branchでブランチを切り替えて
$ git branch my-branchで普通のブランチとして切り直して
$ git push origin my-branch:my-branchでgithubにpushする。
自分はアドオンの数自体20個以上あるし、それぞれアホみたいに何度もリリースしててタグの数がハンパないことになってるので、全部手動でやることを考えたら気が遠くなりました。なのでこういうスクリプトをRubyで書いてみました。
#!/usr/bin/ruby
SVN_REPOSITORY_PATH = "https://www.cozmixng.org/repos/piro/<%= src_project_name %>"
GIT_REPOSITORY_PATH = "git@github.com:piroor/<%= dest_project_name %>.git"
$LOAD_PATH.unshift(File.dirname(__FILE__))
require "fileutils"
require "erb"
require "shellwords"
def main
ARGV.each do |arg|
p "process #{arg}"
args = arg.split(":")
src_project_name = args[0]
dest_project_name = args.size > 1 ? args[1] : args[0]
svn_to_git(src_project_name, dest_project_name)
end
end
def svn_to_git(src_project_name, dest_project_name)
p "svn:#{src_project_name}, git:#{dest_project_name}"
clone(src_project_name)
push(src_project_name, dest_project_name)
push_branches_and_tags(src_project_name)
rescue Exception
p $!
end
def clone(src_project_name)
result = run("git", "svn", "clone",
"--prefix", "svn/",
"-s", ERB.new(SVN_REPOSITORY_PATH).result(binding).chomp)
p result.to_s
raise Exception.new("clone of #{src_project_name}, #{result.to_s}") unless result.to_s.include?("Checked out HEAD:")
end
def push(src_project_name, dest_project_name)
FileUtils.cd(src_project_name) do
result = run("git", "remote", "add",
"origin", ERB.new(GIT_REPOSITORY_PATH).result(binding).chomp)
p result.to_s
result = run("git", "push", "origin", "master")
p result.to_s
raise Exception.new("push of #{src_project_name}, #{result.to_s}") unless result.to_s.include?("master -> master")
end
end
def push_branches_and_tags(src_project_name)
FileUtils.cd(src_project_name) do
branches = run("git", "branch", "-r")
branches = branches.to_s.split("\n")
branches.each do |branch|
next unless branch.include?("svn/")
branch.strip!
name = branch.split("svn/")[1]
next if name == "trunk"
if name.include?("tags/")
tag = branch.split("tags/")[1]
p run("git", "checkout", branch)
p run("git", "tag", tag)
p run("git", "push", "--tags", "origin")
else
p run("git", "checkout", branch)
p run("git", "branch", name)
p run("git", "push", "origin", "#{name}:#{name}")
end
end
end
end
def run(*args)
command_line = Shellwords.shelljoin(args)
result = `#{command_line} 2>&1`
result
end
main
ファイル名は svn-to-git.rb として、
$ ./svn-to-git.rb treestyletab
とやると、ここまでの手順のうちgithubのサイト上でリポジトリを作る所以外を全部自動でやってくれるという物です(ということは、スクリプトの実行前にあらかじめgithubのサイト上でリポジトリを作っておかないといけない)。これでなんとか全部のリポジトリをgithubに持ってくることができました。XUL/Migemoの辞書をSQLiteにしてみようとかそういうブランチを切ってた物が取り込めてなかったり、svn:externalsで参照してた物が入ってなかったり、Subversionに突っ込んでから1回もコミットしてないプロジェクトをまだgithubに持ってきてなかったり(必要あるの? 無いよね?)という課題は残っていますが。→ブランチの取り込み方が分かったので追記しました。→svn:externalsの移行は諦めてsubmoduleにすることにしました。TortoiseGitでメニューから「Submodule Add」を選んでリポジトリにgit@github.com:piroor/makexpi.gitを、パスにbuildscriptを指定する、という手順でだいたい同じような結果になるみたい。更新の時はTortoiseGitだと「Git Sync」から「Submodule Sync」しないといけないようだ。コマンドラインなら一発で更新できるようなんだけど……
今後はgit-svn駆け込み寺あたりを熟読して頑張っていきたいと思っております。あと、今後具体的にコードを提供してくれるような人がもしいれば、githubの方にpull requestっていうんですか?するようにしてもらえたら幸いです。
……というまとめエントリを書こうとしてもうちょっと調べ直してたら、git-svnでタグが自動で取り込まれないとかの問題を解消するラッパーのsvn2gitという物があるということを今更知りました。ギャフン!!!!!
……さらに後から気がついたけど、HTTPでアクセスできる公開のSubversionリポジトリをgithubに移行するだけならtagやbranchの変換も含めてgithubのWebインターフェース上の機能だけでサクッとできてしまうことが分かりました。ギャフンギャフン!!!!!!!!! 手順は以下の通りです。
最初githubのUIを英語で使ってたのと、下までスクロールしてなかったから気がついてなかった。なんということでしょう。丸1日以上を無駄にしてしまいました。
の末尾に2020年11月30日時点の日本の首相のファミリーネーム(ローマ字で回答)を繋げて下さい。例えば「noda」なら、「2010-11-01_git.trackbacknoda」です。これは機械的なトラックバックスパムを防止するための措置です。
writeback message: Ready to post a comment.