296

いくつかのサブモジュールを含むGitリポジトリがあります。実行後にすべてのサブモジュールの名前を一覧表示するにはどうすればよいgit submodule initですか?

このgit submodule foreachコマンドはサブモジュールの名前をエコーする可能性がありますが、それは、initステップの後で発生していない、チェックアウトされた後にのみ機能します。チェーンには、チェックアウトする前に実行する必要のあるステップが他にもあります。サブモジュールの名前をスクリプトに固定する必要はありません。

では、現在登録されているがまだチェックアウトされていないすべてのサブモジュールの名前を取得するGitコマンドはありますか?

4

19 に答える 19

218

それ自体を使用するのと同じメカニズムをgit submodule init使用できます。つまり、を見てください.gitmodules。このファイルは、各サブモジュールパスとそれが参照するURLを列挙します。

たとえば、リポジトリのルートから、cat .gitmodulesコンテンツを画面に出力します(あなたが持っていると仮定しますcat)。

.gitmoduleファイルにはGit構成形式があるため、gitconfigを使用してこれらのファイルを解析できます。

git config --file .gitmodules --name-only --get-regexp path

すべてのサブモジュールエントリを表示します

git config --file .gitmodules --get-regexp path | awk '{ print $2 }'

サブモジュールパス自体のみを取得します。

于 2012-09-28T14:16:46.240 に答える
161

ネストされたサブモジュールを表示する場合はgit submodule status、またはオプションで使用できます。git submodule status --recursive

Gitのドキュメントから:

サブモジュールのステータスを表示します。これにより、サブモジュールのパスとSHA-1のgit describeの出力とともに、各サブモジュールの現在チェックアウトされているコミットのSHA-1が出力されます。各SHA-1には、サブモジュールが初期化されていない場合は-、現在チェックアウトされているサブモジュールのコミットが含まれているリポジトリのインデックスにあるSHA-1と一致しない場合は+、サブモジュールにマージの競合がある場合はUのプレフィックスが付きます。

于 2014-05-06T09:25:00.590 に答える
74

次のコマンドは、サブモジュールを一覧表示します。

git submodule--helper list

出力は次のようになります。

<mode> <sha1> <stage> <location>

注:Git2.7.0以降が必要です。

于 2016-11-29T23:01:59.910 に答える
62

登録されたサブモジュールの名前だけを返すには、次のコマンドを使用できます。

grep path .gitmodules | sed 's/.*= //'

git submodule --list存在しないものと考えてください。

于 2013-06-17T21:48:36.713 に答える
34

使用する:

$ git submodule

指定されたGitリポジトリ内のすべてのサブモジュールが一覧表示されます。

于 2014-09-28T10:31:58.093 に答える
17

私はこれを使用します:

git config --list|egrep ^submodule
于 2013-06-13T13:32:25.757 に答える
17

この質問への回答で提供されたコマンドが、私が探していた情報を私に与えてくれたことに気づきました。

サブモジュールではないパスの.gitmoduleにサブモジュールマッピングが見つかりません

git ls-files --stage | grep 160000
于 2014-06-09T14:21:50.393 に答える
15

初期化されたサブモジュールのみを操作してもかまわない場合は、git submodule foreachテキストの解析を回避するために使用できます。

git submodule foreach --quiet 'echo $name'
于 2017-07-05T18:45:30.637 に答える
10

次を使用できます。

git submodule | awk '{ print $2 }'
于 2014-12-21T22:11:31.437 に答える
9

すべてのサブモジュールを名前で一覧表示するには:

git submodule --quiet foreach --recursive 'echo $name'

于 2018-01-27T07:30:03.430 に答える
8

私はこれを使用します:

git submodule status | cut -d' ' -f3-4 

出力(パス+バージョン):

tools/deploy_utils (0.2.4)
于 2013-10-29T13:14:30.183 に答える
8

これは私のために働いた:

git ls-files --stage | grep ^160000

これは、このすばらしい記事に基づいています:Gitサブモジュールを理解する

読む必要がありますgrep ^160000

于 2015-03-29T03:08:52.940 に答える
5

サブモジュールパスだけをお願いします、奥様...

git config --list | grep \^submodule | cut -f 2 -d .
Vendor/BaseModel
Vendor/ObjectMatcher
Vendor/OrderedDictionary
Vendor/_ObjC
Vendor/XCodeHelpers

于 2015-06-02T18:25:17.793 に答える
5

git config設定ファイルを指定できます。
そして、設定ファイルです.gitmodules

したがって、「カットコマンドで区切り文字としてスペースを使用する」の助けを借りて:

git config --file=.gitmodules --get-regexp ^^submodule.*\.path$ | cut -d " " -f 2

宣言されたサブモジュールごとに1つずつ、パスのみが一覧表示されます。

ティノがコメントで指摘しているように:

  • これは、スペースを含むサブモジュールでは失敗します。
  • サブモジュールパスには、次のように改行を含めることができます

    git submodule add https://github.com/hilbix/bashy.git "sub module"
      git mv 'sub module' $'sub\nmodule'
    

より堅牢な代替手段として、Tinoは次のことを提案します。

git config -z --file .gitmodules --get-regexp '\.path$' | \
  sed -nz 's/^[^\n]*\n//p' | \
  tr '\0' '\n' 

改行を含むパス(で作成できますgit mv)の場合は、を省略して、bashでさらに処理するための| tr '\0' '\n'ようなものを使用します。 これには、理解できる最新のbashが必要です(間のスペースを忘れないでください)。... | while IFS='' read -d '' path; do ...
read -d ''-d and ''

于 2015-07-29T09:02:46.117 に答える
4

組み込みのgit関数を使用して、各サブモジュールに関するすべての情報を表示します。

git submodule foreach -q git config -l

または単にURL-s:

git submodule foreach -q git config remote.origin.url

ここから盗まれました。

于 2021-01-26T12:53:47.950 に答える
3

私のバージョンのGit [1]では、すべてのGitサブモジュールにnameとがありpathます。それらは必ずしも同じである必要はありません[2]。最初にサブモジュールをチェックアウトせずに(git update --init)、信頼できる方法で両方を取得することは、シェルの魔法のトリッキーなビットです。

サブモジュールのリストを取得するnames

git configまたは他のgitコマンドを使用してこれを実現する方法が見つかりませんでした。したがって、正規表現に戻ります.gitmodules(非常に醜い)。gitただし、サブモジュールに許可される可能なコードスペースが制限されるため、ある程度安全なようですnames。さらに、このリストをさらにシェル処理に使用する可能性があるため、以下のソリューションでは、エントリをNULL-bytes(\0)で区切ります。

$ sed -nre \
  's/^\[submodule \"(.*)\"]$/\1\x0/p' \
  "$(git rev-parse --show-toplevel)/.gitmodules" \
| tr -d '\n' \
| xargs -0 -n1 printf "%b\0"

そしてあなたのスクリプトで:

#!/usr/bin/env bash

while IFS= read -rd '' submodule_name; do
  echo submodule name: "${submodule_name}"
done < <(
  sed -nre \
    's/^\[submodule \"(.*)\"]$/\1\x0/p' \
    "$(git rev-parse --show-toplevel)/.gitmodules" \
  | tr -d '\n' \
  | xargs -0 -n1 printf "%b\0"
)

read -rd ''が必要bashであり、では機能しませんsh

サブモジュールのリストを取得するpaths

私のアプローチでは、、、、 ...での出力を処理しないようにしますが、代わりに、に分離されたゼロバイトを渡します。これは、サブモジュール内の改行、スペース、およびその他の特殊文字(Unicodeなど)の問題を回避するためです。さらに、このリストをさらにシェル処理に使用する可能性があるため、以下のソリューションでは、エントリを-bytes()で区切ります。git config --get-regexpawktrsedgit config --getpathsNULL\0

$ git config --null --file .gitmodules --name-only --get-regexp '\.path$' \
| xargs -0 -n1 git config --null --file .gitmodules --get

たとえば、Bashスクリプトでは、次のことができます。

#!/usr/bin/env bash

while IFS= read -rd '' submodule_path; do
  echo submodule path: "${submodule_path}"
done < <(
  git config --null --file .gitmodules --name-only --get-regexp '\.path$' \
  | xargs -0 -n1 git config --null --file .gitmodules --get
)

read -rd ''が必要bashであり、では機能しませんsh


脚注

[1] Gitバージョン

$ git --version
git version 2.22.0

[2]発散nameおよびpath

テストリポジトリを設定します。

$ git init test-name-path
$ cd test-name-path/
$ git checkout -b master
$ git commit --allow-empty -m 'test'
$ git submodule add ./ submodule-name
Cloning into '/tmp/test-name-path/submodule-name'...
done.
$ ls
submodule-name

$ cat .gitmodules
[submodule "submodule-name"]
    path = submodule-name
    url = ./

サブモジュールを移動して作成nameおよびpath分岐します。

$ git mv submodule-name/ submodule-path

$ ls
submodule-path

$ cat .gitmodules
[submodule "submodule-name"]
    path = submodule-path
    url = ./

$ git config --file .gitmodules --get-regexp '\.path$'
submodule.submodule-name.path submodule-path

テスト

テストリポジトリを設定します。

$ git init test
$ cd test/
$ git checkout -b master
$ git commit --allow-empty -m 'test'
$
$ git submodule add ./ simplename
Cloning into '/tmp/test/simplename'...
done.
$
$ git submodule add ./ 'name with spaces'
Cloning into '/tmp/test/name with spaces'...
done.
$
$ git submodule add ./ 'future-name-with-newlines'
Cloning into '/tmp/test/future-name-with-newlines'...
done.
$ git mv future-name-with-newlines/ 'name
> with
> newlines'
$
$ git submodule add ./ 'name-with-unicode-'
Cloning into '/tmp/test/name-with-unicode-'...
done.
$
$ git submodule add ./ sub/folder/submodule
Cloning into '/tmp/test/sub/folder/submodule'...
done.
$
$ git submodule add ./ name.with.dots
Cloning into '/tmp/test/name.with.dots'...
done.
$
$ git submodule add ./ 'name"with"double"quotes'
Cloning into '/tmp/test/name"with"double"quotes'...
done.
$
$ git submodule add ./ "name'with'single'quotes"
Cloning into '/tmp/test/name'with'single'quotes''...
done.
$ git submodule add ./ 'name]with[brackets'
Cloning into '/tmp/test/name]with[brackets'...
done.
$ git submodule add ./ 'name-with-.path'
Cloning into '/tmp/test/name-with-.path'...
done.

.gitmodules

[submodule "simplename"]
    path = simplename
    url = ./
[submodule "name with spaces"]
    path = name with spaces
    url = ./
[submodule "future-name-with-newlines"]
    path = name\nwith\nnewlines
    url = ./
[submodule "name-with-unicode-"]
    path = name-with-unicode-
    url = ./
[submodule "sub/folder/submodule"]
    path = sub/folder/submodule
    url = ./
[submodule "name.with.dots"]
    path = name.with.dots
    url = ./
[submodule "name\"with\"double\"quotes"]
    path = name\"with\"double\"quotes
    url = ./
[submodule "name'with'single'quotes"]
    path = name'with'single'quotes
    url = ./
[submodule "name]with[brackets"]
    path = name]with[brackets
    url = ./
[submodule "name-with-.path"]
    path = name-with-.path
    url = ./

サブモジュールのリストを取得するnames

$ sed -nre \
  's/^\[submodule \"(.*)\"]$/\1\x0/p' \
  "$(git rev-parse --show-toplevel)/.gitmodules" \
| tr -d '\n' \
| xargs -0 -n1 printf "%b\0" \
| xargs -0 -n1 echo submodule name:
submodule name: simplename
submodule name: name with spaces
submodule name: future-name-with-newlines
submodule name: name-with-unicode-
submodule name: sub/folder/submodule
submodule name: name.with.dots
submodule name: name"with"double"quotes
submodule name: name'with'single'quotes
submodule name: name]with[brackets
submodule name: name-with-.path

サブモジュールのリストを取得するpaths

$ git config --null --file .gitmodules --name-only --get-regexp '\.path$' \
| xargs -0 -n1 git config --null --file .gitmodules --get \
| xargs -0 -n1 echo submodule path:
submodule path: simplename
submodule path: name with spaces
submodule path: name
with
newlines
submodule path: name-with-unicode-
submodule path: sub/folder/submodule
submodule path: name.with.dots
submodule path: name"with"double"quotes
submodule path: name'with'single'quotes
submodule path: name]with[brackets
submodule path: name-with-.path
于 2019-07-06T09:42:43.617 に答える
1

ファイルがない.gitmodulesが、サブモジュール構成が次の場所に存在する場合.git/modules/

find .git/modules/ -name config -exec grep url {} \;
于 2018-07-25T10:36:14.887 に答える
0

これは、sedや派手なIFS設定を必要とせずに、.gitmodulesからGitサブモジュール名を解析する別の方法です。:-)

#!/bin/env bash

function stripStartAndEndQuotes {
  temp="${1%\"}"
  temp="${temp#\"}"
  echo "$temp"
}

function getSubmoduleNames {
  line=$1
  len=${#line} # Get line length
  stripStartAndEndQuotes "${line::len-1}" # Remove last character
}

while read line; do
  getSubmoduleNames "$line"
done < <(cat .gitmodules | grep "\[submodule.*\]" | cut -d ' ' -f 2-)
于 2019-07-06T14:17:04.783 に答える
0

パスを取得するには

grep url .gitmodules | sed 's/.*= //'

レポのように名前を取得するには

grep path .gitmodules | sed 's/.*= //'
于 2020-08-27T06:41:16.283 に答える