Pro Yearly is on sale from $80 to $50! »

git-svnで始めるボッチのためのGit

4a05d4c03e5f9c6f78ec4b3c57dc63c4?s=47 oohira
September 25, 2014

 git-svnで始めるボッチのためのGit

Subversion環境でgit-svnをしばらく使ってみたノウハウを社内勉強会で共有した資料

4a05d4c03e5f9c6f78ec4b3c57dc63c4?s=128

oohira

September 25, 2014
Tweet

Transcript

  1. git-svn で始める ボッチのための Git 2014/09/25 @oohira

  2. 今日話したいことは たった1つ

  3. git-svn を使って仕事でも Git を始めよう

  4. でも結構ハマったから ノウハウ共有するよ

  5. 逆に今日話さないこと

  6. Git/GitHub の使い方 チーム開発への Git の導入 Subversion との費用対効果 プルリクベースの開発

  7. あくまで ボッチのための Git

  8. google-trends “git” “subversion”

  9. None
  10. うちで使ってるライブラリ

  11. jQuery Bootstrap Ember.js Handlebars.js Twitter4J :

  12. 全部 Git/GitHub Git が使えないと パッチも送れない 例外は、Apache 系ぐらい?

  13. 理由は色々付けられるけど 要はもう Git 使いたい

  14. とはいえ会社は Subversion 現役

  15. git-svn !!

  16. SVN Repos SVN Users Git Users Git Repos git commit

    git checkout git svn rebase git svn dcommit svn update svn commit Git Repos git commit git checkout git svn clone svn checkout
  17. git-svn を使う前準備 (Windows)

  18. ここが一番大変で萎える … 全力でスキップ

  19. 1. SVN への公開鍵認証 • http://www.flagsystem.co.jp/news /archives/50 • 確認 o PuTTY

    でパスワード入力なしで SVN サー バーに SSH 接続できる o TortoiseSVN でパスワード入力なしでリポ ジトリブラウザを開ける
  20. 2. msysgit のインストール $ vi ~/.bashrc # 起動時に 1.で作った秘密鍵を登録 eval

    `ssh-agent` ssh-add ~/.ssh/id_rsa # Git Bash で日本語入力できないので外部エディタ指定 export EDITOR=/c/tool/emacs/bin/emacsclientw.exe # 日本語ファイル名の表示 alias ls='ls -F --color --show-control-chars' • http://msysgit.github.io/ $ git clone https://github.com/octocat/Spoon-Knife.git
  21. 3. authors-file の作成 $ svn log --xml svn+ssh://path/to/svn/repos/ | grep

    "<author" | sort -u | perl -pe 's/<author>(.*?)<¥/author>/$1 = $1 <$1¥@example.com>/ > ~/svnauthors.txt $ cat ~/svnauthors.txt foo = foo <foo@example.com> bar = bar <bar@example.com> ... # SVNユーザー名 = Gitユーザー名 <Gitメールアドレス> # 必要なら手動編集して調整
  22. 4. SVN リポジトリを clone • rev.9800 o 14 … (^o^)

    $ git svn clone -A ~/svnauthors.txt -s -- prefix svn/ svn+ssh://path/to/svn/repos/
  23. 5. Git リポジトリの初期設定 $ cd /path/to/git-repos/ ## svn:ignore を引き継ぐ $

    git svn show-ignore >> .git/info/exclude ## ユーザー名(authors-fileに合わせる) ## --global でもいいけど、GitHubとかも併用するので $ git config user.name foobar $ git config user.email foobar@example.com ## 改行コード(true推奨だが、既存コードに不要なdiffが出るので) $ git config core.autocrlf false ## authors-file(自動設定されているはず) $ git config svn.autorsfile c:/path/to/svnauthors.txt ## 確認 $ git config -l
  24. SVN Repos Git Users Git Repos git commit git checkout

    git svn rebase git svn dcommit 準備完了!
  25. 逆引き git-svn 10選 (ほとんど git なんだけど…)

  26. 1. SVN → Git リポジトリへ更新を取得 • git-svn 専用コマンド o git

    pull 相当 未コミットの修正がある場合 $ git checkout master $ git svn rebase $ git stash # 現在の修正を一時退避 $ git svn rebase $ git stash pop
  27. 2. Git リポジトリへ修正をコミット $ git status # 変更状態の確認 $ git

    add README.txt # コミット対象をstaging $ git add LICENSE.txt $ git commit • ローカルリポジトリにコミットされるだけ o 他の人には見えないので失敗しても平気 • IntelliJ IDEA から GUI でもコミット可能 o Subversion とだいたい同じ
  28. 3. Git → SVN リポジトリへ更新を反映 • git-svn 専用コマンド o git

    push 相当 • Git 側に溜まったコミットを SVN に反映 o git svn dcommit してはじめて他の SVN ユーザーに 見える(もう取り消せない) • 注意 o master ブランチ以外からしない o 事前に git svn rebase で最新にしておく $ git checkout master $ git svn dcommit
  29. 4. コミット履歴の確認 $ git log # 基本 $ git log

    -2 # 直近2コミットだけ表示 $ git log -p # 変更点のdiffも表示 $ git log --oneline # 1コミット1行で表示 $ git log --graph # グラフ表示 $ git log --decorate # ブランチ名を表示 $ git log --branches # 他のブランチも表示 • git help log
  30. 5. ブランチの操作 • チケット単位で作るとよい • 他の人には影響がないので、気軽に作って 気軽に削除できる $ git checkout

    -b topic-branch # 作成 $ git branch # 一覧 master * topic-branch $ git checkout master # 切り替え $ git branch -D topic-branch # 削除
  31. 6. SVN の更新をブランチに反映 $ git checkout master # まずmasterをSVNに追従 $

    git svn rebase $ git checkout topic-branch # branchをmasterに追従 $ git rebase master • HEAD からブランチを作り直すイメージ X' Y' topic-branch master X Y topic-branch
  32. 7. ブランチの修正をマージ (--no-ff) $ git checkout topic-branch $ git rebase

    master $ git checkout master $ git merge --no-ff --no-commit topic-branch # コミットコメントを自分で書くため --no-commit $ git commit • Git 側にはキレイなマージログが残る • SVN 側は A, B, C を1回でまとめてコミット したログになる A B C topic-branch master master
  33. 8. ブランチの修正をマージ (--ff-only) $ git checkout topic-branch $ git rebase

    master $ git checkout master $ git merge --ff-only topic-branch • Git 側はブランチとは分からないログになる • SVN 側も A, B, C をコミットしたログになる o SVN 側でコミットを分けたいとき A B C topic-branch master master
  34. 9. 直前のコミットを修正する • 合体した1つのコミットになるイメージ • すでに git svn dcommit してたらダメ

    $ git commit $ git commit --amend # コミットコメントのみ修正 $ vi README.txt $ git add README.txt $ git commit --amend # コミット内容も修正
  35. 10. コミット履歴を改変する • 直近 n 個のコミットを修正したり、1つにま とめたりできる • ここでは説明しきれないけどオススメ o

    typo に後で気付いて修正 o 関係ないコミットが混ざってたので除外 o 作業途中でもコミットしといて後で整理 $ git rebase -i HEAD~<n> # <n>は数字
  36. ボッチ Git してみて

  37. Good • 周りを気にせず Git が使える • Git の使い方をゆるやかに学べる • 複数のチケットを同時進行できる

    • 気軽に試して捨て(寝かせ)られる • 体感して分かる気持ちよさ
  38. Bad • SVN での見え方を気にしたマージ • SVN に反映してからミスに気付く • SVN 側のブランチ操作とかリリース

    周りは怖くて手を出せてない • 思ったほど速くない? • やっぱりプルリクしたい
  39. 欲は出るけど 最初のステップとしては 「あり」

  40. まとめ

  41. 会社に Git が導入されるのを 待っている必要はない

  42. git-svn で Git を始めよう

  43. • Git - Git and Subversion o http://git-scm.com/book/en/Git-and-Other-Systems-Git-and- Subversion •

    Git svnではじめる忍者のごとく潜むgit o http://www.slideshare.net/kazukisato0920/git-svngit • git-svnを使うときのベストプラクティス o http://layzie.hatenablog.com/entry/20121216/1355653349 • 図で分かるgit-mergeの--ff, --no-ff, --squashの違い o http://d.hatena.ne.jp/sinsoku/20111025/1319497900 • こわくない Git o http://www.slideshare.net/kotas/git-15276118 • Git における履歴の書き換え o https://www.atlassian.com/ja/git/tutorial/rewriting-git- history 参考文献