Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

oohira
September 25, 2014

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

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

oohira

September 25, 2014
Tweet

More Decks by oohira

Other Decks in Programming

Transcript

  1. 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
  2. 1. SVN への公開鍵認証 • http://www.flagsystem.co.jp/news /archives/50 • 確認 o PuTTY

    でパスワード入力なしで SVN サー バーに SSH 接続できる o TortoiseSVN でパスワード入力なしでリポ ジトリブラウザを開ける
  3. 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
  4. 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 <[email protected]> bar = bar <[email protected]> ... # SVNユーザー名 = Gitユーザー名 <Gitメールアドレス> # 必要なら手動編集して調整
  5. 4. SVN リポジトリを clone • rev.9800 o 14 … (^o^)

    $ git svn clone -A ~/svnauthors.txt -s -- prefix svn/ svn+ssh://path/to/svn/repos/
  6. 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 [email protected] ## 改行コード(true推奨だが、既存コードに不要なdiffが出るので) $ git config core.autocrlf false ## authors-file(自動設定されているはず) $ git config svn.autorsfile c:/path/to/svnauthors.txt ## 確認 $ git config -l
  7. SVN Repos Git Users Git Repos git commit git checkout

    git svn rebase git svn dcommit 準備完了!
  8. 1. SVN → Git リポジトリへ更新を取得 • git-svn 専用コマンド o git

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

    add README.txt # コミット対象をstaging $ git add LICENSE.txt $ git commit • ローカルリポジトリにコミットされるだけ o 他の人には見えないので失敗しても平気 • IntelliJ IDEA から GUI でもコミット可能 o Subversion とだいたい同じ
  10. 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
  11. 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
  12. 5. ブランチの操作 • チケット単位で作るとよい • 他の人には影響がないので、気軽に作って 気軽に削除できる $ git checkout

    -b topic-branch # 作成 $ git branch # 一覧 master * topic-branch $ git checkout master # 切り替え $ git branch -D topic-branch # 削除
  13. 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
  14. 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
  15. 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
  16. 9. 直前のコミットを修正する • 合体した1つのコミットになるイメージ • すでに git svn dcommit してたらダメ

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

    typo に後で気付いて修正 o 関係ないコミットが混ざってたので除外 o 作業途中でもコミットしといて後で整理 $ git rebase -i HEAD~<n> # <n>は数字
  18. Bad • SVN での見え方を気にしたマージ • SVN に反映してからミスに気付く • SVN 側のブランチ操作とかリリース

    周りは怖くて手を出せてない • 思ったほど速くない? • やっぱりプルリクしたい
  19. • 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 参考文献