Gitサブモジュールを移動する一番簡単な方法は?

少なくとも私の環境 Git for Windows 2.7.0-windows.1 で、Git のサブモジュールのパスを移動するには、おなじみ git mv だけで事足りてます。

昔は大変だったんだよね

Gitのサブモジュールは扱いにくいと言われてきました。

場所を移動したり、削除したりする時、手操作でいろいろやらないとリポジトリが変な状態になってしまったりして困ってました。

今回、サブモジュールを別のディレクトリに移す必要が生じて極度の緊張。
怖れをなしてインターネッツで検索すると、それ見たことか「いろんなファイルをいじり倒さないといけません」と。

直感的には git mv でお願いしたい

その手順があまりにややこしくてげんなりしました。

「直感的には git mv なんだがなあ・・・」と愚痴が出たので、モノは試しとやってみたら大成功。

Gitのversionは、、、

$ git version
git version 2.17.0.windows.1

最近のGitでは改善されてたようですね。

いつから有効なのかは不明です。
少なくとも最新版にすれば問題ないと思います。

サブモジュールの移動例

以下は、既存のサブモジュールを別ディレクトリに移動する例。.gitsubmodulesもきちんと更新されますよ。

$ git submodule #移動前のサブモジュールを確認(hashは省略)
 ********** org-dir/sub-mod (***********)

$ mkdir dst-dir/ # 移動先ディレクトリの作成

$ git mv org-dir/sub-mod dst-dir/ # 移動(warningは無視)
warning: LF will be replaced by CRLF in .gitmodules.
The file will have its original line endings in your
working directory.

$ git submodule #移動後のサブモジュールの確認(hashは省略)
 ********** dst-dir/sub-mod (***********)

$ git status # 変更点の確認
On branch mv-sub-mod
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   .gitmodules
        renamed:    org-dir/sub-mod -> dst-dir/sub-mod
        
$ git diff --staged
diff --git a/.gitmodules b/.gitmodules
index *******..******* *******
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,4 +1,4 @@
 [submodule "sub-mod"]
-   path = org-dir/sub-mod
+   path = dst-dir/sub-mod
    url = ssh://git@xxx.xxx.xxx.xxx/yyy/zzz.git
    branch = mv-sub-mod
(略)

サブモジュールの名前変更

サブモジュールのディレクトリ名を変えるのも同じく可能です。

$ git submodule
 ********** org-dir/sub-mod (***********)

$ mkdir dst-dir/

$ git mv org-dir/sub-mod dst-dir/submod2
()
$ git status # 変更点の確認
On branch mv-sub-mod
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   .gitmodules
        renamed:    org-dir/sub-mod -> dst-dir/submod2

ということで

とりあえず最近のGitでサブモジュールの場所を移動したり名前を変えたりするには、git mv で充分ですって話でした。.gitsubmodulesもちゃんと更新してくれます。

0 件のコメント: