আমার গীত [1] এর সংস্করণে , প্রতিটি গিট সাবমোডিয়ুলের a nameএবং a রয়েছে path। অগত্যা তাদের একই হতে হবে না [2] । প্রথমে সাবমডিউলগুলি পরীক্ষা না করেই (উভয়কেই নির্ভরযোগ্য উপায়ে পাওয়া git update --init) শেল উইজার্ডারি a
সাবমডিউলের একটি তালিকা পান names
কীভাবে git configবা অন্য কোনও gitকমান্ড ব্যবহার করে এটি অর্জন করার উপায় খুঁজে পেলাম না । অতএব আমরা .gitmodules(সুপার কুরুচিপূর্ণ) রিজেেক্সে ফিরে এসেছি । তবে এটি কিছুটা নিরাপদ বলে মনে হচ্ছে যেহেতু gitসাবমডিউলের জন্য অনুমোদিত কোড স্পেসটিকে সীমাবদ্ধ করে names। এছাড়াও, যেহেতু আপনি সম্ভবত এই তালিকাটি আরও শেল প্রসেসিংয়ের জন্য ব্যবহার করতে চান, তাই NULL-বিটস ( \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-বিটস ( \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।
পাদটিকা
[1] গিট সংস্করণ
$ 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। (আনন্দিত আমি, যে লিঙ্কটি পরীক্ষা যেহেতু আমি প্রথমে ভুল 'ভাগ করুন' লিঙ্কে ধরলাম!)