とりあえず、GUIでリポジトリを確認できると便利だと思うので、git svnしたリポジトリを
SourceTreeで扱えるか試してみた。
SourceTreeのダウンロードはここ。
インストールは簡単に終わると思います。
念のため、改行なんちゃらのオプションは無効にしました。

とりあえず、この前git svn cloneしたローカルのリポジトリを開いてみました。
ファイル → 開く

特に何も問題はなさそうです。
ローカルブランチもリモートのブランチもちゃんと表示されてますし。
pullはどうでしょう?

おおお!
ちゃんとリモートがSubversionであることを認識してくれているようです。
checkout(ブランチの切り替え)、fetch、 pullを試してみた感じでは特に何も問題はなさそうです。
とりあえず、GUIで素早く履歴を確認できるようになっただけでも便利だと思います。
でも念のため、まだcommit と dcommitはコマンドラインからしておこうかな。。。
たぶん、何も問題は起こらないだろうけどね。
前回はSubversionのリポジトリが一般的なディレクトリ構成をしている場合のgit svn cloneを試してみました。
が、プロジェクトによってはディレクトリ構成が一般的では無い場合もあると思います。
まだ、自分自身もよく分かってませんが、とりあえず実験だけしてみましょう。。。
●ディレクトリ構成
repo_url/
branches/
conf/
controllers/
models/
public/
こんな感じでtrunkというディレクトリは無くて、トップディレクトリがtrunkになっていて
そのなかにbranchがある例です。
●git svn cloneする時に適切なオプションを渡す
明示的にトップディレクトリがtrunkであることとbranchesのディレクトリの場所を指定してあげました。
shell > git svn clone --trunk= --branches=branches http://sabakan.org/svn/git_svn_test2 git_svn_test2
Initialized empty Git repository in /c/Documents and Settings/taka/Documents/projects/msys2_test/git_svn_test2/.git/
A docs/assets/css/combined.css
A docs/assets/fonts/BebasNeue-webfont.eot
うーん?
なんとなく前回と動きが違うような気がしますね。。。。
とりあえず、気にしない!!
●ブランチの確認をしてみましょう
shell > git branch -a
* master
remotes/origin/20160101_new_year_event
remotes/origin/trunk
ちゃんと、trunkとbranchesの認識はしてくれている感じ?
●作業ブランチの作成、ファイルの編集、trunkにマージ、リモートへコミット
とりあえず、作業ブランチを作成して、ファイルを編集してtrunkにマージという
シチュエーションを想定してテストしてみますか。
masterブランチに切り替え
shell > git checkout master
masterブランチから作業ブランチを作成
shell > git checkout -b master_bug
作業ブランチのファイルを修正、コミット。
shell > vim public/index.php
shell > git add .
shell > git commit -m "マスターのバグ修正"
マスターへ作業ブランチの修正を取り込む(もしかして、やりかたが怪しい?
shell > git svn rebase
shell > git svn dcommit
うーん。。。
特に何も問題はなさそうですね。。。
もう少し実験する必要はありそうですが。。。
今回はgit svnでブランチの扱いやマージのやり方等を学んでみましょう。
使用するコマンドは基本的に普通のgitと同じです。
(細かいオプションの説明はしませんので、後でググって調べてね
●前提
Subversionリポジトリ上のブランチはsvnコマンドで作成する。
基本的にブランチはtrunkから作成される。
●まず、リモートのブランチを確認してみましょう。
既にリモートのリポジトリにはbranches/の中に複数のブランチがあるという想定です。
shell > git branch -a (リモートとローカルのブランチを両方表示します
* master
remotes/origin/trunk
あらら? リモートにあるはずのブランチが表示されてませんね?
fetchをしてリモートの情報を取り込んでみましょう。
shell > git svn fetch
Found possible branch point: http://sabakan.org/svn/git_svn_test1/trunk => http://sabakan.org/svn/git_svn_test1/branches/20150816_kimodameshi, 5
Found branch parent: (refs/remotes/origin/20150816_kimodameshi) 741f4b928413ecb7b5f7984c58014c9126582cf5
Following parent with do_switch
Successfully followed parent
r6 = ef0cd7c2262cc34e496b08d7cf74f26cb0fc9cf9 (refs/remotes/origin/20150816_kimodameshi)
Found possible branch point: http://sabakan.org/svn/git_svn_test1/trunk => http://sabakan.org/svn/git_svn_test1/branches/20150916_halloween, 5
Found branch parent: (refs/remotes/origin/20150916_halloween) 741f4b928413ecb7b5f7984c58014c9126582cf5
Following parent with do_switch
Successfully followed parent
r7 = 623caa0acaf38638d3cff82303379c8301bf1fb9 (refs/remotes/origin/20150916_halloween)
ブランチの情報がfetchされましたね。
もう一回、git branch -aをしてみましょう。
shell > git branch -a
* master
remotes/origin/20150816_kimodameshi
remotes/origin/20150916_halloween
remotes/origin/trunk
ちゃんとリモートブランチの内容が表示されましたね。
●ローカルに作業ブランチの作成
ローカルに作業ブランチを作成してみましょう。
リモートの20150816_kimodameshiから作業ブランチを作成しましょう。
shell > git checkout -b 20150816_kimodameshi remotes/origin/20150816_kimodameshi
Switched to a new branch '20150816_kimodameshi'
これでローカル作業ブランチの作成とブランチの切り替えができました。
git svn infoでブランチの情報を確認してみましょう。
shell > git svn info
Path: .
URL: http://sabakan.org/svn/git_svn_test1/branches/20150816_kimodameshi
Repository Root: http://sabakan.org/svn/git_svn_test1
Repository UUID: 7560baa6-3e80-11e5-b682-712d2b13a4d3
Revision: 6
Node Kind: directory
Schedule: normal
Last Changed Author: taka
Last Changed Rev: 5
Last Changed Date: 2015-08-15 10:34:39 +0900 (土, 15 8月 2015)
試しに適当なファイルを修正してリモートにcommitしてみましょう。
shell > vim public/index.php
shell > git add .
shell > git commit -m "test commit"
shell > git svn dcommit
ちゃんとリモートの20150816_kimodameshi ブランチにcommitされましたか?
●マージをする
それでは次はマージをしてみましょう。
20150816_kimodameshiで加えた変更をtrunkにマージしてみましょう。
まず、ローカルのリポジトリをmasterに切り換えます。
shell > git checkout master
shell > git merge --no-ff 20150816_kimodameshi
コミットのメッセージを入力する画面になると思います(デフォルトだとviが立ちががると思います)ので、
何か適当にメッセージを書き込んで保存してください。
Merge made by the 'recursive' strategy.
public/index.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
これでマージが終わりました。
最後にリモートにコミットしましょう。
shell > git svn dcommit
Committing to http://sabakan.org/svn/git_svn_test1/trunk ...
M public/index.php
Committed r11
M public/index.php
r11 = a7eb63ebbfb592cc98753051ff79221380984384 (refs/remotes/origin/trunk)
No changes between afb39cbe287d570b6844d6f1132f8a0462430056 and refs/remotes/origin/trunk
Resetting to the latest refs/remotes/origin/trunk
ちゃんと、リモートのtrunkにマージされましたね?
既に運用フェーズに入った案件では、こんな感じでブランチを細かく分けて、
さらに各ブランチ用のテストサーバーを用意しておけば、QAの人達も各ブランチのテストがしやすくなりますよね。
今日はここまでハァハァ。。。
プロジェクトではSubversionを使っているけど、自分のローカルではgitで管理できると便利そうと思ったことはありませんか?
結構、知らない人が多い気がしますが、実はGitにはgit svnというsvnのクライアントとして使える機能があります。
https://git-scm.com/book/ja/v1/Git%E3%81%A8%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E9%80%A3%E6%90%BA-Git-%E3%81%A8-Subversion
簡単に説明をすると、Subversionのリポジトリからローカルにgitリポジトリとしてcloneして、その後は
gitコマンドで管理をして、Subversionへのcommitもローカルのgitリポジトリから普通にできるのです!
御託は無用。早速使ってみましょう。
●まずは、Windowsでgitとsvnコマンドを使えるようにします
自分はmsys2を使ってます。(たぶんcygwinです
http://sourceforge.net/projects/msys2/
普通にインストーラーを起動してインストールすればいいです。
●gitとsvnをインストールする
msys2を立ち上げたら、
shell > pacman -S git
shell > pacman -S svn
と打ち込んでください。
これでgitとsvnコマンドが使えるようになります。
●Subversionのリポジトリからgit svn cloneをする
Subversionのリポジトリが一般的なディレクトリ構成をしている場合はこんな感じでcloneしてください。
(ディレクトリ構成が一般的では無い場合はオプションを適切に設定する必要があるので注意
shell > git svn clone http://sabakan.org/svn/git_svn_test1 -T trunk -b branches -t tags git_svn_test1
Initialized empty Git repository in /c/Documents and Settings/taka/My Documents/projects/msys2_test/git_svn_test1/.git/
Authentication realm: <http://sabakan.org:80> SVN Repo
Password for 'taka':
r1 = c46bfa049e6c4ba8b9c28f219ff52f25bb552998 (refs/remotes/origin/trunk)
A docs/assets/css/combined.css
A docs/assets/fonts/BebasNeue-webfont.eot
A docs/assets/fonts/BebasNeue-webfont.svg
A docs/assets/fonts/BebasNeue-webfont.ttf
A docs/assets/fonts/BebasNeue-web
●git svn cloneしてきたリポジトリをチェックしてみましょう
ローカルブランチ
shell > git branch
* master
リモートブランチ
shell > git branch -r
origin/trunk
IDE等が自動で作成したディレクトリ等がUntracked files:に表示されてうざい場合がありますが、
あくまでもコミット先はsvnのリポジトリなので.gitignoreなんて追加したくないと思います。
そういう時は
shell > echo ".idea/" >> .git/info/exclude
という風にexcludeにリポジトリの管理にしたくないディレクトリやファイルを追加してやれば
Untrackedに表示されなくなります。
●リポジトリを最新の状態にする
少し普通のgitと違いますね。
shell > git svn rebase
●ローカルのgitリポジトリからリモートのSubversionリポジトリにcommitする
まず、何か適当なファイルを編集してみましょう。
コミットの手順は普通のgitとほとんど変わりません。
変更を加えたファイルをaddします。
shell > git add public/index.php
commitするときに怒られるのでユーザ情報を登録しておきましょう。
shell > git config --global user.email "***********@gmail.com"
shell > git config --global user.name "taka"
ローカルのリポジトリにコミットします。
shell > git commit -m "test commit"
Subversionのリポジトリにコミットします。
shell > git svn dcommit
Committing to http://sabakan.org/svn/git_svn_test1/trunk ...
M public/index.php
Committed r5
M public/index.php
r5 = 741f4b928413ecb7b5f7984c58014c9126582cf5 (refs/remotes/origin/trunk)
No changes between ea3b20ffd8f85d32c5b7fe959dc4d7d351b7432c and refs/remotes/origin/trunk
Resetting to the latest refs/remotes/origin/trunk
無事にコミットできましたか?
ブランチの作成やマージに関しては、あくまでもコミット先がSubversionなので
いろいろと注意すべきことがあります。
その話は、また次回。
今日はここまで。
ハァハァ。
自宅鯖でどうしてもgit-svnの検証がしたくて、仕方なくインストールしてみた。
意外に面倒だったのでメモしておこう。。。
なぜ、rpmではなくてソースからというツッコミが入りそうだが、apacheもソースから入れているため
連携させるモジュールの都合上そうなった。
環境:CentOS6.2
Apache/2.4.16
まずはSubversionのソースをダウンロードします。
shell > cd /usr/local/src/
shell > wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/subversion/subversion-1.9.0.tar.gz
shell > tar xzvf subversion/subversion-1.9.0.tar.gz
shell > cd subversion/subversion-1.9.0/
configureします。
./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config --with-apxs=/usr/local/apache2/bin/apxs --with-apache-libexecdir=/usr/local/apache2/modules
apr系は環境によって変わってくると思います。
リポジトリへのアクセスはhttpdで行う想定なのでsvn用のモジュールのインストール先を
--with-apache-libexecdirで指定しているのがポイントです。
エラーメッセージがでて怒られたので
言われたとおりにsqlite-amalgamation-3071501.zip をダウンロードして解凍します。
shell > wget http://www.sqlite.org/sqlite-amalgamation-3071501.zip
shell > unzip sqlite-amalgamation-3071501.zip
shell > mv sqlite-amalgamation-3071501 sqlite-amalgamation
もう一回configureをやりなおします。
shell > ./configure
configureが成功したらmakeします。
shell > make
makeが成功したらmake installします。
shell > make install
ここまででsubversionのインストールは終わり。
次はApacheの設定しましょう。
shell > cd /usr/local/apache2/conf/
shell > vi httpd.conf
svnとの連携に必要なモジュールを有効にします。
まず、mod_dav.soがコメントになっているはずですので、コメントをはずししょう。
LoadModule dav_module modules/mod_dav.so
次に、svnインストール時にApacheのmodulesディレクトリにインストールされたモジュールを有効にします。
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
記述の順番はmod_dav mod_dav_svn mod_authz_svnの順になってないとダメです。
順番が間違っているとApacheが起動できません。
httpdでアクセスさせるリポジトリの設定はどこか適当なapacheの設定ファイルに追加しておけばいいでしょう。
自分はこう設定しました。<Location></Location>が追加した箇所です。
パスワードファイルは普通にhtpasswdで作ればいいです。
<VirtualHost *:80>
ServerAdmin webmaster@sabakan.org
DocumentRoot /home/sabakan/public_html
ServerName sabakan.org
ServerAlias www.sabakan.org
<Directory /home/sabakan/public_html>
AllowOverride All
Order deny,allow
Allow from all
Options MultiViews FollowSymLinks Includes ExecCGI
</Directory>
<Location /svn>
DAV svn
SVNParentPath /var/svn/
AuthType Basic
AuthName "SVN Repo"
AuthUserFile /usr/local/apache2/conf/.svn_htpasswd
Require valid-user
</Location>
</VirtualHost>
最後にApacheをrestartします。
shell > apachectl -k restart
以上、ハァハァ・・・・。
自宅サーバーのApacheをUPDATEしたので、メモっておこう。
●ソースからインストールしてあるので、前回と同様ソースのダウンロードから
cd /usr/local/src/
wget ftp.riken.jp/net/apache/httpd/httpd-2.4.16.tar.gz
tar xzvf httpd-2.4.16.tar.gz
cd httpd-2.4.16/
●前回のconfigureのオプションをそのまま使うので前回インストールしたApacheのディレクトリのconfig.niceを指定してconfigureを実行
../httpd-2.4.9/config.nice
●configureが問題なければmake
make
●makeで問題がなければmake install
make install
●Apacheの再起動
apachectl -k restart
これで終わり。ハァハァ
自宅サーバーのbindをupdateすることに。
すぐ忘れるからここにメモっておこう。
●ソースからinstallしてあるので、前回と同様ソースのダウンロードから
cd /usr/local/src/
wget https://ftp.isc.org/isc/bind9/9.9.7-P2/bind-9.9.7-P2.tar.gz
●ソースがダウンロードできたらconfigure
./configure
●configureが終わったらmake
make
●makeが終わったらmake test
make test
●なんかエラーがでたので指示通りにシェルスクリプトを実行
bin/tests/system/ifconfig.sh up
●もう一回、make test
make test
●testの結果が怪しい場合はディレクトリの権限をmake testを実行しているユーザにするといいらしい
chown -R root.root ../bind-9.9.7-P2/
●もう一回、make test
make test
●testの結果が問題なければ、make install
make install
●bindの再起動
/usr/local/sbin/rndc stop
/usr/local/sbin/named -u named
これで終わり。ハァハァ
ディレクトリごと削除したい場合は
# rm -rf dir/ で良いはずですが、ディレクトリ内のファイル数が
多すぎると削除に失敗することがあります。
こんな時の解決方法をいくつか紹介しましょう。
●rmにxargs経由でファイル名を渡す。
# echo dir/* | xargs rm
●rmのまえに\(バックスラッシュ)をつける
# \rm -rf dir/
●リダイレクトとxargsを使う。
# ls > hoge.dat
# xargs rm < hoge.dat
これでOK^^
サーバが高負荷状態の時はプロセスの再起動に失敗することがあります。
(たとえば service apache2 restart
このようなエラーは制御スクリプト内のstop()に失敗している時に起こります。
(そもそもstop()に失敗しているのにstart()しようとしている
このような事態に陥ってしまった時は、生き残っているプロセスを全てkillしてから
startさせれば大抵解決します。
●まず、生き残っているプロセスのIDを調べます。
# ps -ef | grep apache
root 5515 1 0 Jul03 ? 00:00:00 /usr/sbin/apache2
apache 13475 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
apache 13476 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
apache 13477 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
apache 13478 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
apache 13482 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
apache 13483 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
apache 13484 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
apache 13485 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
●killコマンドでプロセスを殺します。
(一番小さいプロセスIDをkillすると大抵は全部killできます。
# kill 5515
●もしくはkillallで一気に消すことも可能です。
(LinuxのkillallとSunOSのkillallは意味が違いますので注意してください。
# killall apache2
●生き残っているプロセスを全部殺せたらstartしましょう。
# service apache2 start
これでOK^^
●極稀に、こういう問題も起こるようです
[root@s1 root]# ipcs -s | grep apache
0×00000000 524288 apache 600 1
0×00000000 557057 apache 600 1
0×00000000 589826 apache 600 1
0×00000000 622595 apache 600 1
0×00000000 655364 apache 600 1
0×00000000 688133 apache 600 1
プロセスは死んでるはずなのに、ipcリソースだけ残ってる・・・・・
そういう場合は、
# ipcrm sem 524288
という感じで残ってるリソースを全部削除してからstartすれば解決するはずです。
一個ずつ消すのがマンドクセという人はipcsの出力結果をawk等で
処理して一気に消せばいいでしょう。
例:
# ipcs -s | grep apache | awk '{print $2}' | xargs ipcrm sem
ApacheTopっていい感じですねぇ。
http://freshmeat.net/projects/apachetop
インストールの仕方は簡単。
./configure して make && make install するだけ。
使い方は
$ apachetop -f /var/log/apache2/access_log
last hit: 09:40:27 atop runtime: 0 days, 00:02:50 09:40:32
All: 46 reqs ( 0.3/sec) 222.0K ( 1411.7B/sec) 4940.8B/req
2xx: 44 (95.7%) 3xx: 2 ( 4.3%) 4xx: 0 ( 0.0%) 5xx: 0 ( 0.0%)
R ( 30s): 6 reqs ( 0.2/sec) 39.1K ( 1335.4B/sec) 6676.8B/req
2xx: 6 ( 100%) 3xx: 0 ( 0.0%) 4xx: 0 ( 0.0%) 5xx: 0 ( 0.0%)
REQS REQ/S KB KB/S URL
1 0.07 0.7 0.0*/
1 0.07 0.5 0.0 /rules.html
1 0.09 3.1 0.3 /spec.shtml
1 0.09 6.8 0.6 /faq.html
1 0.10 22.3 2.2 /blog/root/
1 0.20 5.7 1.1 /blog/root/2009/01/news20090112html.html