git



目次
  1. Tips
    1. ブランチ名の変更
      1. revert したいがコミットはしない
        1. 統計
          1. git log に tag も表示
            1. git prompt, git completion
              1. リポジトリ w のサブディレクトリ ext_site を別 git リポジトリに
                1. 削除したファイルを復活
                  1. サブディレクトリに分割
                    1. main / master を origin に登録
                      1. git が v2.28 以前の場合
                        1. master 版
                      2. ブランチ系
                        1. 特定のコミットからブランチを作る
                          1. ブランチ上の diff
                            1. ブランチ上の tag と master との関係
                              1. no-ff 版
                                1. ff 版
                                2. 別のリモートに特定のブランチを push
                                  1. リモートブランチをローカルに持ってくる
                                    1. 新規
                                      1. 新規(2)
                                        1. 既存の同名ブランチにリモートのブランチをマージ
                                          1. 既存の同名ブランチにリモートのブランチをマージ(2)
                                          2. ローカルで開発した branch を リモートに push
                                            1. 古いコミットから新たにブランチを切る(作成する)
                                              1. ブランチ名をプロンプトに表示
                                                1. ブランチ名の変更
                                                  1. ローカルブランチとリモートブランチのひも付け
                                                    1. コマンド例
                                                    2. SourceForge の git リポジトリにサブディレクトリを作り、ローカル開発したものを push
                                                      1. 参考
                                                      2. commit 後に .gitignore したが認識されない
                                                        1. リポジトリの名前とemailを修正する
                                                          1. alias
                                                            1. git bisect
                                                              1. /etc を git で管理
                                                                1. リモートにプッシュすることでバックアップとする
                                                                2. Merge branch 'master' of ... とログに残る
                                                                  1. submodule
                                                                    1. サブモジュールの取り込み
                                                                      1. タグの rename
                                                                        1. stash から特定のファイルのみを apply する方法
                                                                          1. ファイル中の一部をコミット
                                                                            1. patch作成
                                                                              1. コミット漏れの対応
                                                                                1. 作業を隠す
                                                                                  1. install
                                                                                    1. 初期設定
                                                                                      1. リポジトリの初期化
                                                                                      2. よく使う git コマンド
                                                                                        1. プロジェクトごとの git メモ
                                                                                          1. Juli
                                                                                            1. Shell service
                                                                                              1. juli_doc を共有化する
                                                                                              2. Edgar での git コマンド例
                                                                                                1. タグ
                                                                                                  1. git下の packaging
                                                                                                    1. commit ログの訂正
                                                                                                    2. プロジェクト P での git コマンド例
                                                                                                    3. プロトコル
                                                                                                      1. gitolite
                                                                                                        1. 特徴
                                                                                                          1. 凡例
                                                                                                            1. 管理作業
                                                                                                              1. tips
                                                                                                                1. アクセス権の確認
                                                                                                              2. svn
                                                                                                                1. svnでの衝突の回避
                                                                                                                  1. Subversion から git への移行
                                                                                                                    1. Edgar
                                                                                                                      1. /home/[MYNAME]
                                                                                                                        1. iway.dip.jp での作業
                                                                                                                        2. svn リポジトリとの連携
                                                                                                                          1. svnでの認証
                                                                                                                            1. svn ブランチにのみ git を使う方法。
                                                                                                                              1. git 1.7以降?
                                                                                                                                1. git 1.6以前?
                                                                                                                                2. svn のサブディレクトリに git を使う方法
                                                                                                                                3. svnとの比較
                                                                                                                                  1. gitに乗り換えた理由
                                                                                                                                  2. 勉強
                                                                                                                                    Sitemap | Profile | タグ一覧
                                                                                                                                    最近の更新
                                                                                                                                    ドライランのありがたみを改めて知る
                                                                                                                                    2024/04/04
                                                                                                                                    伊豆半島
                                                                                                                                    2024/03/31
                                                                                                                                    お出かけチェックリスト
                                                                                                                                    2024/03/29
                                                                                                                                    Ruby
                                                                                                                                    2024/03/27
                                                                                                                                    Kubernetes
                                                                                                                                    2024/03/22
                                                                                                                                    音楽データをDisplayAudioで聞く
                                                                                                                                    2024/03/09
                                                                                                                                    Redmine
                                                                                                                                    2024/02/05
                                                                                                                                    git
                                                                                                                                    2024/02/02
                                                                                                                                    経済
                                                                                                                                    2024/01/08
                                                                                                                                    どうする家康
                                                                                                                                    2023/12/17
                                                                                                                                    MX-Linux
                                                                                                                                    2023/11/06
                                                                                                                                    國體関連学-休学のご連絡
                                                                                                                                    2023/08/13
                                                                                                                                    Debian
                                                                                                                                    2023/08/02
                                                                                                                                    CentOS
                                                                                                                                    2023/06/13
                                                                                                                                    Dell-XPS13
                                                                                                                                    2023/05/23
                                                                                                                                    ベルト
                                                                                                                                    2023/05/18
                                                                                                                                    SourceForge
                                                                                                                                    2023/04/17
                                                                                                                                    確定申告
                                                                                                                                    2023/02/19
                                                                                                                                    さらば「まぐまぐ」
                                                                                                                                    2023/01/09
                                                                                                                                    風猷縄学
                                                                                                                                    2022/11/23


                                                                                                                                    [-] 1. Tips

                                                                                                                                    [-] 1.1. ブランチ名の変更

                                                                                                                                    $ git br -m [new-branch-name]

                                                                                                                                    [-] 1.2. revert したいがコミットはしない

                                                                                                                                    複数回のコミットを取りやめたいけど、コミットはしたくない場合:

                                                                                                                                    $ git show  | git apply -R
                                                                                                                                    $ git show  | git apply -R
                                                                                                                                    $ ...

                                                                                                                                    ここで commit-ID1, 2, ... は、 git log で出てくる commit-ID

                                                                                                                                    [-] 1.3. 統計

                                                                                                                                    [-] 1.4. git log に tag も表示

                                                                                                                                    $ git log --stat --graph --tags --decorate=full

                                                                                                                                    [-] 1.5. git prompt, git completion

                                                                                                                                    (cd to workdir)
                                                                                                                                    $ wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
                                                                                                                                    $ wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
                                                                                                                                    $ sudo mv git-completion.bash /etc/bash_completion.d/
                                                                                                                                    $ chmod a+x git-prompt.sh 
                                                                                                                                    $ sudo mv git-prompt.sh /usr/local/bin/

                                                                                                                                    [-] 1.6. リポジトリ w のサブディレクトリ ext_site を別 git リポジトリに

                                                                                                                                    ここで

                                                                                                                                    w:リポジトリ w 名
                                                                                                                                    W:リポジトリ w のワーキングディレクトリ
                                                                                                                                    R:リモートリポジトリ URL(github でも独自でも)。ここでは ssh://wtech.dip.jp/var/opt/git/W/ext_site.git を git init --bare で作成
                                                                                                                                    1. git subtree
                                                                                                                                      $ git subtree split -P ext_site -b ext_site
                                                                                                                                    2. 新リポジトリを適当なところに作成
                                                                                                                                      $ cd ~/temp
                                                                                                                                      $ mkdir ext_site
                                                                                                                                      $ cd ext_site
                                                                                                                                      $ git init
                                                                                                                                      $ git pull W ext_site
                                                                                                                                    3. リモートリポジトリ R を作成
                                                                                                                                    4. リモートに push
                                                                                                                                      $ git remote add origin R
                                                                                                                                      $ git push origin -u master
                                                                                                                                    5. W/ext_site は削除
                                                                                                                                      $ cd W/
                                                                                                                                      $ git rm -rf ext_site

                                                                                                                                    参考:

                                                                                                                                    https://stackoverflow.com/questions/359424/detach-move-subdirectory-into-separate-git-repository/17864475#17864475

                                                                                                                                    [-] 1.7. 削除したファイルを復活

                                                                                                                                    1. ファイル削除のコミットをリスト:
                                                                                                                                      $ git log --diff-filter=D --summary
                                                                                                                                    2. チェックアウト
                                                                                                                                      $ git co $commit~1 filename
                                                                                                                                      • ここで $commit は具体的なコミット値。 例えば 25df22a17702ce71136a137582575f0b8b80bc66

                                                                                                                                    補足: tilde(~)とcaret(^)の違いを今日知ったw: https://qiita.com/chihiro/items/d551c14cb9764454e0b9

                                                                                                                                    see https://stackoverflow.com/a/953573/921859

                                                                                                                                    [-] 1.8. サブディレクトリに分割

                                                                                                                                    今までホームディレクトリを git で管理していたのだけど、 サイズが増えてきて git操作のたびに時間がかかるのが辛くなってきた。

                                                                                                                                    で、小分けに分けることに。

                                                                                                                                    1. 作業用に close
                                                                                                                                      w$ git clone GIT-URL
                                                                                                                                      w$ cd [MYNAME]
                                                                                                                                    2. サブディレクトリだけ取り出す
                                                                                                                                      w$ git filter-branch --prune-empty --subdirectory-filter DIR/TO/SUB-DIR master
                                                                                                                                    3. リモートにリポジトリ作成
                                                                                                                                      r$ mkdir -p DIR/TO
                                                                                                                                      r$ git --git-dir DIR/TO/SUB-DIR.git init --shared=all --bare
                                                                                                                                    4. サブディレクトリ用の新しいリポジトリを指定
                                                                                                                                      1. 現状確認
                                                                                                                                        w$ git remote -v
                                                                                                                                        origin  GIT-URL (fetch)
                                                                                                                                        origin  GIT-URL (push)
                                                                                                                                      2. 新リポジトリを拡張子 .git で作成
                                                                                                                                      w$ git remote set-url origin NEW-GIT-URL.git w$ git remote -v origin NEW-GIT-URL.git (fetch) origin NEW-GIT-URL.git (push)
                                                                                                                                    5. remote に push
                                                                                                                                      w$ git push -u origin master

                                                                                                                                    参考: https://help.github.com/articles/splitting-a-subfolder-out-into-a-new-repository/

                                                                                                                                    [-] 1.8.1. main / master を origin に登録

                                                                                                                                    [-] 1.8.1.1. git が v2.28 以前の場合

                                                                                                                                    p/nike を例に

                                                                                                                                    1. リモートにベアリポジトリを作成
                                                                                                                                      r$ cd /var/opt/git/MY/p
                                                                                                                                      r$ git init --bare nike.git
                                                                                                                                    2. ローカルにて origin を登録
                                                                                                                                      l$ cd ~/p/nike
                                                                                                                                      l$ git remote add origin ssh://[MYSITE]/var/opt/git/MY/p/nike.git
                                                                                                                                    3. push
                                                                                                                                      l$ git push origin main
                                                                                                                                    4. サーバにて master → main に
                                                                                                                                      r$ git symbolic-ref HEAD refs/heads/main

                                                                                                                                    https://stackoverflow.com/a/65415870/921859 が参考になった。

                                                                                                                                    [-] 1.8.1.2. master 版

                                                                                                                                    p/nike を例に

                                                                                                                                    1. リモートにベアリポジトリを作成
                                                                                                                                      r$ cd /var/opt/git/MY/p
                                                                                                                                      r$ git init --bare nike.git
                                                                                                                                    2. ローカルにて origin を登録
                                                                                                                                      l$ cd ~/p/nike
                                                                                                                                      l$ git remote add origin ssh://[MYSITE]/var/opt/git/MY/p/nike.git
                                                                                                                                    3. push
                                                                                                                                      l$ git push origin master
                                                                                                                                      l$ git push origin main     # 最近だと main

                                                                                                                                    [-] 1.9. ブランチ系

                                                                                                                                    [-] 1.9.1. 特定のコミットからブランチを作る

                                                                                                                                    $ git checkout -b branch_name 

                                                                                                                                    参考: https://stackoverflow.com/a/2816728/921859

                                                                                                                                    [-] 1.9.2. ブランチ上の diff

                                                                                                                                    ブランチ
                                                                                                                                    上の特定のコミット 以降の変更点を git diff で見る:

                                                                                                                                    $ git diff  
                                                                                                                                    例: $ git diff a315b31549 feature_66614

                                                                                                                                    要は、コミットにはブランチ云々はなくリポジトリ内でグローバルな存在なので、 「ブランチとコミットの組み合わせって…?」と悩む必要はなかった、と言うお話。

                                                                                                                                    [-] 1.9.3. ブランチ上の tag と master との関係

                                                                                                                                    ブランチ上に tag を打ってそのブランチを master にマージした時、 tag はどこを指しているのだろう?と思った次第。

                                                                                                                                    実験してみる。

                                                                                                                                    [-] 1.9.3.1. no-ff 版
                                                                                                                                    1. リポジトリ作成
                                                                                                                                      $ mkdir /tmp/work; cd /tmp/work
                                                                                                                                      $ git init
                                                                                                                                    2. ファイル作成 & 1st commit
                                                                                                                                      $ vi README.txt
                                                                                                                                      ...
                                                                                                                                      $ git add README.txt 
                                                                                                                                      $ git commit -v -a
                                                                                                                                    3. ブランチに移動し、ファイルを更新・commit
                                                                                                                                      $ git co -b feature_01
                                                                                                                                      $ vi README.txt
                                                                                                                                      $ git commit -v -a
                                                                                                                                    4. この段階で tag を打ってみる
                                                                                                                                      $ git tag -a v0.0.1
                                                                                                                                    5. master にマージ
                                                                                                                                      $ git co master
                                                                                                                                      $ git merge --no-ff feature_01
                                                                                                                                    6. ログ
                                                                                                                                      $ git log --graph
                                                                                                                                            *   commit 23f787d58f6f6da535fa0a937095bffb597b1a63
                                                                                                                                      |\  Merge: 1f03b8a 939527d
                                                                                                                                      | | Author: ...
                                                                                                                                      | | Date:   Wed Jan 12 08:32:22 2022
                                                                                                                                      | | 
                                                                                                                                      | |     Merge branch 'feature_01'
                                                                                                                                      | |   
                                                                                                                                      | * commit 939527d8f8382e30d6b5328f018a0a1cf6064f2d
                                                                                                                                      |/  Author: ...
                                                                                                                                      |   Date:   Wed Jan 12 08:30:07 2022
                                                                                                                                      |   
                                                                                                                                      |       commit at feature_01
                                                                                                                                      |  
                                                                                                                                            * commit 1f03b8af65dcfd1fda6495d0dd6352dcf1be7881
                                                                                                                                        Author: ...
                                                                                                                                        Date:   Wed Jan 12 08:29:23 2022
                                                                                                                                      
                                                                                                                                            init
                                                                                                                                    7. タグに移動してみる
                                                                                                                                      $ git co v0.0.1
                                                                                                                                    8. ログ
                                                                                                                                      $ git log --graph
                                                                                                                                            * commit 939527d8f8382e30d6b5328f018a0a1cf6064f2d
                                                                                                                                      | Author: ...
                                                                                                                                      | Date:   Wed Jan 12 08:30:07 2022
                                                                                                                                      | 
                                                                                                                                      |     commit at feature_01
                                                                                                                                      |  
                                                                                                                                            * commit 1f03b8af65dcfd1fda6495d0dd6352dcf1be7881
                                                                                                                                        Author: ...
                                                                                                                                        Date:   Wed Jan 12 08:29:23 2022
                                                                                                                                      
                                                                                                                                            init

                                                                                                                                    …と言うことで、ブランチ上のtag だった。

                                                                                                                                    [-] 1.9.3.2. ff 版

                                                                                                                                    ffの場合はどうなるのだろう?ということでこちらも実験。

                                                                                                                                    1. リポジトリ作成
                                                                                                                                      $ mkdir /tmp/work2; cd /tmp/work2
                                                                                                                                      $ git init
                                                                                                                                    2. ファイル作成 & 1st commit
                                                                                                                                      $ vi README.txt
                                                                                                                                      ...
                                                                                                                                      $ git add README.txt 
                                                                                                                                      $ git commit -v -a
                                                                                                                                    3. ブランチに移動し、ファイルを更新・commit
                                                                                                                                      $ git co -b feature_01
                                                                                                                                      $ vi README.txt
                                                                                                                                      $ git commit -v -a
                                                                                                                                    4. この段階で tag を打ってみる
                                                                                                                                      $ git tag -a v0.0.1
                                                                                                                                    5. master にマージ
                                                                                                                                      $ git co master
                                                                                                                                      $ git merge --ff feature_01
                                                                                                                                    6. ログ
                                                                                                                                      $ git log --graph
                                                                                                                                            * commit bc5975468946ce2988dafeffb7c9f446f9daeafd
                                                                                                                                      | Author: ...
                                                                                                                                      | Date:   Wed Jan 12 08:46:03 2022
                                                                                                                                      | 
                                                                                                                                      |     commit at feature_01
                                                                                                                                      |  
                                                                                                                                            * commit 4cad6a08148ac8eae35e0dd263e115e2ab87fb9e
                                                                                                                                        Author: ...
                                                                                                                                        Date:   Wed Jan 12 08:45:25 2022
                                                                                                                                      
                                                                                                                                            init
                                                                                                                                    7. タグに移動してみる
                                                                                                                                      $ git co v0.0.1
                                                                                                                                    8. ログ
                                                                                                                                      $ git log --graph
                                                                                                                                            * commit bc5975468946ce2988dafeffb7c9f446f9daeafd
                                                                                                                                      | Author: ...
                                                                                                                                      | Date:   Wed Jan 12 08:46:03 2022
                                                                                                                                      | 
                                                                                                                                      |     commit at feature_01
                                                                                                                                      |  
                                                                                                                                            * commit 4cad6a08148ac8eae35e0dd263e115e2ab87fb9e
                                                                                                                                        Author: ...
                                                                                                                                        Date:   Wed Jan 12 08:45:25 2022
                                                                                                                                      
                                                                                                                                            init

                                                                                                                                    …なるほど、確かにその通り。

                                                                                                                                    [-] 1.9.4. 別のリモートに特定のブランチを push

                                                                                                                                    1. リモートでリポジトリを作成
                                                                                                                                      (ssh to another-remote-host)
                                                                                                                                      $ cd ROOT/TO/GIT-REPO
                                                                                                                                      $ git init --bare PROJ.git
                                                                                                                                      ここで
                                                                                                                                      ROOT/TO/GIT-REPO:別リモート上の git リポジトリルート
                                                                                                                                      PROJ.git:対象プロジェクトリポジトリ
                                                                                                                                    2. 下記をローカルにて:
                                                                                                                                      $ git remote add another_remote URL_TO_ANOTHER_REMOTE_REPO
                                                                                                                                      $ git push another_remote LOCAL_BRANCH
                                                                                                                                      ここで
                                                                                                                                      another_remote:別リモート名。名前は任意
                                                                                                                                      URL_TO_ANOTHER_REMOTE_REPO:リモートリポジトリURL。例: ssh://another-git.jp:/PROJ.git
                                                                                                                                      LOCAL_BRANCH:ローカルの特定ブランチ。例: feature_1234

                                                                                                                                    see https://stackoverflow.com/a/5181968/921859

                                                                                                                                    [-] 1.9.5. リモートブランチをローカルに持ってくる

                                                                                                                                    [-] 1.9.5.1. 新規
                                                                                                                                    $ git co --track origin/MY_REMOTE_BRANCH
                                                                                                                                    [-] 1.9.5.2. 新規(2)
                                                                                                                                    $ git checkout -b new-branch origin/new-branch

                                                                                                                                    注: 安易に git pull しない。手元の現在のブランチにマージしようとするので。

                                                                                                                                    [-] 1.9.5.3. 既存の同名ブランチにリモートのブランチをマージ
                                                                                                                                    $ git co MY_BRANCH
                                                                                                                                    $ git fetch
                                                                                                                                    $ git br -u             origin/MY_BRANCH
                                                                                                                                    $ git br --set-upstream origin/MY_BRANCH    # v1.7.1
                                                                                                                                    [-] 1.9.5.4. 既存の同名ブランチにリモートのブランチをマージ(2)
                                                                                                                                    $ git co [A-BRANCH]
                                                                                                                                    $ git fetch
                                                                                                                                    $ git merge origin/[A-BRANCH]

                                                                                                                                    [-] 1.9.6. ローカルで開発した branch を リモートに push

                                                                                                                                    my$ git push origin my_dev

                                                                                                                                    他の開発者(「やる夫」とする)がこのブランチにアクセスするには:

                                                                                                                                    やる夫$ git fetch origin
                                                                                                                                    やる夫$ git checkout --track origin/my_dev

                                                                                                                                    参考: http://www.mariopareja.com/blog/archive/2010/01/11/how-to-push-a-new-local-branch-to-a-remote.aspx

                                                                                                                                    [-] 1.9.7. 古いコミットから新たにブランチを切る(作成する)

                                                                                                                                    ブランチ名: new_branch、古いコミットを a9c146a09505837ec03b とした場合:

                                                                                                                                    git checkout -b new_branch a9c146a09505837ec03b

                                                                                                                                    参考: http://stackoverflow.com/questions/7167645/how-do-i-create-a-new-git-branch-from-an-old-commit

                                                                                                                                    [-] 1.9.8. ブランチ名をプロンプトに表示

                                                                                                                                    Ubuntu の場合、/etc/bash_completion.d/git がそのまま使える。 __git_ps1 がそれ。

                                                                                                                                    例: .bashrc に例えば以下にようにする:

                                                                                                                                    PS1='...$(__git_ps1)...$ '

                                                                                                                                    [-] 1.9.9. ブランチ名の変更

                                                                                                                                    git br -m OLD_NAME NEW_NAME

                                                                                                                                    暫定的なブランチ名で開発を進めていて、正式に名前が決定。 その名前でリモート(origin)にもブランチを作成する、とか。

                                                                                                                                    [-] 1.9.10. ローカルブランチとリモートブランチのひも付け

                                                                                                                                    $ git branch --set-upstream local-branch-name origin/remote-branch-name

                                                                                                                                    https://stackoverflow.com/questions/1184518/getting-existing-git-branches-to-track-remote-branches

                                                                                                                                    [-] 1.9.11. コマンド例

                                                                                                                                    git branch -r           # リモートブランチ一覧
                                                                                                                                    git branch              # ブランチ一覧
                                                                                                                                    git branch b01          # ブランチ 'b01' の作成
                                                                                                                                    git checkout b01        # ブランチ 'b01' での作業
                                                                                                                                    git branch -d b01       # ブランチ 'b01' の削除

                                                                                                                                    [-] 1.10. SourceForge の git リポジトリにサブディレクトリを作り、ローカル開発したものを push

                                                                                                                                    Rails 3 対応の edgar2 なるものを作り、 既存 edgar プロジェクトの別リポジトリとする。

                                                                                                                                    1. SourceForge shell service で git サブディレクトリを作成
                                                                                                                                      my$ ssh -t [MYNAME],jjedgar@shell.sourceforge.net create
                                                                                                                                        :
                                                                                                                                      sf$ umask 002                           # 多分要らない
                                                                                                                                      sf$ cd /home/scm_git/jjedgar/       
                                                                                                                                      sf$ git --git-dir edgar2 init --shared=all --bare
                                                                                                                                      ここで、プロンプトは下記:
                                                                                                                                      my$:私のPC の shell
                                                                                                                                      sf$:SourceForge shell
                                                                                                                                    2. sourceforge edgar2 に、ローカルで開発していたものを push
                                                                                                                                      my$ git remote add origin ssh://[MYNAME]@jjedgar.git.sourceforge.net/gitroot/jjedgar/edgar2
                                                                                                                                      my$ git config branch.master.remote origin
                                                                                                                                      my$ git config branch.master.merge refs/heads/master
                                                                                                                                      my$ git push origin master
                                                                                                                                      my$ git push --all
                                                                                                                                      my$ git push --tags
                                                                                                                                    3. 確認を兼ねて clone してみる。
                                                                                                                                      my$ cd SOME_TEMP_DIR    # 適当なディレクトリに移動
                                                                                                                                      my$ git clone ssh://[MYNAME]@jjedgar.git.sourceforge.net/gitroot/jjedgar/edgar2
                                                                                                                                      my$ cd edgar2/
                                                                                                                                      
                                                                                                                                         _、_
                                                                                                                                       ( ,_ノ` )      n
                                                                                                                                       ̄     \    ( E) グッジョブ!!
                                                                                                                                      フ     /ヽ ヽ_//

                                                                                                                                    [-] 1.10.1. 参考

                                                                                                                                    [-] 1.11. commit 後に .gitignore したが認識されない

                                                                                                                                    誤って commit したが、生成されるデータなので(例: *.o, *.exe)リポジトリ の対象とさせないよう .gitignore に登録しても、後からは効かない。下記で対処:

                                                                                                                                    $ git rm -n --cached '*.exe'      # dry-run
                                                                                                                                    $ git rm    --cached '*.exe'      # real-run

                                                                                                                                    参考: http://stackoverflow.com/questions/6535362/gitignore-after-commit

                                                                                                                                    [-] 1.12. リポジトリの名前とemailを修正する

                                                                                                                                    git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='newemail';" HEAD

                                                                                                                                    参考: http://stackoverflow.com/questions/750172/how-do-i-change-the-author-of-a-commit-in-git

                                                                                                                                    [-] 1.13. alias

                                                                                                                                    st(=status), co(=checkout), ci(=commit, checkin の意味), br(=branch) のショートカット:

                                                                                                                                    $ git config --global alias.st status
                                                                                                                                    $ git config --global alias.co checkout
                                                                                                                                    $ git config --global alias.ci commit
                                                                                                                                    $ git config --global alias.br branch

                                                                                                                                    [-] 1.14. git bisect

                                                                                                                                    便利!(・∀・)

                                                                                                                                    例: 'def category' というメソッドを消してしまったリビジョンを検索

                                                                                                                                    $ git bisect start
                                                                                                                                    $ git bisect bad
                                                                                                                                    $ git bisect good NNNNN     # ok だった rev.
                                                                                                                                    $ git bisect run grep 'def category' file/you/want/to/search
                                                                                                                                      :
                                                                                                                                    d243a1e9c4501e0a222b7e098dead8611c0420b0 is the first bad commit  <---- !!
                                                                                                                                    commit d243a1e9c4501e0a222b7e098dead8611c0420b0
                                                                                                                                      :

                                                                                                                                    [-] 1.15. /etc を git で管理

                                                                                                                                    $ cd /etc
                                                                                                                                    $ sudo git init
                                                                                                                                    $ sudo vi .gitignore    # *~ を追加
                                                                                                                                    *~
                                                                                                                                    /ld.so.cache
                                                                                                                                    /aliases.db
                                                                                                                                    /apparmor.d/cache
                                                                                                                                    /alternatives/
                                                                                                                                    /ssl/certs
                                                                                                                                    /ConsoleKit
                                                                                                                                    $ sudo git add .
                                                                                                                                    $ sudo env EDITOR=vi git commit -v

                                                                                                                                    [-] 1.15.1. リモートにプッシュすることでバックアップとする

                                                                                                                                    /etc は root 権限で git に変更履歴を保存している。 単に git push 時に URL を一般ユーザ名 my_name としてもだめで、 秘密鍵も my_name 用を指定しないといけない。 git で秘密鍵を指定する方法は無いようで、ssh config で指定する必要がある。

                                                                                                                                    1. バックアップ元(バックアップしたい /etc のある)PC の /root/.ssh/config に以下を設定:
                                                                                                                                      Host thinkpad_x220_etc_bkp
                                                                                                                                        User          my_name
                                                                                                                                        Hostname      my.remote.host
                                                                                                                                        IdentityFile  /home/my_name/.ssh/id_rsa
                                                                                                                                      • my.remote.host は適宜、実際のバックアップ先ホストを指定。
                                                                                                                                    2. Thinkpad の /etc/.git/config に以下を設定:
                                                                                                                                      [remote "origin"]
                                                                                                                                        fetch = +refs/heads/*:refs/remotes/origin/*
                                                                                                                                        url = ssh://thinkpad_x220_etc_bkp/var/opt/git/thinkpad_x220_etc
                                                                                                                                      [branch "master"]
                                                                                                                                        remote = origin
                                                                                                                                        merge = refs/heads/master
                                                                                                                                      これは、thinkpad_x220_etc_bkp という仮のホストの /var/opt/git/thinkpad_x220_etc という git リポジトリをリモートとする設定。 thinkpad_x220_etc_bkp ホストの実際の設定は上で行ったとおり。
                                                                                                                                    3. my.remote.host:/var/opt/git/thinkpad_x220_etc に git bare リポジトリを作成:
                                                                                                                                      r$ cd /var/opt/git/
                                                                                                                                      r$ mkdir thinkpad_x220_etc
                                                                                                                                      r$ cd thinkpad_x220_etc
                                                                                                                                      r$ git init --bare
                                                                                                                                    4. push
                                                                                                                                      L$ sudo git push

                                                                                                                                    なお、ここで、r$, L$ は以下の意味:

                                                                                                                                    r$:バックアップ先リモートマシン my.remote.host のプロンプト
                                                                                                                                    L$:バックアップ元(バックアップしたい /etc のある)PC のプロンプト

                                                                                                                                    [-] 1.16. Merge branch 'master' of ... とログに残る

                                                                                                                                    1. 以下のグローバルセッティングをする:
                                                                                                                                      $ git config branch.autosetuprebase always
                                                                                                                                    2. or, 以下をリポジトリごとにセットする:
                                                                                                                                      $ git config branch.branch-name.rebase true
                                                                                                                                    3. or, git push の前に rebase すること。

                                                                                                                                    参考: http://stevenharman.net/blog/archive/2011/06/09/git-pull-with-automatic-rebase.aspx

                                                                                                                                    [-] 1.17. submodule

                                                                                                                                    1. init。.git/config に submodule エントリが作成される:
                                                                                                                                      $ git submodule init
                                                                                                                                    2. update。ファイルが fetch される:
                                                                                                                                      $ git submodule update

                                                                                                                                    [-] 1.18. サブモジュールの取り込み

                                                                                                                                    $ git submodule add http://HOST/PATH localpath
                                                                                                                                    $ git diff --cached SUBMODULE   # ディレクトリエントリであることを確認
                                                                                                                                    $ js .gitmodules                # 必要に応じて修正
                                                                                                                                    $ git commit -v -a --dry-run    # 確認
                                                                                                                                    $ git commit -v -a

                                                                                                                                    [-] 1.19. タグの rename

                                                                                                                                    $ git tag NEW OLD
                                                                                                                                    $ git tag -d OLD

                                                                                                                                    参考: stackoverflow サイト

                                                                                                                                    [-] 1.20. stash から特定のファイルのみを apply する方法

                                                                                                                                    $ git checkout stash@{0} -- db/seeds.rb

                                                                                                                                    参考: http://stackoverflow.com/questions/1105253/how-would-i-extract-a-single-file-or-changes-to-a-file-from-a-git-stash

                                                                                                                                    他に、 stash からパッチを作成する方法:

                                                                                                                                    $ git stash show -p

                                                                                                                                    [-] 1.21. ファイル中の一部をコミット

                                                                                                                                    $ git add -p ...

                                                                                                                                    会話的に y/n/他でどの変更部分をコミットに含めるか指定できる。

                                                                                                                                    git のインデックスの存在理由が少し分かった。やっと…。 コミットに向けてのステージングである、と考えればすっきりする。

                                                                                                                                    [-] 1.22. patch作成

                                                                                                                                    $ git diff HEAD^ app lib >app-x.y.z.patch

                                                                                                                                    適用先にて

                                                                                                                                    $ patch -p1 --dry-run 

                                                                                                                                    [-] 1.23. コミット漏れの対応

                                                                                                                                    $ git reset --soft HEAD^
                                                                                                                                    $ edit
                                                                                                                                    $ git commit -a -c ORIG_HEAD

                                                                                                                                    参考: EXAMPLES of 'man git-reset'

                                                                                                                                    [-] 1.24. 作業を隠す

                                                                                                                                    $ git stash               # 作業の退避
                                                                                                                                    (クリーンな状態)
                                                                                                                                    $ git stash list          # 退避した作業の一覧
                                                                                                                                    $ git stash pop           # 作業の復帰

                                                                                                                                    [-] 1.25. install

                                                                                                                                    $ sudo apt-get install git-core

                                                                                                                                    [-] 1.26. 初期設定

                                                                                                                                    $ git config --global user.name 'MYNAME'
                                                                                                                                    $ git config --global user.email 'MYNAME@MYDOMAIN'
                                                                                                                                    $ git config --global color.ui auto
                                                                                                                                    $ git config --global core.editor "jstar"
                                                                                                                                    $ git config --global core.pager "less -R -X"

                                                                                                                                    (2013/01/17) pager, 'lv -c' を今まで使っていたけど、画面がクリアされるのが 気に入らなかった。less でそれができるのでそれに変更してみる。

                                                                                                                                    [-] 1.27. リポジトリの初期化

                                                                                                                                    $ mkdir work
                                                                                                                                    $ cd work
                                                                                                                                    $ git init

                                                                                                                                    [-] 2. よく使う git コマンド

                                                                                                                                    git var -l            # 変数一覧
                                                                                                                                    (編集)
                                                                                                                                    git add .
                                                                                                                                    git commit -m 'commit log message'
                                                                                                                                    
                                                                                                                                    (修正)
                                                                                                                                    git diff
                                                                                                                                    git add index.html
                                                                                                                                    git diff              # 差分は表示されない
                                                                                                                                    git diff HEAD         # 最新リポジトリ(HEAD)とワークツリーの差分
                                                                                                                                    git add -u            # ワークツリー内の全git管理ファイルをコミット対象とする
                                                                                                                                    git commit
                                                                                                                                    git commit -a         # = add -u; commit
                                                                                                                                    
                                                                                                                                    git log --pretty=short

                                                                                                                                    [-] 3. プロジェクトごとの git メモ

                                                                                                                                    [-] 3.1. Juli

                                                                                                                                    1. localで開発していたものを SourceForge git に push。最初に必要な作業:
                                                                                                                                    $ cd ~/nosvn/juli/repo    # it is juli's local_project
                                                                                                                                    $ git remote add origin ssh://[MYNAME]@jjjuli.git.sourceforge.net/gitroot/jjjuli/jjjuli
                                                                                                                                    $ git config branch.master.remote origin
                                                                                                                                    $ git config branch.master.merge refs/heads/master

                                                                                                                                    以下の実行前に、shell service(後述)が必要か?:

                                                                                                                                    $ git push origin master
                                                                                                                                    1. 後は git push だけで ok?

                                                                                                                                    [-] 3.1.1. Shell service

                                                                                                                                    $ ssh -t [MYNAME],jjjuli@shell.sourceforge.net create

                                                                                                                                    [-] 3.1.2. juli_doc を共有化する

                                                                                                                                    1. 共有 git repo の作成
                                                                                                                                      $ cd /var/opt/git
                                                                                                                                      $ sudo mkdir juli_public; chown [MYNAME] juli_public; chmod 700 juli_public
                                                                                                                                      $ git init --bare
                                                                                                                                    2. html生成用ステージング juli repo の作成
                                                                                                                                      $ cd no_git; mkdir juli_doc; cd juli_doc
                                                                                                                                      $ git clone /var/opt/git/juli_public html_stage
                                                                                                                                      $ cd html_stage
                                                                                                                                      $ juli init
                                                                                                                                      $ juli
                                                                                                                                      $ juli sitemap
                                                                                                                                      $ juli recent_update
                                                                                                                                    3. apache で 生成された html を表示できる設定を行う。

                                                                                                                                    [-] 3.2. Edgar での git コマンド例

                                                                                                                                    app, lib, public に限って(vendor/ 以下にいろいろパッケージを入れたので) v0.91.1 との差分をとる:

                                                                                                                                    git diff 958a057f154d7c63ff252783ca547ca5204ac017 -- app lib public/

                                                                                                                                    [-] 3.2.1. タグ

                                                                                                                                    git log --oneline v0.92.0..HEAD   # v0.92.0 以降の1行ログを取得
                                                                                                                                    git tag -a v0.92.1                # v0.92.1 タグ打ち。上のログを元にコメント
                                                                                                                                    git svn tag v0.92.1               # svn にもタグ打ち。dcommitではダメみたい

                                                                                                                                    [-] 3.2.2. git下の packaging

                                                                                                                                    1. あるコミット(下例では v0.92.0)をアーカイブ
                                                                                                                                      $ git archive --format=tar --prefix=edgar-0.92.0/ v0.92.0 | gzip >/tmp/edgar-0.92.0.tgz
                                                                                                                                    2. master ブランチの特定のサブディレクトリだけをアーカイブ
                                                                                                                                      $ cd a-sub-dir
                                                                                                                                      $ git archive --format=tar --prefix=PREFIX/ master . | gzip >PKG_NAME.tgz
                                                                                                                                      ここで、a-sub-dir, PREFIX, PKG_NAME は適宜置き換える。

                                                                                                                                    [-] 3.2.3. commit ログの訂正

                                                                                                                                    • 直前のコミットログ: git commit --amend

                                                                                                                                    [-] 3.3. プロジェクト P での git コマンド例

                                                                                                                                    git branch --track P-branch P
                                                                                                                                    git branch
                                                                                                                                    git checkout P-branch
                                                                                                                                    git log
                                                                                                                                    git reset --hard HEAD
                                                                                                                                    git svn rebase
                                                                                                                                    git svn fetch

                                                                                                                                    ここで、P-branch

                                                                                                                                    [-] 4. プロトコル

                                                                                                                                    git:git://HOST/...
                                                                                                                                    https:https://HOST/...
                                                                                                                                    ssh:aka git@HOST:..., or ssh://git@HOST/...
                                                                                                                                    http:http://HOST/...

                                                                                                                                    [-] 5. gitolite

                                                                                                                                    git ユーザ管理の gitolite を使用することになりそうなので、φ(..)メモ。

                                                                                                                                    [-] 5.1. 特徴

                                                                                                                                    1. github の「pull リクエスト」と同等のことが出来る。
                                                                                                                                      • 「特定のユーザには特定のブランチのみ push してもらい、origin には触らせない」という設定も gitolite でできるようになるらしい。
                                                                                                                                    2. 継続的インテグレーションは死んだ と言うサイトにて(やや「釣り」なタイトルではあるけれどw)、 問題とその解決策を提起してくれている「読み取り専用マスタブランチ」が設定可能。

                                                                                                                                    [-] 5.2. 凡例

                                                                                                                                    GITOLITE-SERVER.jp:gitolite サーバホスト名の例
                                                                                                                                    s$:gitolite サーバプロンプト
                                                                                                                                    C$:クライアント(開発環境等) gitlite-admin プロンプト
                                                                                                                                    c$:クライアント(開発環境等)プロンプト

                                                                                                                                    [-] 5.3. 管理作業

                                                                                                                                    1. セットアップ
                                                                                                                                      1. インストール
                                                                                                                                        s$ sudo apt-get install gitolite   # Ubuntu の場合
                                                                                                                                        s$ sudo apt     install gitolite3  # Ubuntu16.04 の場合
                                                                                                                                    2. 初期管理者登録
                                                                                                                                      ※ 実行者に sudo 権限があるのが前提。
                                                                                                                                      1. 管理者公開鍵(/tmp/yarnanaio.pub とする)を作業域にコピー。
                                                                                                                                        s$ gl-setup /tmp/yarnanaio.pub
                                                                                                                                        ...
                                                                                                                                        hit enter...
                                                                                                                                      2. .gitolite.rc 編集画面になるが、何もせず終了(vi の場合は 「ESC:(コロン)q」)
                                                                                                                                      3. clone
                                                                                                                                        C$ git clone gitolite3@GITOLITE-SERVER.jp:gitolite-admin.git  # Ubuntu16.0
                                                                                                                                        C$ git clone ssh://GITOLITE-SERVER.jp/gitolite-admin.git      # CentOS-6
                                                                                                                                        ※ ここで ssh://GITOLITE-SERVER.jp は user=gitolite でアクセスするよう ~/.ssh/config で以下のように設定しておく:
                                                                                                                                        host GITOLITE-SERVER.jp
                                                                                                                                          user          gitolite
                                                                                                                                    3. ユーザ登録
                                                                                                                                      1. ユーザ(yaruo としよう)の公開鍵(id_rsa.pub としよう)をもらう。 ここでは /tmp/yaruo.pub にその鍵があるとする。
                                                                                                                                      2. gitolite-admin リポジトリに移動
                                                                                                                                      3. yaruo の公開鍵を yaruo.pub として keydir/ にコピーし、登録:
                                                                                                                                        C$ cp /tmp/yaruo.pub keydir/
                                                                                                                                        C$ git add keydir/yaruo.pub
                                                                                                                                        C$ git commit -v keydir/yaruo.pub
                                                                                                                                      4. conf/gitolite.conf 編集
                                                                                                                                        C$ vi conf/gitolite.conf
                                                                                                                                        ...
                                                                                                                                        @admins               = me
                                                                                                                                        @project_A_developer  = yaruo
                                                                                                                                        
                                                                                                                                        repo testing
                                                                                                                                          RW+     =   @all
                                                                                                                                        
                                                                                                                                        repo project_A
                                                                                                                                          RW dev-     = @project_A_developer
                                                                                                                                          RW+         = @admins
                                                                                                                                        • このファイルで、@project_A_developer に属するユーザは dev-* ブランチでのみ RW できるようになる(origin には push できない)。
                                                                                                                                      5. push
                                                                                                                                        C$ git push
                                                                                                                                    4. 既存リポジトリ(例: prefix/my_proj)を gitolite に登録
                                                                                                                                      1. gitolite-admin で my_proj リポジトリを新規作成
                                                                                                                                        1. gitolite-admin リポジトリに移動
                                                                                                                                        2. リポジトリを gitolite.conf に追加。例:
                                                                                                                                          C$ vi conf/gitolite.conf
                                                                                                                                          ...
                                                                                                                                          repo prefix/my_proj
                                                                                                                                            RW+     =   admin
                                                                                                                                            R       =   read-only-user
                                                                                                                                          C$ git commit -v -a
                                                                                                                                          C$ git push
                                                                                                                                          gitolite3@GITOLITE-SERVER.jp:/var/lib/gitolite3/repositories/prefix/my_proj.git が作成されているのを確認。
                                                                                                                                      2. write権のあるユーザにて既存リポジトリの remote リポジトリの1つとして "gitolite" を追加し、push
                                                                                                                                        c$ git remote add origin ssh://gitolite3@GITOLITE-SERVER.jp/prefix/my_proj
                                                                                                                                        #  git remote add origin ssh://GITOLITE-SERVER.jp/prefix/my_proj            # CentOS-6 の場合
                                                                                                                                        c$ git push origin master
                                                                                                                                        c$ git push origin --all
                                                                                                                                        c$ git push origin --tags

                                                                                                                                    [-] 5.4. tips

                                                                                                                                    [-] 5.4.1. アクセス権の確認

                                                                                                                                    c$ ssh git@GITOLITE-SERVER.jp
                                                                                                                                         R   W      project-A
                                                                                                                                         R   W      project-B
                                                                                                                                        @R_ @W_     testing

                                                                                                                                    [-] 6. svn

                                                                                                                                    双方向、svn→git 移行について。

                                                                                                                                    [-] 6.1. svnでの衝突の回避

                                                                                                                                    ローカルでの変更を放棄するケース:

                                                                                                                                    $ git reset -- test/fixtures/a.yml
                                                                                                                                    $ git diff test/fixtures/a.yml
                                                                                                                                    $ git checkout test/fixtures/a.yml

                                                                                                                                    [-] 6.2. Subversion から git への移行

                                                                                                                                    [-] 6.2.1. Edgar

                                                                                                                                    Edgar のリポジトリを svn から git に全移行(移行後は svn を使わない)。 http://blog.practical-scheme.net/shiro/20110226-sourceforge-git-migration を参考にした:

                                                                                                                                    1. subversion からの clone
                                                                                                                                      1. git repo の作成
                                                                                                                                        $ mkdir WORK; cd WORK
                                                                                                                                        $ git init
                                                                                                                                        $ $EDITOR .git/config   # 以下を追加
                                                                                                                                        [svn-remote "svn"]
                                                                                                                                          url = https://jjedgar.svn.sourceforge.net/svnroot/jjedgar
                                                                                                                                          fetch = trunk:refs/heads/master
                                                                                                                                          branches = branches/*:refs/heads/*
                                                                                                                                          tags = tags/*:refs/tags/*
                                                                                                                                      2. fetch。5分ほど続く:
                                                                                                                                        $ git svn fetch
                                                                                                                                        tag も branch も手元に来ているそうなので、確認:
                                                                                                                                        $ git tag
                                                                                                                                          :
                                                                                                                                        $ git branch
                                                                                                                                          :
                                                                                                                                        なるほど~。
                                                                                                                                      3. .git/config の [svn-remote "svn"] セクションを消す
                                                                                                                                    2. sf.netに git リポジトリを作成
                                                                                                                                      1. SF Top > Project Admin > Feature > Available Features で Git にチェック。 PROJECTNAME.git.sourceforge.net/gitroot/PROJECTNAME/PROJECTNAME というリポジトリが自動的に作成されている。 確認方法は下記:
                                                                                                                                        local$ ssh -t [MYNAME],jjedgar@shell.sourceforge.net create
                                                                                                                                        
                                                                                                                                        [MYNAME],jjedgar@shell.sourceforge.net's password: 
                                                                                                                                        
                                                                                                                                        Requesting a new shell for "[MYNAME]" and waiting for it to start.
                                                                                                                                        creating... starting...
                                                                                                                                        
                                                                                                                                        This is an interactive shell created for user [MYNAME],jjedgar.
                                                                                                                                        Use the "timeleft" command to see how much time remains before shutdown.
                                                                                                                                        Use the "shutdown" command to destroy the shell before the time limit.
                                                                                                                                        For path information and login help, type "sf-help".
                                                                                                                                        
                                                                                                                                        sf$ ls -l /home/scm_git/j/jj/jjedgar/
                                                                                                                                        /home/scm_git/j/jj/jjedgar/:
                                                                                                                                        total 8
                                                                                                                                        drwxrwsr-x 7 dummy jjedgar 1024 Jan 20  2009 jjedgar
                                                                                                                                        
                                                                                                                                        /home/scm_git/j/jj/jjedgar/jjedgar:
                                                                                                                                        total 24
                                                                                                                                        -rw-rw-r-- 1 dummy jjedgar  23 Jan 20  2009 HEAD
                                                                                                                                          :
                                                                                                                                    3. sf.net に push
                                                                                                                                      $ git remote add origin ssh://[MYNAME]@jjedgar.git.sourceforge.net/gitroot/jjedgar/jjedgar
                                                                                                                                      $ git config branch.master.remote origin
                                                                                                                                      $ git config branch.master.merge refs/heads/master
                                                                                                                                      $ git push origin master
                                                                                                                                      $ git push --all
                                                                                                                                      Everything up-to-date
                                                                                                                                      $ git push --tags
                                                                                                                                      Counting objects: 6, done.
                                                                                                                                      Compressing objects: 100% (6/6), done.
                                                                                                                                      Writing objects: 100% (6/6), 1.06 KiB, done.
                                                                                                                                      Total 6 (delta 4), reused 0 (delta 0)
                                                                                                                                      To ssh://[MYNAME]@jjedgar.git.sourceforge.net/gitroot/jjedgar/jjedgar
                                                                                                                                           * [new tag]         edgar-0.91.1 -> edgar-0.91.1
                                                                                                                                           * [new tag]         v0.01.00 -> v0.01.00
                                                                                                                                           * [new tag]         v0.02.00 -> v0.02.00
                                                                                                                                           * [new tag]         v0.03.00 -> v0.03.00
                                                                                                                                           * [new tag]         v0.92.0 -> v0.92.0
                                                                                                                                           * [new tag]         v0.92.1 -> v0.92.1
                                                                                                                                      up後は、sf から確認: Code > Git Browse > ...
                                                                                                                                    4. 移行に成功したかの確認も兼ね、pull してみる:
                                                                                                                                      $ mkdir new-work; cd new-work
                                                                                                                                      $ git clone ssh://[MYNAME]@jjedgar.git.sourceforge.net/gitroot/jjedgar/jjedgar

                                                                                                                                    [-] 6.2.2. /home/[MYNAME]

                                                                                                                                    ホームディレクトリを svn で管理することで、会社・家・ノートのファイルを 共有していたのだった。これを git に移行する(2011/05/12)。

                                                                                                                                    リポジトリ URL は svn+ssh://[MYNAME]@[MYHOST]/var/opt/svn/[MYNAME]/trunk なのだけれど、.git/config に指定するのは ...svn/[MYNAME] まで。 trunk まで指定してうまくいかないと悩んで http 経由を試したが その必要はなかった。

                                                                                                                                    1. central git repo の作成
                                                                                                                                      $ cd /var/opt
                                                                                                                                      $ sudo mkdir -p git/[MYNAME]
                                                                                                                                      $ sudo chown [MYNAME] git/[MYNAME]
                                                                                                                                      $ chmod go-rwx git/[MYNAME]
                                                                                                                                      $ cd git/[MYNAME]
                                                                                                                                      $ git init --bare
                                                                                                                                    2. push
                                                                                                                                      $ git remote add origin ssh://[MYNAME]@[MYHOST]/var/opt/git/[MYNAME]
                                                                                                                                      $ git config branch.master.remote origin
                                                                                                                                      $ git config branch.master.merge refs/heads/master
                                                                                                                                      $ git push origin master
                                                                                                                                      $ git push --all
                                                                                                                                      Everything up-to-date
                                                                                                                                      $ git push --tags
                                                                                                                                    3. 移行に成功したかの確認を兼ね、pull してみる:
                                                                                                                                      $ mkdir new-work; cd new-work
                                                                                                                                      $ git clone ssh://[MYHOST]/var/opt/git/[MYNAME]
                                                                                                                                    4. /home/[HYNAME] の移動:
                                                                                                                                      $ cd ~
                                                                                                                                      $ mkdir svn git       # svn = svn リポジトリ退避用、git = 一時pull用
                                                                                                                                      $ mv `svn ls` svn/    # svnリポジトリを svn/ に退避
                                                                                                                                      $ cd git
                                                                                                                                      $ git clone ssh://[MYNAME]@[MYHOST]/var/opt/git/[MYNAME]
                                                                                                                                      $ mv [MYNAME]/* ~/       # 取得した gitリポジトリを ~/ に移動
                                                                                                                                      $ mv [MYNAME]/.[a-z]* ~/ # (同上)
                                                                                                                                      (git status して、.gitignore を作成)
                                                                                                                                      (上で作成した svn/, git/ は近いうちに削除)

                                                                                                                                    [-] 6.2.3. iway.dip.jp での作業

                                                                                                                                    (httpでの git svn アクセスを試みたが、svn+ssh で git svn も動作するので、この節はもはや不要)

                                                                                                                                    1. リポジトリ URL は svn+ssh://[MYNAME]@[MYHOST]/var/opt/svn/[MYNAME]/trunk なのだけれど、これを直接 Edgar(前節)と同じように .git/config で指定しても動作しない。http URL となるよう、以下の作業を行う:
                                                                                                                                      $ sudo aptitude install libapache2-svn
                                                                                                                                    2. 設定ファイルの編集。
                                                                                                                                      repo$ sudo vi /etc/apache2/mods-enabled/dav_svn.conf
                                                                                                                                      
                                                                                                                                        DAV           svn
                                                                                                                                        SVNPath       /var/opt/svn/[MYNAME]/
                                                                                                                                        AuthType      Basic
                                                                                                                                        AuthName      "Subversion Repository"
                                                                                                                                        AuthUserFile  /etc/apache2/dav_svn.passwd
                                                                                                                                        Require user  [MYNAME]
                                                                                                                                      
                                                                                                                                      ポリシーは以下の通り:
                                                                                                                                      1. http://HOST/svn/ 下に 展開する。
                                                                                                                                      2. gitへの移行のためだけなので http + basic 認証で良しとする。
                                                                                                                                    注: Require user の行がないと認証しないでダダ漏れなので注意。
                                                                                                                                    また、念のため [MYNAME] ユーザだけに限定しておく。
                                                                                                                                    1. リポジトリファイル iway.dip.jp:/var/opt/svn/[MYNAME]/ を apache2 が 読めるよう、www-data ユーザ(apache2 プロセス)を [MYGROUP] グループに追加:
                                                                                                                                      $ sudo adduser www-data [MYGROUP]
                                                                                                                                      また、/var/opt/svn/[MYNAME]/ の permission も、[MYGROUP] グループは通過できるよう 緩和:
                                                                                                                                      $ chmod g=rx /var/opt/svn/[MYNAME]
                                                                                                                                    2. basic認証の設定
                                                                                                                                      $ sudo htpasswd -c /etc/apache2/dav_svn.passwd [MYNAME]
                                                                                                                                      $ sudo /etc/init.d/apache2 restart

                                                                                                                                    URL は http://iway.dip.jp/svn となる。

                                                                                                                                    注: http://iway.dip.jp/svn/trunk は間違い。これを .git/config に 指定すると、エラーも出さず何も fetch しないで終わってしまう。 この後 .git/config の url エントリーを訂正しても変わらない。 git init からやり直しが必要。

                                                                                                                                    (この節不要になったので、sudo a2dismod dav_svn して svn への アクセスは止めておく)

                                                                                                                                    [-] 6.3. svn リポジトリとの連携

                                                                                                                                    git svn clone --stdlayout SVN_REPO_URL

                                                                                                                                    [-] 6.3.1. svnでの認証

                                                                                                                                    以下の環境に遭遇:

                                                                                                                                    1. svnリポジトリはcommit時に認証が必要(svn up では要らない)。
                                                                                                                                    2. firewall越しに socks 経由で tsocks git svn rebase しようとしてハング。

                                                                                                                                    理由は、svn が認証を求めていたからのようだ。

                                                                                                                                    fireall の中で git svn rebase するとパスワードを聞かれたので、入力。 すると、~/.subversion/auth/svn.simple/ に保存された。おそらく以降では firewall越しでも svn リポジトリに push できると思う。 これで家で仕事がますますできるようになった(^_^)

                                                                                                                                    [-] 6.3.2. svn ブランチにのみ git を使う方法。

                                                                                                                                    大きい某プロジェクトの trunk を git-svn すると最初の clone に 30分ほどかかって 非常に遅いので、この方法を試す。この方法だと数分でできる。

                                                                                                                                    [-] 6.3.2.1. git 1.7以降?
                                                                                                                                    1. git svn init する。ここで BRANCH_PROJ はsvnの特定のブランチに対して のみ git を使うための、任意のサブディレクトリ名。http://... は svnリポジトリURL:
                                                                                                                                      $ mkdir BRANCH_PROJ
                                                                                                                                      $ cd BRANCH_PROJ
                                                                                                                                      $ git svn init http://...
                                                                                                                                    2. fetch & rebase:
                                                                                                                                      $ git svn fetch
                                                                                                                                      $ git svn rebase
                                                                                                                                      (もしかするとどちらか一方でもいいのかもしれないがよく分かってない)
                                                                                                                                    [-] 6.3.2.2. git 1.6以前?

                                                                                                                                    (注: git 1.7.0.4 で次節の方法を行おうとすると fetch 時に以下のエラーが出る:)

                                                                                                                                    Migrating from a git-svn v1 layout...
                                                                                                                                    Data from a previous version of git-svn exists, but
                                                                                                                                          .git/svn
                                                                                                                                          (required for this version (1.7.0.4) of git-svn) does not exist.
                                                                                                                                    Done migrating from a git-svn v1 layout
                                                                                                                                          A       version
                                                                                                                                          A       mkdist
                                                                                                                                    1. git リポジトリを作成。ここで BRANCH_PROJ はsvnの特定のブランチに対して のみ git を使うための、任意のサブディレクトリ名:
                                                                                                                                      $ mkdir BRANCH_PROJ
                                                                                                                                      $ cd BRANCH_PROJ
                                                                                                                                      $ git init
                                                                                                                                    2. .git/config にブランチを定義。ここで BRANCH はsvnのブランチ名:
                                                                                                                                      [svn-remote "BRANCH"]
                                                                                                                                        url = https://HOST/SVN/branches/BRANCH
                                                                                                                                        fetch = :refs/remotes/git-svn-BRANCH
                                                                                                                                    3. SVN branch のインポート. SVN_BRANCHED_REVISION は SVN bransh が作成された 時の revision:
                                                                                                                                      $ git svn fetch BRANCH -r SVN_BRANCHED_REVISION
                                                                                                                                                                        #例: 2463 (mobile_felica)
                                                                                                                                      svn log すればすぐに見つかる。 BRANCH は上の .git/config で定義した名前
                                                                                                                                    4. ローカル Git branch とリモートブランチの関連付け:
                                                                                                                                      $ git branch --track local_BRANCH git-svn-BRANCH
                                                                                                                                    5. チェックアウト & 更新
                                                                                                                                      $ git checkout local_BRANCH
                                                                                                                                      $ git svn rebase

                                                                                                                                    詳細: http://stackoverflow.com/questions/4291347/git-svn-import-only-branch

                                                                                                                                    [-] 6.3.3. svn のサブディレクトリに git を使う方法

                                                                                                                                    下の方法でうまくいかなかったのは、git svn rebase と dcommit を間違えていたからかも:

                                                                                                                                    上の方法を 某 svn repo に対して試みたが、commit (git svn rebase)が動作しない。 そこで、別の方法を試す:

                                                                                                                                    $ git svn init -T SVN_REPO_SUBDIR
                                                                                                                                    $ git svn fetch

                                                                                                                                    [-] 6.4. svnとの比較

                                                                                                                                    コミット

                                                                                                                                    svn commit                              git commit
                                                                                                                                                                            git svn dcommit

                                                                                                                                    リポジトリの反映

                                                                                                                                    svn up[date]                            git svn rebase

                                                                                                                                    作業ファイルの破棄

                                                                                                                                    svn revert ...                          git checkout filename
                                                                                                                                                                            git reset --hard HEAD

                                                                                                                                    diff

                                                                                                                                    svn diff -c rev                         git show COMMIT-ID

                                                                                                                                    [-] 6.5. gitに乗り換えた理由

                                                                                                                                    1. pager がサポートされているので、いちいち svn log ... | lv とかしなくて済む。
                                                                                                                                    2. git grep がサポートされている。
                                                                                                                                    3. log コマンドが速い
                                                                                                                                    4. で移動中などの offline 環境でもコミットできる。
                                                                                                                                    5. merge が簡単

                                                                                                                                    上から重要度 高→低 の順。git の特徴である「merge が簡単」という点は、 まだそれほど使ってないので実感したメリットとしてはそれほど高くない。 でも、svn の merge は確かに苦痛だったなぁ。 だからここに挙げないわけにはいかないな、やはり。

                                                                                                                                    分散型、という点は、直接には体感できてないのだけど、3. 4. は 分散型だからこそできるわけなので、これはやはり大きい。

                                                                                                                                    [-] 7. 勉強

                                                                                                                                    あらためて git の分かってない所を勉強。

                                                                                                                                    1. origin = リモートリポジトリのデフォルト名。
                                                                                                                                      • url と fetch 形態(例: fetch = +refs/heads/*:refs/remotes/origin/*) に 付けられた名前。 当然、origin 以外に名付けることも可能。
                                                                                                                                    2. master = 手元の最初のブランチ名。





                                                                                                                                    Generated by juli 2.3.2