« 日記 |Main| 日記 »

« グローバルよりも広いもの | Python | Pythonでイテレータの復習 »

Subversionへの新規importをちょっと楽にするスクリプト

Windowsでの話です。UNIX系ならもっと簡単に自動化できるでしょうから。

まず、ページ末のスクリプトを適当な場所に保存します。ここでは「C:\Home\Projects\svnHelper\svnImporter.py」にしたとします。3行目のREPO_POSの値で指定されたフォルダの下にリポジトリが作成されるので、自分の環境に合わせて修正してください。

次に

python C:\Home\Projects\svnHelper\svnImporter.py %1
pause

と書かれた「.bat」で名前の終わるファイルを作成し、SendToフォルダに入れます。SendToがどこにあるかわからない人は「名前を指定して実行」で「SendTo」と入力してください。なお、このファイルの1行目はもちろんスクリプトをどこに保存したかによって変わるので、自分が保存した位置を指定してください。Pythonにパスが通っていない人は通してください(Thinkpadユーザーは最初から通っています。)

さて、これで準備は完了です。

リポジトリに入れたい物が入ったフォルダを右クリックし、「送る」メニューから先ほどのbatファイルを選びます。 そうすると、そのフォルダ(仮にMyProjectとする)は「__svn__MyProject」という名前に変更され、MyProjectという名前のリポジトリが作成され、__svn__MyProjectの中身がインポートされ、MyProjectというフォルダが改めて作成されて、そこへチェックアウトされます。つまり全部つつがなく終わると、MyProjectはSubversionで管理されているフォルダに変化し、__svn__MyProjectというコピーがあるという状態になります。

__svn__MyProjectを自動的に削除しないのは、もし不測の事態でインポートがうまく行かなくても、(または実行した後でやっぱりバージョン管理したくないと思っても)、従来のファイルは__svn__MyProjectにそのままの形で残っているのでそれに戻せる、という一種の保険です。

なお、リポジトリに入れたくない物がフォルダの中にある場合にそれを除外してインポートするちょっとしたテクニックがあります。

まず、ゴミ箱を空にします。次にMyProjectの中のリポジトリに入れたくない物をゴミ箱に入れます。それからインポートを行うと、同じフォルダ名で「バージョン管理されたフォルダ」が出来るので、ゴミ箱の中身を全部選んで「元に戻す」をすれば、それらはバージョン管理されていない状態のままバージョン管理されたMyProjectフォルダに戻ります。後は、そのまま放置してもいいですし、右クリックのTortoiseSVNメニューから「Add to ignore list」を選んでもいいです。

import sys, os

REPO_POS = "E:/svnRepository"

target = sys.argv[1]
if os.path.isdir(target):
    (path, dirname) = os.path.split(target)
    tmpDir = os.path.join(path, "__svn__" + dirname)
    os.rename(target, tmpDir)
    repoPos = REPO_POS + "/" + dirname
    os.system('svnadmin create "%s"' % repoPos)
    os.system('svn import "%s" "file:///%s" -m "imported by svnImporter.py"' % (tmpDir, repoPos))
    os.mkdir(target)
    os.system('svn checkout "file:///%s" "%s"' % (repoPos, target))

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/230

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.