In meiner Version von Git [1] hat jedes Git-Submodul ein name
und ein path
. Sie müssen nicht unbedingt gleich sein [2] . Beides auf zuverlässige Weise zu erhalten, ohne zuerst die Submodule zu überprüfen ( git update --init
), ist eine schwierige Aufgabe der Shell-Zauberei.
Holen Sie sich eine Liste der Submodule names
Ich habe keinen Weg gefunden, dies mit git config
einem anderen git
Befehl zu erreichen. Deshalb sind wir wieder bei Regex .gitmodules
(super hässlich). Es scheint jedoch etwas sicher zu sein, da git
der mögliche Codebereich für das Submodul begrenzt ist names
. Da Sie diese Liste wahrscheinlich für die weitere Shell-Verarbeitung verwenden möchten, werden in der folgenden Lösung Einträge mit NULL
-bytes ( \0
) getrennt.
$ sed -nre \
's/^\[submodule \"(.*)\"]$/\1\x0/p' \
"$(git rev-parse --show-toplevel)/.gitmodules" \
| tr -d '\n' \
| xargs -0 -n1 printf "%b\0"
Und in Ihrem Skript:
#!/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"
)
Hinweis : read -rd ''
erfordert bash
und funktioniert nicht mit sh
.
Holen Sie sich eine Liste der Submodule paths
In meinem Ansatz versuche ich nicht die Ausgabe von zu verarbeiten git config --get-regexp
mit awk
, tr
, sed
, ... , sondern gebe es einen Null - Byte wieder getrennt git config --get
. Dies dient dazu, Probleme mit Zeilenumbrüchen, Leerzeichen und anderen Sonderzeichen (z. B. Unicode) im Submodul zu vermeiden paths
. Da Sie diese Liste wahrscheinlich für die weitere Shell-Verarbeitung verwenden möchten, werden in der folgenden Lösung Einträge mit NULL
-bytes ( \0
) getrennt.
$ git config --null --file .gitmodules --name-only --get-regexp '\.path$' \
| xargs -0 -n1 git config --null --file .gitmodules --get
In einem Bash-Skript könnten Sie beispielsweise Folgendes tun:
#!/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
)
Hinweis : read -rd ''
erfordert bash
und funktioniert nicht mit sh
.
Fußnoten
[1] Git-Version
$ git --version
git version 2.22.0
[2] Submodul mit divergierenden name
undpath
Test-Repository einrichten:
$ 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 = ./
Verschieben Sie das Submodul, um Folgendes zu erstellen name
und zu path
trennen:
$ 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
Testen
Test-Repository einrichten:
$ 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 = ./
Liste der Submodule abrufen 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
Liste der Submodule abrufen 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
git submodule
sich so verhält, wie ich es von einer Hypothese erwartet hattegit submodule list
- ich hätte einfach nie gedacht zu überprüfen, was ohne Argumente passiertgit submodule
. (Ich bin froh, dass ich diesen Link getestet habe, da ich anfangs den falschen 'Share'-Link gefunden habe!)