Trong phiên bản Git của tôi [1] , mọi mô hình con Git đều có a name
và a path
. Họ không nhất thiết phải giống nhau [2] . Nhận cả hai theo một cách đáng tin cậy, mà không cần kiểm tra các mô hình con đầu tiên ( git update --init
), là một mẹo nhỏ của thuật sĩ vỏ.
Lấy một danh sách các mô hình con names
Tôi đã không tìm ra cách để đạt được điều này bằng cách sử dụng git config
hoặc bất kỳ git
lệnh nào khác . Vì vậy, chúng tôi trở lại regex trên .gitmodules
(siêu xấu xí). Nhưng nó có vẻ an toàn vì git
giới hạn không gian mã có thể được phép cho mô hình con names
. Ngoài ra, vì bạn có thể muốn sử dụng danh sách này để xử lý shell hơn nữa, giải pháp bên dưới các mục riêng biệt với 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"
Và trong kịch bản của bạn:
#!/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"
)
Lưu ý : read -rd ''
yêu cầu bash
và sẽ không làm việc với sh
.
Lấy một danh sách các mô hình con paths
Trong cách tiếp cận của tôi, tôi cố gắng không để xử lý đầu ra từ git config --get-regexp
với awk
, tr
, sed
, ... nhưng thay vì vượt qua nó một byte không tách ra trở lại git config --get
. Điều này là để tránh các vấn đề với dòng mới, dấu cách và các ký tự đặc biệt khác (ví dụ Unicode) trong mô hình con paths
. Ngoài ra, vì bạn có thể muốn sử dụng danh sách này để xử lý shell hơn nữa, giải pháp bên dưới các mục riêng biệt với NULL
-bytes ( \0
).
$ git config --null --file .gitmodules --name-only --get-regexp '\.path$' \
| xargs -0 -n1 git config --null --file .gitmodules --get
Ví dụ: trong tập lệnh Bash, bạn có thể:
#!/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
)
Lưu ý : read -rd ''
yêu cầu bash
và sẽ không làm việc với sh
.
Chú thích
[1] Phiên bản Git
$ git --version
git version 2.22.0
[2] Submodule với phân kỳ name
vàpath
Thiết lập kho kiểm tra:
$ 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 = ./
Di chuyển mô hình con để thực hiện name
và path
phân kỳ:
$ 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
Kiểm tra
Thiết lập kho kiểm tra:
$ 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 = ./
Nhận danh sách các mô hình con 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
Nhận danh sách các mô hình con 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
hành vi như tôi mong đợi là một giả thuyếtgit submodule list
để hành xử - tôi chỉ không bao giờ nghĩ sẽ kiểm tra những gì xảy ra mà không có tranh luậngit submodule
. (Vui mừng vì tôi đã kiểm tra liên kết đó, vì ban đầu tôi đã lấy liên kết 'Chia sẻ' sai!)