내 버전의 Git [1] 에서는 모든 Git 하위 모듈에 a name
및 a가 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
내 접근 방식에서 나는 시도 하지 의 출력을 처리하기 git config --get-regexp
에 awk
, tr
, sed
, ... 대신이 0 바이트가 다시 분리 통과 git config --get
. 이것은 서브 모듈의 개행, 공백 및 기타 특수 문자 (예 : 유니 코드)와 관련된 문제를 피하기위한 것입니다 paths
. 또한 추가 쉘 처리에이 목록을 사용하고자하므로 아래 솔루션은 NULL
-bytes ( \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 --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
git submodule
동작합니다 나는 가상의 예상대로git submodule list
행동 - 나는 단지와 무슨 일 확인 생각해 본 적이 없는 인수git submodule
. (처음에 잘못된 '공유'링크를 잡았 기 때문에 나는 그 링크를 테스트했습니다.)