පා er කයාගේ ප්රයෝජනය සඳහා, මෙය මෙහි සාරාංශ කිරීමට උත්සාහ කර ඇති අතර, අපේක්ෂිත පරිදි දේවල් ක්රියාත්මක නොවන්නේ නම් එය කරන්නේ කෙසේද යන්න පිළිබඳ පියවරෙන් පියවර උපදෙස් ලබා දේ. උප මොඩියුලයක් ඉවත් කිරීම සඳහා අනුවාදය සහ ඊට ඉහළින් පරීක්ෂා කර ඇති සහ ආරක්ෂිත ක්රමය පහත දැක්වේ :git
2.17
submodule="path/to/sub" # no trailing slash!
git submodule deinit -- "$submodule"
git rm -- "$submodule"
- මෙය ඔබට ප්රයෝජනවත් නොවන්නේ නම්, පහත බලන්න.
- විකල්ප නොමැත. භයානක කිසිවක් නැත. වැඩි යමක් කිරීම ගැන පවා නොසිතන්න!
- ඩෙබියන් බස්ටර්
2.20.1
සහ උබුන්ටු සමඟ පරීක්ෂා කර ඇත 18.04 2.17.1
.
"$submodule"
නම තැබිය යුත්තේ කොතැනද යන්න අවධාරණය කිරීම සඳහා වන අතර, ඔබ අවකාශයන් හා ඒ හා සමාන දේ ගැන සැලකිලිමත් විය යුතුය
- වින්ඩෝස් හි පළමු පේළිය නොසලකා හරිමින් උප
"$submodule"
මොඩියුලයට නිසි ලෙස නියම කර ඇති මාර්ගයක වින්ඩෝස් මාර්ගය වෙනුවට ආදේශ කරන්න. (මම වින්ඩෝස් නොවේ)
අවවාදයයි!
.git
ඩිරෙක්ටරියේ ඇතුලත කිසි විටෙකත් ස්පර්ශ නොකරන්න ! ඇතුළත සංස්කරණය .git
කිරීම අඳුරු පැත්තට ඇතුල් වේ. ඕනෑම වියදමකින් ay ත්ව සිටින්න!
ඔව්, ඔබට මීට දොස් පැවරිය හැකිය git
, අතීතයේ දී බොහෝ ප්රයෝජනවත් දෑ අතුරුදහන් විය git
. නැවත උප මොඩියුල ඉවත් කිරීමට සුදුසු ක්රමයක් මෙන්.
මම හිතන්නේ ලේඛනගත කිරීමේදී ඉතා භයානක කොටසක් තිබේ git submodule
. එය $GIT_DIR/modules/<name>/
ඔබම ඉවත් කිරීමට නිර්දේශ කරයි .
මගේ අවබෝධය අනුව මෙය සරල වැරැද්දක් පමණක් නොව, එය අතිශයින්ම භයානක වන අතර අනාගතයේ දී විශාල හිසරදයක් ඇති කරයි! පහත බලන්න.
එය සටහන් කර ගන්න
git module deinit
යනු සෘජු ප්රතිලෝම වේ
git module init
එහෙත්
git submodule deinit -- module
git rm -- module
එය ද ප්රතිලෝම වේ
git submodule add -- URL module
git submodule update --init --recursive -- module
සමහර විධානයන් මූලික වශයෙන් එක් දෙයකට වඩා වැඩි යමක් කළ යුතු නිසා:
git submodule deinit -- module
- (1) යාවත්කාලීන කිරීම්
.git/config
git rm
- (2) මොඩියුලයේ ගොනු ඉවත් කරයි
- (3) එමඟින් උප මොඩියුලයේ උප මොඩියුලයන් පුනරාවර්තනය කරයි
- (4) යාවත්කාලීන කිරීම්
.gitmodules
git submodule add
- වෙත දත්ත ඇද ගනී
.git/modules/NAME/
- (1) එසේ කරයි
git submodule init
, එබැවින් යාවත්කාලීන වේ.git/config
- (2)
git submodule update
, එසේ නම්, මොඩියුලය නොවරදවාම පරීක්ෂා කරයි
- (4) යාවත්කාලීන කිරීම්
.gitmodules
git submodule update --init --recursive -- module
- අවශ්ය නම් වැඩිදුර දත්ත ලබා ගනී
- (3) උප මොඩියුලයේ උප මොඩියුල නැවත නැවත පරීක්ෂා කරයි
මෙය සම්පුර්ණයෙන්ම සමමිතික විය නොහැක, මන්ද එය තදින් සමමිතිකව තබා ගැනීමෙන් වැඩි තේරුමක් නැත. සරලවම විධාන දෙකකට වඩා අවශ්ය නොවේ. "දත්ත ඇද ගැනීම" යන්නෙන් ගම්ය වන්නේ ඔබට එය අවශ්ය නිසා, නමුත් හැඹිලි තොරතුරු ඉවත් කිරීම සිදු නොකෙරේ, මන්ද මෙය කිසිසේත් අවශ්ය නොවන අතර වටිනා දත්ත අතුගා දැමිය හැකිය.
මෙය සැබවින්ම නවකයින්ට ප්රහේලිකාවක් වන නමුත් මූලික වශයෙන් එය හොඳ දෙයකි: git
පැහැදිලිවම එය කර එම අයිතිය කර ඇති අතර තවත් බොහෝ දේ කිරීමට උත්සාහ නොකරයි. git
තවත් "ඊයර්ලෙජෙන්ඩ් වොල්මිල්ච්සෝ" ("ඊයර්ලෙජෙන්ඩ් වොල්මිල්ච්සෝ" මට "ස්විට්සර්ලන්ත හමුදා පිහියක නපුරු අනුවාදයක්" ලෙස පරිවර්තනය කිරීම වෙනුවට විශ්වාසදායක කාර්යයක් කළ යුතු මෙවලමකි.
ඒ නිසා මිනිසුන්ගේ පැමිණිලි මට තේරෙනවා, "ඇයි git
මට පැහැදිලි දේ නොකරන්නේ ". මෙයට හේතුව මෙහි “පැහැදිලිව” රඳා පවතින්නේ දෘෂ්ටි කෝණයෙන් ය. සෑම තත්වයකම විශ්වසනීයත්වය වඩා වැදගත් ය. එබැවින් ඔබට බොහෝ විට පැහැදිලිව පෙනෙන දෙය විය හැකි සියලු තාක්ෂණික අවස්ථාවන්හි නිවැරදි දෙය නොවේ. කරුණාකර එය මතක තබා ගන්න: AFAICSgit
අනුගමනය කරන්නේ තාක්ෂණික මාවත මිස සමාජ මාර්ගය නොවේ. (එබැවින් දක්ෂ නම: git)
මෙය අසමත් වුවහොත්
පහත දැක්වෙන විධානයන් නිසා ඉහත විධානයන් අසමත් විය හැකිය:
- ඔබේ
git
වයස වැඩියි. ඉන්පසු නව එකක් භාවිතා කරන්න git
. (කෙසේද යන්න පහත බලන්න.)
- ඔබ සතුව අවිධිමත් දත්ත ඇති අතර දත්ත අහිමි විය හැකිය. පළමුව ඒවා කැප කිරීම වඩා හොඳය.
- ඔබේ උප මොඩියුලය
git clean
අර්ථයෙන් පිරිසිදු නැත . ඉන්පසු එම විධානය භාවිතයෙන් ඔබේ උප මොඩියුලය පිරිසිදු කරන්න. (පහත බලන්න.)
- ඔබ අතීතයේ යම් දෙයක් කර ඇති අතර එය සහාය නොදක්වයි
git
. එවිට ඔබ අඳුරු පැත්තේ සිටින අතර දේවල් අවලස්සන හා සංකීර්ණ වේ. (සමහර විට වෙනත් යන්ත්රයක් භාවිතා කිරීමෙන් එය නිවැරදි වේ.)
- සමහර විට අසමත් වීමට තවත් ක්රම තිබේ මම නොදැන සිටිමි (මම
git
බලය භාවිතා කරන්නෙක් පමණි.)
හැකි විසඳුම් අනුගමනය කරයි.
නව එකක් භාවිතා කරන්න git
ඔබගේ යන්ත්රය පැරණි නැත ද නම් submodule deinit
ඔබේ git
. ඔබට යාවත්කාලීන කිරීමට අවශ්ය නැතිනම් (හෝ කළ හැකිය) git
, පසුව නව යන්ත්රයක් සමඟ වෙනත් යන්ත්රයක් භාවිතා කරන්න git
! git
සම්පුර්ණයෙන්ම බෙදා හැරීමට අදහස් කරන අතර, එම නිසා ඔබට git
කාර්යය ඉටු කිරීම සඳහා තවත් එකක් භාවිතා කළ හැකිය :
workhorse:~/path/to/worktree$ git status --porcelain
කිසිවක් ප්රතිදානය නොකළ යුතුය ! එය එසේ නම්, පළමුව දේවල් පිරිසිදු කරන්න!
workhorse:~/path/to/worktree$ ssh account@othermachine
othermachine:~$ git clone --recursive me@workhorse path/to/worktree/.git TMPWORK && cd TMPWORK
- දැන් උප මොඩියුල දේවල් කරන්න
othermachine:~/TMPWORK$ git commit . -m . && exit
workhorse:~/path/to/worktree$ git fetch account@othermachine:TMPWORK/.git
workhorse:~/path/to/worktree$ git merge --ff-only FETCH_HEAD
. මෙය ක්රියා නොකරන්නේ නම් භාවිතා කරන්නgit reset --soft FETCH_HEAD
git status
නැවත පිරිසිදු වන තුරු දැන් දේවල් පිරිසිදු කරන්න. පළමු පියවරට ස්තූතිවන්ත වන්නට පෙර ඔබට එය පිරිසිදු කර ඇති නිසා ඔබට එය කළ හැකිය.
මෙය othermachine
ඕනෑම වීඑම් එකක් හෝ වින්ඩෝස් යටතේ උබුන්ටු ඩබ්ලිව්එස්එල් විය හැකිය. පවා chroot
(නමුත් මම ඔබ නම් නිසා, ඔබ නොවන මූල බව උපකල්පනය root
එය නව යාවත්කාලීන වැඩි පහසු විය යුතු git
.)
ඔබට ssh
ඇතුළුවිය නොහැකි නම්, git
ගබඩාවන් ප්රවාහනය කිරීමට දුම්රිය මාර්ග රාශියක් ඇති බව සලකන්න . ඔබට ඔබගේ වැඩ පත්රිකාව සමහර USB සැරයටියකින් ( .git
නාමාවලිය ඇතුළුව ) පිටපත් කළ හැකිය , සහ සැරයටියෙන් ක්ලෝන කරන්න. නැවත පිරිසිදු ආකාරයකින් දේවල් ලබා ගැනීම සඳහා පිටපත ක්ලෝන කරන්න. ඔබේ උප මොඩියුල වෙනත් යන්ත්ර වලින් කෙලින්ම ප්රවේශ විය නොහැකි නම් මෙය PITA එකක් විය හැකිය. නමුත් මේ සඳහා විසඳුමක් ද ඇත:
git config --add url.NEWURLPREFIX.insteadOf ORIGINALURLPREFIX
ඔබට මෙම ගුණනය භාවිතා කළ හැකි අතර මෙය සුරකිනු ඇත $HOME/.gitconfig
. වගේ දෙයක්
git config --add 'url./mnt/usb/repo/.insteadof' https://github.com/
වැනි URL නැවත ලියයි
https://github.com/XXX/YYY.git
වෙත
/mnt/usb/repo/XXX/YYY.git
ඔබ git
මේ වගේ ප්රබල අංග වලට හුරුවීමට පටන් ගන්නේ නම් එය පහසුය .
මුලින්ම දේවල් පිරිසිදු කරන්න
අතින් පිරිසිදු කිරීම හොඳයි, මන්ද මේ ආකාරයෙන් ඔබට අමතක වූ සමහර දේවල් ඔබ හඳුනා ගනී.
- Git විසින් සුරකින ලද දේවල් ගැන පැමිණිලි කරන්නේ නම්, එය සිදු කර ආරක්ෂිත තැනකට තල්ලු කරන්න.
- Git සමහර ඉතුරු ගැන පැමිණිලි කරන්නේ නම්
git status
සහ git clean -ixfd
ඔබේ මිතුරා වේ
- විකල්ප සිට දීමෙන් වැලකී සිටීමට උත්සාහ කරන්න
rm
සහ deinit
ඔබට හැකි තාක්. ඔබ ප්රෝ නම් විකල්ප (වැනි -f
) git
හොඳයි. නමුත් ඔබ මෙහි පැමිණි විට, ඔබ submodule
ප්රදේශයේ එතරම් අත්දැකීම් නොමැති අය විය හැකිය . එබැවින් කණගාටු වෙනවාට වඩා ආරක්ෂිත වන්න.
උදාහරණයක්:
$ git status --porcelain
M two
$ git submodule deinit two
error: the following file has local modifications:
two
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'two' contains local modifications; use '-f' to discard them
$ cd two
$ git submodule deinit --all
error: the following file has local modifications:
md5chk
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'md5chk' contains local modifications; use '-f' to discard them
$ cd md5chk
$ git submodule deinit --all
error: the following file has local modifications:
tino
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'tino' contains local modifications; use '-f' to discard them
$ cd tino
$ git status --porcelain
?? NEW
$ git clean -i -f -d
Would remove the following item:
NEW
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each
5: quit 6: help
What now> 1
Removing NEW
$ cd ../../..
$ git status --porcelain
$ git submodule deinit two
Cleared directory 'two'
Submodule 'someunusedname' (https://github.com/hilbix/src.git) unregistered for path 'two'
ඔබට පෙනේ, -f
අවශ්ය නොවේ submodule deinit
. දේවල් පිරිසිදු නම්, git clean
අර්ථයෙන්. git clean -x
අවශ්ය නොවන බව ද සටහන් කර ගන්න . මෙයින් අදහස් git submodule deinit
කරන්නේ නොසලකා හරින ලද සොයා නොගත් ගොනු කොන්දේසි විරහිතව ඉවත් කිරීමයි. මෙය සාමාන්යයෙන් ඔබට අවශ්ය දෙයයි, නමුත් ඒ ගැන අමතක නොකරන්න. සමහර විට නොසලකා හරින ලද ලිපිගොනු නැවත ගණනය කිරීම සඳහා පැය කිහිපයක් ගතවන හැඹිලි දත්ත වැනි වටිනා විය හැකිය.
කිසි විටෙකත් ඉවත් නොකරන්නේ ඇයි $GIT_DIR/modules/<name>/
?
බොහෝ විට හැඹිලි ගබඩාව ඉවත් කිරීමට මිනිසුන්ට අවශ්ය වන්නේ ඔවුන් පසුව ගැටලුවකට මුහුණ දීමට බිය වන බැවිනි. මෙය සත්යයකි, නමුත් එම “ගැටලුව” තුළට දිවීම එය විසඳීමට නිවැරදි ක්රමයයි! නිවැරදි කිරීම පහසු වන අතර, නිවැරදිව කළහොත් ඔබට සතුටින් ජීවත් විය හැකිය. ඔබ විසින්ම දත්ත ඉවත් කිරීමට වඩා මෙය කරදරකාරී කරදර වළක්වයි.
උදාහරණයක්:
mkdir tmptest &&
cd tmptest &&
git init &&
git submodule add https://github.com/hilbix/empty.git two &&
git commit -m . &&
git submodule deinit two &&
git rm two &&
git commit -m . &&
git submodule add https://github.com/hilbix/src.git two
අවසාන පේළිය පහත දැක්වෙන දෝෂය ප්රතිදානය කරයි:
A git directory for 'two' is found locally with remote(s):
origin https://github.com/hilbix/empty.git
If you want to reuse this local git directory instead of cloning again from
https://github.com/hilbix/src.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.
මෙම දෝෂය ඇයි? මක්නිසාද යත් .git/modules/two/
මීට පෙර https://github.com/hilbix/empty.git වෙතින් ජනගහනය වී ඇති අතර දැන් වෙනත් දෙයකින් නැවත ජනගහනය වනු ඇත, එනම් https://github.com/hilbix/src.git . ඔබ එය https://github.com/hilbix/empty.git වෙතින් නැවත ජනනය කළහොත් ඔබට මෙය නොපෙනේ
දැන් මොකද කරන්නේ? හොඳයි, කී ලෙසම කරන්න! භාවිත--name someunusedname
git submodule add --name someunusedname https://github.com/hilbix/src.git two
.gitmodules
එවිට පෙනේ
[submodule "someunusedname"]
path = two
url = https://github.com/hilbix/src.git
ls -1p .git/modules/
ලබා දෙයි
someunusedname/
two/
මේ ආකාරයට අනාගතයේදී ඔබ ශාඛා මාරු කළ හැකිය / ඉදිරි පියවරක් සහ කොමිට් කවදාවත් නැවත ඕනෑම අමාරුවේ ලැබෙනු ඇත නිසා, two/
විවිධ (හා සමහරවිට නොපෑහෙන) උඩුගං නිධි දෙකක් සහිත. හොඳම දේ නම්: ඔබ දෙදෙනාම දේශීයව හැඹිලි තබා ගන්න.
- මෙය ඔබට පමණක් සත්ය නොවේ. ඔබේ ගබඩාව භාවිතා කරන අනෙක් සියල්ලන්ටම එය සත්ය වේ.
- තවද ඔබට ඉතිහාසය අහිමි නොවේ. පැරණි උප මොඩියුලයේ නවතම අනුවාදය තල්ලු කිරීමට ඔබට අමතක වූවා නම්, ඔබට දේශීය පිටපත ඇතුළත් කර පසුව එය කළ හැකිය. කවුරුහරි සමහර උප මොඩියුල තල්ලු කිරීමට අමතක කිරීම සාමාන්ය දෙයක් බව සලකන්න (මන්ද මෙය නවකයන්ට හුරු පුරුදු වන තුරු PITA එකක් වන බැවිනි
git
).
කෙසේ වෙතත් ඔබ හැඹිලි නාමාවලිය ඉවත් කළහොත්, විවිධ පිරික්සුම් දෙකම එකිනෙක මත පැටලෙනු ඇත, මන්ද ඔබ --name
විකල්ප භාවිතා නොකරන නිසා නේද ? එබැවින් ඔබ පිටවීම සිදු කරන සෑම අවස්ථාවකම ඔබට .git/modules/<module>/
නැවත නැවතත් නාමාවලිය ඉවත් කිරීමට සිදුවේ . මෙය අතිශයින්ම කරදරකාරී වන අතර එවැනි දෙයක් භාවිතා කිරීම දුෂ්කර කරයි git bisect
.
එබැවින් මෙම මොඩියුල නාමාවලිය ස්ථානගත කරන්නෙකු ලෙස තබා ගැනීමට ඉතා තාක්ෂණික හේතුවක් තිබේ. පහත යමක් ඉවත් කිරීමට නිර්දේශ කරන පුද්ගලයින් .git/modules/
වඩා හොඳින් නොදනිති, නැතහොත් git bisect
මෙය එවැනි උප මොඩියුලයක නොගැලපීම ඉක්මවා ගියහොත් භාවිතා කිරීමට නොහැකි තරම් ප්රබල ලක්ෂණ ඇති බව ඔබට පැවසීමට අමතක කරති .
තවත් හේතුවක් ඉහත පෙන්වා ඇත. බලන්න ls
. එහි ඔබ දකින්නේ කුමක්ද?
හොඳයි, මොඩියුලයේ 2 වන ප්රභේදය two/
යටතේ නොවේ .git/modules/two/
, එය යටතේ ඇත .git/modules/someunusedname/
! ඉතින් වගේ දේවල් git rm $module; rm -f .git/module/$module
සම්පූර්ණයෙන්ම වැරදියි! ඉවත් කිරීම සඳහා ඔබ උපදෙස් module/.git
හෝ .gitmodules
නිවැරදි දේ සොයා ගත යුතුය !
එබැවින් වෙනත් බොහෝ පිළිතුරු මෙම භයානක උගුලට වැටෙනවා පමණක් නොව, ඉතා ජනප්රිය git
දිගු වල පවා මෙම දෝෂය තිබුණි ( එය දැන් එහි සවි කර ඇත )! එබැවින් .git/
ඔබ හරියටම නොකරන්නේ නම්, ඔබ කරන්නේ කුමක්ද යන්න නාමාවලියෙහි අත් තබා ගැනීම වඩා හොඳය !
දාර්ශනික දෘෂ්ටි කෝණයෙන් බලන කල ඉතිහාසය අතුගා දැමීම සැමවිටම වැරදිය.
සුපුරුදු පරිදි ක්වොන්ටම් යාන්ත්ර විද්යාව හැර , නමුත් මෙය සම්පූර්ණයෙන්ම වෙනස් දෙයකි.
FYI ඔබ බොහෝ විට එය අනුමාන කළා: හිල්බික්ස් මගේ GitHub ගිණුමයි.
git rm modulename
සහrm -rf .git/modules/modulename