මෙම සාකච්ඡාවේදී වෙනස් අවස්ථා දෙකක් එකට මිශ්ර වී ඇති බව පෙනේ:
සිදුවීම 1
මගේ මව් ගබඩාවේ උපපොළවල් සඳහා උපමා මොඩියුල භාවිතා කරමින්, මව් ගබඩාව යොමු කරන සෑම උප මොඩියුලයකම ඇති බැඳීම පරීක්ෂා කර බැලීමට මට අවශ්යය, සමහර විට මුලින් සියලු උප මොඩියුල හරහා නැවත පැමිණ ඒවා දුරස්ථව යාවත්කාලීන කිරීම / ඇද ගැනීම.
මෙය පෙන්වා දී ඇති පරිදි සිදු කරනු ලැබේ
git submodule foreach git pull origin BRANCH
git submodule update
සිදුවීම 2, මම හිතන්නේ OP අරමුණු කරන්නේ එයයි
නව දේවල් එක් හෝ වැඩි උප මොඩියුලයක සිදුවී ඇති අතර, මට අවශ්ය වන්නේ 1) මෙම වෙනස්කම් අදින්න සහ 2) මෙම / මෙම උප මොඩියුලවල HEAD (නවතම) කැපවීම වෙත යොමු කිරීම සඳහා මව් ගබඩාව යාවත්කාලීන කරන්න.
මෙය සිදු කරනු ලබන්නේ
git submodule foreach git pull origin BRANCH
git add module_1_name
git add module_2_name
......
git add module_n_name
git push origin BRANCH
ඉතා ප්රායෝගික නොවේ, මන්දයත් ඔබට සියලු උප මොඩියුලයන් වෙත n මාර්ග තද කළ යුතු බැවින් උදා. මව් ගබඩාවේ බැඳීම් දර්ශක යාවත්කාලීන කිරීම සඳහා පිටපතක්.
එක් එක් උප මොඩියුලය හරහා ස්වයංක්රීයව නැවත යෙදීම සිසිල් git add
වන අතර, උප-මොඩියුලයේ (ය) ප්රධානියා වෙත යොමු කිරීම සඳහා මව් නිධිය දර්ශකය (භාවිතා කරමින් ) යාවත්කාලීන කරයි .
මේ සඳහා, මම මෙම කුඩා බාෂ් පිටපත සෑදුවෙමි:
git-update-submodules.sh
#!/bin/bash
APP_PATH=$1
shift
if [ -z $APP_PATH ]; then
echo "Missing 1st argument: should be path to folder of a git repo";
exit 1;
fi
BRANCH=$1
shift
if [ -z $BRANCH ]; then
echo "Missing 2nd argument (branch name)";
exit 1;
fi
echo "Working in: $APP_PATH"
cd $APP_PATH
git checkout $BRANCH && git pull --ff origin $BRANCH
git submodule sync
git submodule init
git submodule update
git submodule foreach "(git checkout $BRANCH && git pull --ff origin $BRANCH && git push origin $BRANCH) || true"
for i in $(git submodule foreach --quiet 'echo $path')
do
echo "Adding $i to root repo"
git add "$i"
done
git commit -m "Updated $BRANCH branch of deployment repo to point to latest head of submodules"
git push origin $BRANCH
එය ක්රියාත්මක කිරීමට, ක්රියාත්මක කරන්න
git-update-submodules.sh /path/to/base/repo BRANCH_NAME
විස්තාරණය
පළමුවෙන්ම, මම සිතන්නේ සියලුම ගබඩාවල $ BRANCH (දෙවන තර්කය) යන ශාඛාව පවතින බවයි. මෙය වඩාත් සංකීර්ණ කිරීමට නිදහස් වන්න.
පළමු කොටස් දෙකෙහි තර්ක තිබේදැයි පරීක්ෂා කිරීමකි. ඉන්පසු මම මව් ගබඩාවේ නවතම දෑ අදින්නෙමි (මම අදින්නට යන සෑම අවස්ථාවකදීම --ff (වේගයෙන් ඉදිරියට යැවීම) භාවිතා කිරීමට කැමැත්තෙමි.
git checkout $BRANCH && git pull --ff origin $BRANCH
නව උප මොඩියුල එකතු කර හෝ තවමත් ආරම්භ කර නොමැති නම් සමහර උප මොඩියුල ආරම්භ කිරීම අවශ්ය විය හැකිය:
git submodule sync
git submodule init
git submodule update
ඉන්පසු මම සියලු උප මොඩියුල යාවත්කාලීන කරමි / අදින්නෙමි:
git submodule foreach "(git checkout $BRANCH && git pull --ff origin $BRANCH && git push origin $BRANCH) || true"
කරුණු කිහිපයක් සැලකිල්ලට ගන්න: පළමුවෙන්ම, මම සමහර Git විධාන දම්වැලෙන් බැඳ තබමි &&
- එනම් පෙර විධානය දෝෂයකින් තොරව ක්රියාත්මක විය යුතුය.
සාර්ථක ලෙස අදින්නට පසු (දුරස්ථව නව දේවල් හමු වූවා නම්), ඒකාබද්ධ කිරීමක් කළ හැකි බව සේවාදායකයා මත ඉතිරි නොකිරීමට මම තල්ලුවක් දෙමි. නැවතත්, එය සිදුවන්නේ ඇත්ත වශයෙන්ම අළුත් දේවල් ගෙන එන්නේ නම් පමණි .
අවසාන වශයෙන්, අවසාන || true
පිටපත දෝෂ මත අඛණ්ඩව සිදුවන බව සහතික කරයි. මෙම කාර්යය සිදු කිරීම සඳහා, පුනරාවර්තනයේ ඇති සෑම දෙයක්ම ද්විත්ව උපුටා දැක්වීම් වලින් ඔතා තිබිය යුතු අතර Git විධානයන් වරහන් වලින් ඔතා තිබිය යුතුය (ක්රියාකරු ප්රමුඛතාවය).
මගේ ප්රියතම කොටස:
for i in $(git submodule foreach --quiet 'echo $path')
do
echo "Adding $i to root repo"
git add "$i"
done
අවංකව සියලු submodules - සමග --quiet
, ප්රතිදානය 'MODULE_PATH ඇතුළත්' ඉවත් කරන. භාවිතා කිරීම 'echo $path'
(තනි උපුටා දැක්වීම්වල තිබිය යුතුය), උප මොඩියුලයට යන මාර්ගය ප්රතිදානය සඳහා ලියා ඇත.
සාපේක්ෂ උප මොඩියුල මාර්ග මෙම ලැයිස්තුව අරාවෙහි ග්රහණය කර ඇත ( $(...)
) - අවසානයේ මෙය නැවත කියවා git add $i
මව් ගබඩාව යාවත්කාලීන කිරීමට කරන්න.
අවසාන වශයෙන්, මව් ගබඩාව යාවත්කාලීන කළ බව පැහැදිලි කරමින් යම් පණිවිඩයක් සමඟ බැඳීමක්. කිසිවක් නොකළේ නම් මෙම කැපවීම පෙරනිමියෙන් නොසලකා හරිනු ඇත. මෙය ආරම්භයට තල්ලු කරන්න, ඔබ ඉවරයි.
මට ජෙන්කින්ස් හි තිර පිටපතක් තිබේ රැකියාවක අතර එය පසුව නියමිත ස්වයංක්රීය යෙදවීමකට සම්බන්ධ වේ.
මෙය යමෙකුට ප්රයෝජනවත් වනු ඇතැයි මම බලාපොරොත්තු වෙමි.
--remote
විකල්පය හරහා ගොඩනගා ගත යුතු ක්රියාකාරිත්වය Git සතුව ඇති බැවින් , සමහර විට එය ජේසන්ගේ පිළිතුරෙහි “අතින්” ප්රවේශයට වඩා පිළිගත් පිළිතුර ලෙස සලකුණු කිරීම ප්රයෝජනවත් වේද?