আমার গীত [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
। (আনন্দিত আমি, যে লিঙ্কটি পরীক্ষা যেহেতু আমি প্রথমে ভুল 'ভাগ করুন' লিঙ্কে ধরলাম!)