かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Git Submoduleのディレクトリを変更したい

サブモジュールのディレクトリを変更するのにハマったのでメモ。

EX
環境: git version 2.12.2

サブモジュールの追加

$ git submodule add git@my_module.git

追加した my_modulevendor/my_module に移動させたい。

1. ディレクトリを変更する方法

  1. .gitmodules を開いて[submodule] と path= の2箇所のパスを変更
    [submodule “vendor/my_module”]
       path = vendor/my_module
       url = git@module.git
    
    $ git add .gitmodules
  2. サブモジュールを移動させる
    $ mk dir vendor
    $ mv -vi my_module vendor/my_module
    
  3. 旧サブモジュールのGit管理対象から除外する
    $ git rm –cached my_module
  4. .git/modules にあるサブモジュールを変更するパスと同じ状態に変更する
    1. vendorディレクトリを作成し、my_modulevendor内に移動させる
    2. .git/modules/vendor/my_module/config を編集
      worktree= に続く相対パスを移動させたサブモジュールになうるように変更 (ディレクトリを変更したら../の数に気をつける)
      worktree = ../../../../vendor/my_module
  5. サブモジュールの指定されているパスを変更
    vendor/my_module/.gitをエディタで開きgitdir:に続く相対パス4.で移動させたmy_moduleになるように変更する (ディレクトリを変更したら../の数に気をつける)
    gitdir: ../../.git/modules/vendor/my_module
  6. .git/configに記述されているサブモジュールのパスを変更する
    [submodule “vendor/my_module”]
     url = git@github.com:chaika-design/my_module.git
    
  7. 新しいサブモジュールのディレクトリをgit管理下に追加
    $ git add vendor
  8. 変更状態を確認
    $ git status
    On branch master
    Changes to be committed:
     (use “git reset HEAD …” to unstage)
    modified: .gitmodules renamed: my_module -> vendor/my_module
    サブモジュールがrenamedになっていればOK
    .git/modules/vendor/my_module/configvendor/my_module/.gitのパスを間違えているとgit statusした時にfatal: Could not chdirというエラーが出るのでその場合はパスを見直す
  9. 問題がなければ変更をコミット
    $ git commit
    $ git submodule status
    b5852af17275cXXXXX vendor/my_module (heads/master)
    
    わーい。できた〜!

2. サブモジュールを一度削除して再登録する方法

  1. サブモジュールの登録を解除
    $ git submodule deinit my_module
    .git/configからsubmoduleの設定が消える
  2. サブモジュールの削除
    $ git rm my_module
    .gitmodulesに記入されたsubmoduleの指定とサブモジュールのディレクトリが消える
  3. $ git commitでサブモジュールの削除をコミット
  4. 再度変更したいディレクトリを指定してサブモジュールを追加
    $ git submodule add git@my_module.git vendor/my_module

 
Git Submodule クセが強すぎて辛い。不用意にgit resetとかするとハマりまくる… ディレクトリの変更がうまくいかない場合は、サブモジュールを削除したコミットログが残ってしまいますが一度git submodule deinitでサブモジュールを削除して、再度変更するディレクトリにgit submodule add する方が楽かもしれないと思いました。(ディレクトリ変更の方法だと手順も多いし… )

 
記事内容とは関係ないけれど、
はてなブログのマークダウンでリスト内にコードブロックを書く方法が知りたい…
直接HTML書いてるんだけど……. つらい


[参考]