@kyanny's blog

My thoughts, my life. Views/opinions are my own.

git clone --recursive と git clone --recurse-submodules は同じ

そもそものきっかけ。リポジトリの clone と同時に submodule も clone する git clone --recursive というオプションがあると知った。

確かに git clone --recursive でうまくいったが、 man git-clone を読んでも --recursive オプションの記載がない。 recursive という単語は --recurse-submodules オプションの説明中に出てくる。

マニュアルに載っていないということは非公開オプション?使って大丈夫なのか?そもそもなんで載ってないの?載ってない --recursive オプションが広く普及してるのはなぜ?そして二つのオプションの違いは?

同じ疑問を持った人がいた。

エイリアスであることを突き止めた人のコメントと、根拠となるソースコード。

Git 2.27.0 調べ。 --recursive-h には出てくるけど man git-clone には載っていない。 man より -h の方が頻繁に見るだろうから、 --recursive オプションが普及している理由はこれだろう。

# git clone -h

    --recurse-submodules[=<pathspec>]
                          initialize submodules in the clone
    --recursive[=<pathspec>]
                          alias of --recurse-submodules
# man git-clone

       --recurse-submodules[=<pathspec]
           After the clone is created, initialize and clone submodules within based on the provided pathspec.
           If no pathspec is provided, all submodules are initialized and cloned. This option can be given
           multiple times for pathspecs consisting of multiple entries. The resulting clone has
           submodule.active set to the provided pathspec, or "." (meaning all submodules) if no pathspec is
           provided.

           Submodules are initialized and cloned using their default settings. This is equivalent to running
           git submodule update --init --recursive <pathspec> immediately after the clone is finished. This
           option is ignored if the cloned repository does not have a worktree/checkout (i.e. if any of
           --no-checkout/-n, --bare, or --mirror is given)

git submodule コマンドの方で同じこともできる(というか git submodule のやり方が先にあり git clone のオプションが後付けされた)

$ git submodule update --init --recursive

git cloneしたあとに--recursiveを付け忘れたことに気づいた。あとからsubmoduleをcloneしたい。 - 君は心理学者なのか?


余談。 docker run -it --rm ubuntu bash の中で最新版の Git を使いたかった。

ubuntuのapt-getで最新版のgitをインストールする方法 - spangled shalalala blog

↑のあと man git-clone すると↓のようなメッセージが出た。

# man git-clone
This  system  has been minimized by removing packages and content
that are not required on a system that users do not log into.

To restore this content, including manpages, you can run the ’un‐
minimize’  command.  You  will  still need to ensure the ’man‐db’
package is installed.

言われた通りにする。

# unminimize
# apt install man-db

これで無事に man git-clone で読めるようになった。