Git [1] के मेरे संस्करण में , हर Git सबमॉड्यूल में a name
और a है path
। जरूरी नहीं कि वे एक ही हों [2] । पहले सबमॉडल्स की जांच किए बिना, विश्वसनीय तरीके से दोनों प्राप्त करना (git update --init
), शेल विज़ार्डरी का एक मुश्किल सा है।
सबमॉड्यूल की एक सूची प्राप्त करें names
मुझे यह कैसे git config
या किसी अन्य git
कमांड का उपयोग करके प्राप्त करने का तरीका नहीं मिला । इसलिए हम वापस .gitmodules
(सुपर बदसूरत) regex करने के लिए कर रहे हैं । लेकिन यह 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
, ... लेकिन इसके बजाय पारित यह एक शून्य बाइट के लिए वापस अलग 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
उदाहरण के लिए, एक बैश स्क्रिप्ट में आप तब कर सकते हैं:
#!/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
।
फुटनोट
[१] गिट संस्करण
$ git --version
git version 2.22.0
[२] सबमॉड्यूल में विचलन 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
। (खुशी है कि मैंने उस लिंक का परीक्षण किया, क्योंकि मैंने शुरू में गलत 'शेयर' लिंक को पकड़ा था!)