こんにちは〜。hiraufujiです。なんだか最近寒いですね><
フォルダをコピペするだけの簡単なお仕事です
symfonyを使ってバリバリ開発をする日々をおくっていますが、ある日、こんな事がありました。
【こんなタスクが降って来た】
svn管理下にあるPCサイト用のmodule(action、template、validate用yml etc…)を、携帯サイト用にまるっとコピーしてコミットしてください。
【svn管理下のフォルダのコピー怖い】
askeetのくだりで、svn管理下のフォルダをコピペしまくってsvnを壊して、もうもうどうにもならなくなって泣く泣くやり直した覚えがあります…。
それからというもの、svn管理下のコピペが怖い(p_q)
【いやまて罠だ罠だ】
いや、しかし、何かいい方法があるはずだ。
全フォルダ mkdir して、全ファイルの中身を全選択してコピペする簡単なお仕事なんて、そんな鬼タスクがあってたまるか!
ということで色々と試してみました。
svn管理下のフォルダのコピー方法 まとめ
【GUI、コマンドラインで cp コマンドでコピペ】
まず、お目当てのフォルダを、今の気分の方法ですみやかにコピーします。
コマンドライン上では、こんな感じです。
$ cp -r apps/pc/modules/hoge apps/mobile/modules/hoge
コピーされたフォルダは、? 状態にあります。
$ ? apps/mobile/modules/hoge
ここで add してコミットして終了…といきたいところですが、焦らないで下さい。それではsvnさんの思うつぼです。
$ svn add apps/mobile/modules/hoge $ svn: 警告: 'apps/mobile/modules/hoge' は既にバージョン管理下におかれています
こんにゃろめー!
svnさんの機嫌を損ねず add するためには、add したいフォルダ以下の、.svnフォルダをしれっと削除しましょう。
$ rm -rf apps/mobile/modules/hoge/.svn $ rm -rf apps/mobile/modules/hoge/actions/.svn $ rm -rf apps/mobile/modules/hoge/config/.svn $ rm -rf apps/mobile/modules/hoge/lib/.svn $ rm -rf apps/mobile/modules/hoge/templates.svn …
これでsvnさんのご機嫌とりは完了です。素直に add させてくれます。
$ svn add apps/mobile/modules/hoge $ A apps/mobile/modules/hoge …
やったね!
【svn cp、svn mv コマンドでコピペ】
svnコマンドの中に、それとなくそれっぽいコマンドが用意されています。
svn cp(copy)と、svn mv(move)です。
svn cp コマンドを使えば、svn管理下のフォルダを簡単にコピーできます。
$ svn cp -r apps/pc/modules/hoge apps/mobile/modules $ A + apps/mobile/modules/hoge
しかし、svn cp コマンドでコピーしたフォルダの名前を変更すると…。
なんだかとても嫌ぁ〜な感じになってしまいます。
$ ! + apps/mobile/modules/hoge $ ? apps/mobile/modules/mobile_hoge
そして、案の定怒られました。
$ svn add apps/mobile/modules/mobile_hoge $ svn: 警告: 'apps/mobile/modules/mobile_hoge' は既にバージョン管理下におかれています
svn cpコマンドを使って、フォルダを、名前を変更しつつコピーしたい場合は、以下の2つの方法があります。
1.svn cpコマンドのみ
$ svn cp apps/pc/modules/hoge apps/mobile/modules/mobile_hoge $ A + apps/mobile/modules/mobile_hoge
2.svn cp、svn mvあわせ技
$ svn cp apps/pc/modules/hoge apps/mobile/modules $ A + apps/mobile/modules/hoge $ svn mv apps/mobile/modules/hoge apps/mobile/modules/mobile_hoge $ A apps/mobile/modules/mobile_hoge $ D apps/mobile/modules/hoge
やったね!
svn管理下のフォルダのコピペで、svnさんのご機嫌をそこね、コミット前の作業を泣く泣くやり直す…。
全国の新人プログラマが、一度は通る道だと思います。(少なくとも、happy5は全員通りました)
そんな、全国の悩める新人プログラマさんたちのために、この記事を残します。
いつの日か、どこかで、誰かの役にたつと嬉しいです。

by chari, on 02.26.09 @ 5:08 PM
一応もう一つコピペ方法がありますよ。
1.svn exportでリポジトリをエクスポート
2.エクスポートしたディレクトリのお好きなものをsvnの作業コピーにコピペ
svn exportだとリポジトリ内の.svnが無い状態のものが作られますので自由に使えるかもしれんです。
by hirafuji, on 02.27.09 @ 12:37 PM
>chariさん
コメントありがとうございます!
svn export なんてコマンドがあったんですね。
しかも、ものすごく簡単そうですね。svn export 使わせていただきますです!
参考になるコメント、ありがとうございました!今後とも色々教えてください、よろしくお願いします!
by hnw, on 02.27.09 @ 2:19 PM
カレントディレクトリ以下の.svnってディレクトリを全部消すんだったら
find . -type d -name .svn | xargs rm -rf
とかやれば一発でできますよ。xargsは難敵なので、まずは
rm -rf `find . -type d -name .svn`
くらいでも良いかも。ディレクトリが多すぎると動きませんけどね。あと、いきなりrmして取り返しがつかないことになると危ないので、rmする前にechoすることをオススメします。
echo rm -rf `find . -type d -name .svn`
とかすれば、今からどんなコマンドを実行しようとしているか見ることができます。
by hirafuji, on 02.27.09 @ 8:27 PM
>hnwさん
コメントありがとうございます!
今まさに「一発で消す方法ないかな〜」と思っていたところでしたので、ものすごく参考になりました。そうやってあげればよかったんですね!
チマチマ削除していた自分が残念です…もう少し早く知りたかった…。
そして、コマンドを echo なんてできるんですね!削除するディレクトリを確認できていいですね。知りませんでした。
たくさんのアドバイスありがとうございます。今後とも、もっともっと色んなアドバイスいただけると嬉しいです。よろしくお願いします!
by tumf, on 03.01.09 @ 6:22 PM
hnwさん:
rm -rf `find . -type d -name .svn`
exec使いましょうよ(w
find . -type d -name .svn -exec rm -rf {} \;
by hnw, on 03.20.09 @ 9:48 AM
何事も順番が大事だと思うんですよね。findの-execも大事ですけど、xargsと同様にわかりにくいと思います。もしバッククォートによる展開を一度も使ったことがないなら、まずはそこをマスターして欲しいな、と思うんですよね。