git-svnを使った開発の手順

git-svnを使った開発の手順

未だにSubversionの案件があって泣きそうです。
もうコマンド覚えていないのでgit-svnで対応しますが、流れを決めておかないと大変なので自分の作業をまとめときます

チェックアウト

~~~
git svn clone -s –prefix svn/ [svnリポジトリのURL] [作成したいGitリポジトリのPATH]
~~~

ただしsvnをちゃんと使ってない案件、trunkがない場合など・・の場合はこのコマンドでは対応できない。。。。

~~~
git svn clone –trunk= –branches=branches –prefix=svn/ [svnリポジトリのURL]
~~~

するとcheckoutができる

~~~
$ git branch
* master

$ git branch -r
svn/trunk
svn/foo-x
svn/foo-y
svn/bar-new-feature

$ ls
foo/
bar/
branches/
~~~

git-svn の使い方メモ

trunkで開発する

svn/trunkをチェックアウトする

~~~
git checkout -b trunk remotes/svn/trunk
~~~

gitのローカルブランチで開発する

普通にブランチを作る

~~~
git checkout -b develop-branch
~~~

コミット

~~~
git add
git commit
~~~

変なファイル名を使っているとaddが出来ないのでそういう時はこちらで強引に対応する。。

~~~
git commit -a
~~~

日本語ファイル名は大丈夫だけど半角スペースはダメです。。。。。

Subversionにマージにする

そのままマージするとコミットログが大量になってしまうので、squashで1個にまとめる

~~~
git checkout trunk
git merge –squash develop-branch
git commit
git svn dcommit
~~~

ただしSubversionで余計なものまでリポジトリに追加されている(Changes not staged for commitが残っている)場合
エラーログが出る

~~~
update-index –refresh: command returned error: 1
~~~

このままだとgit-svnはdcommitが出来ないのでresetで一旦まっさらにしてやる

~~~
git reset –hard trunk
~~~

コミットしてないファイル(hanges not staged for commit)は全部元に戻るので要注意!
(Untracked filesは消えないです)

いちいちreset –hardするのめんどくさいし、元に戻っちゃ困る・・・ってときはstash使います

~~~
git stash save
git svn dcommit –dry-run
git svn dcommit
git stash pop
~~~

コンフリクトしたら

~~~
Auto-merging index.php
CONFLICT (content): Merge conflict in index.php
Squash commit — not updating HEAD
Automatic merge failed; fix conflicts and then commit the result.
~~~

該当ファイルを開くとコンフリクトの箇所がこんな風になっているのでどちらが正しいか確認してあげる

~~~
<<<<<<< HEAD

{{ object.textbody|linebreaks }}

// これが比較前
=======

{{ object.textbody|linebreaksbr }}

//リモート側(2行)

>>>>>>> develop
~~~

エクセルなどのバイナリファイルの場合はそういうわけにもいかないのでどちらかが正しいものとして対処する
どちらでもいいので1回決めて、後から手でマージし直す。。

~~~
# AAA.xlsxがコンフリクトした!でもAAA.xlsxってファイルはbranchAのものが正なのでそれを正としたい
git checkout –theirs AAA.xlsx
# BBB.xlsxもコンフリクトした!でもBBB.docxってファイルはmasterのものが正なのでそれを正としたい
git checkout –ours BBB.docx
~~~

マージでコンフリクトした際にどちらかのブランチの内容を適用 (git merge, conflict, checkout, –ours, –theirs) – いろいろ備忘録日記

全部コンフリクトが解消されたら

~~~
git commit -a
~~~

こうするとすべてのコミットが反映される
参考:git pull とかでコンフリクトが起こったときの対処 – Mattari Memo

その他

よく使うコマンド

1つ前のコミットを取り消したい!

~~~
git reset –soft HEAD^
~~~

参考:git commitをやり直しする&取り消しする(「get commit –amend」と「git reset」) – hogehoge foobar Blog Style5

よくあるエラーの対応

~~~
git commit -a
fatal: LF would be replaced by CRLF
~~~

add時にエラーが出る場合は下記のようにする

~~~
git config –global core.safecrlf false
~~~

Git | Morninglab

Subversionのリポジトリの更新

全てのブランチ/タグを取ってくるとき

~~~
git svn fetch
~~~

自分のいるブランチのみチェックアウト

~~~
git svn rebase
~~~

svnのtagをgitに取り込む

svnのtagは基本的にbranchと同じ扱いなので、リモートブランチとして表示される

~~~
git branch -r
svn/tags/[tag名]
~~~

これを使ってタグを作ってpushすればいい

~~~
git tag [tag名] svn/tags/[tag名]
git push –tags
~~~

指定したユーザーのコミットしたファイル一覧

~~~
git log –author=homuhomu –stat –pretty=oneline –name-only
~~~