mergiraf - Git හි AST-නැඹුරු තුන්-මාර්ග ඒකාබද්ධ කිරීමේ මෙවලම

මර්ජිරාෆ් 0.4 ව්‍යාපෘතියේ නිකුතුව ප්‍රකාශයට පත් කර ඇත, ත්‍රි-මාර්ග ඒකාබද්ධ කිරීමේ හැකියාව ක්‍රියාත්මක කිරීමත් සමඟ Git සඳහා ධාවකයක් සංවර්ධනය කරයි. Mergiraf විවිධ ආකාරයේ ඒකාබද්ධ ගැටුම් විසඳීමට සහය වන අතර විවිධ ක්‍රමලේඛන භාෂා සහ ගොනු ආකෘති සඳහා භාවිතා කළ හැක. සම්මත Git සමඟ වැඩ කිරීමේදී ඇතිවන ගැටුම් හැසිරවීමට mergiraf වෙන වෙනම ඇමතීමට හෝ ඒකාබද්ධ කිරීම, ප්‍රතිවර්තනය කිරීම, rebase සහ cherry-pick වැනි විධානවල හැකියාවන් පුළුල් කිරීම සඳහා Git හි ඒකාබද්ධ හසුරුව ප්‍රතිස්ථාපනය කළ හැකිය. කේතය GPLv3 බලපත්‍රය යටතේ බෙදා හැරේ. නව අනුවාදය Python, TOML, Scala සහ Typescript භාෂා සඳහා සහය මෙන්ම කාර්ය සාධන ප්‍රශස්තකරණයන් ද එක් කරයි.

Mergiraf භාවිතයෙන් විසඳන ලද ගැටළු පිළිබඳ සවිස්තරාත්මක විස්තරයක් පහත දැක්වේ:

මෘදුකාංග යනු අතිශය සංකීර්ණ පද්ධතියකට හොඳම උදාහරණයකි. සංකීර්ණ පද්ධති වලට පොදු දෙයක් ඇත - ඒවා සංකීර්ණ වේ - සහ ඔබට අහම්බෙන් සිදු වීමට අවශ්‍ය සංකීර්ණ හැසිරීම බලාපොරොත්තු විය නොහැක. ඒ වෙනුවට, මෙම පද්ධති කාලයත් සමග, පියවරෙන් පියවර පරිණාමය වන අතර, එක් එක් විකෘතිය එක් එක් අදියරේදී ප්රවේශමෙන් පරීක්ෂා කරනු ලැබේ. මෙය සාක්ෂාත් කර ගැනීම සඳහා, හොඳින් නිර්වචනය කරන ලද ව්යුහයක් සහ සුදුසු මෙවලම් අවශ්ය වේ. ඕනෑම සංකීර්ණ පද්ධතියක පරිණාමය අධ්‍යක්ෂණය කළ හැකි ගසක් ලෙස දෘෂ්‍යමාන කළ හැක, එහිදී මූලය යනු හිස් ශ්‍රිත සමූහය වන අතර සෑම නෝඩයක්ම—මූලය හැර—එහි මාපියන්ට විකෘතියක් යෙදීමේ ප්‍රතිඵලයකි.

නිෂ්පාදනවල සන්දර්භය තුළ, සෑම නෝඩයක්ම "අනුවාදය" ලෙස හැඳින්වේ, එය විශේෂිත කාර්යයන් සහ ප්රති-ක්රියාකාරී කට්ටලයක් නියෝජනය කරයි. මෙම කට්ටලයට සිදුවන ඕනෑම වෙනසක් විකෘතියක් ලෙස සලකනු ලබන අතර, එය අපගේ අධ්‍යක්ෂණය කරන ලද ආචක්‍රීය ප්‍රස්ථාරයේ දාරයක් සාදයි. මෙම කාර්යයන් සහජයෙන්ම වියුක්ත ය; ඒවා භෞතික පද්ධති ක්‍රියාත්මක වන ආකාරය සෘජුවම පිළිබිඹු නොකරයි, නමුත් බුද්ධිමත් නියෝජිතයන් එම පද්ධතිවල ප්‍රයෝජනය වටහා ගන්නා ආකාරය නිරූපණය කරයි. අදහස් සැබෑ-ලෝක ක්‍රියාත්මක කිරීම්වලට පරිවර්තනය කිරීමට, ඔබ ඔබේ අත් පෙරළීමට අවශ්‍ය වන අතර දේවල් ක්‍රියාත්මක වන ආකාරය නිවැරදිව ප්‍රකාශ කිරීමට සහ පැහැදිලි කිරීමට හැකි *ප්‍රමාණවත්* පහත් මට්ටමේ විස්තරවලට කිමිදිය යුතුය. මෘදුකාංග සංවර්ධනයේදී, මෙම පහත් මට්ටමේ ඒවා සාමාන්‍යයෙන් ප්‍රභව කේතය මගින් නිරූපණය කෙරේ.

ඔවුන්ගේ මූලාශ්‍ර කේතය ක්‍රමයෙන් අපේක්ෂිත හැසිරීම් ප්‍රදර්ශනය කරන තත්වයකට ගෙන ඒමට සහ ඔවුන් එය ලබා ගත් ආකාරය ලේඛනගත කිරීමට, ක්‍රමලේඛකයින් ස්නැප්ෂොට් සහ වෙනස්කම් අනුව ඔවුන්ගේ කාර්යය නියෝජනය කරයි. ස්නැප්ෂොට් එකක් නිෂ්පාදනයක සියලුම පහත් මට්ටමේ විස්තර සහිත නිශ්චිත තත්වයක් නියෝජනය කරන අතර, වෙනස්කම් කට්ටලයක් ස්නැප්ෂොට් අතර සංක්‍රාන්තියක් නියෝජනය කරයි. සාමාන්‍යයෙන් ස්නැප්ෂොට් ඔවුන්ගේ දෙමව්පියන්ට තනි වෙනස් කිරීම් මගින් ඇති කරයි, එබැවින් මෙම ස්නැප්ෂොට් සෑම විටම පාහේ ඒවා නිර්මාණය කළ වෙනස් කිරීම් සිදු කරන ලෙස ලේබල් කර ඇත, එබැවින් යෙදුම් බොහෝ විට එකිනෙකට වෙනස් ලෙස භාවිතා වේ.

සමහර විට සංක්‍රාන්ති කිහිපයක ප්‍රතිඵලයක් ලෙස ලබාගත් ඡායාරූප තිබේ - ඒකාබද්ධ කිරීමේ කැපවීම්. ඔවුන් සමඟ වැඩ කිරීමට අපහසු වේ, එබැවින් ඒවා සාමාන්යයෙන් මග හැරේ. Git වැනි නවීන විවෘත මූලාශ්‍ර අනුවාද පාලන පද්ධති සංවර්ධන කාර්ය ප්‍රවාහ කළමනාකරණය සඳහා ඉතා මූලික හැකියාවන් සපයයි. ඒවා සංවර්ධකයින්ට අධ්‍යක්ෂණය කරන ලද ඇසික්ලික් ප්‍රස්ථාර ලෙස ස්නැප්ෂොට් සංවිධානය කිරීමට, අදහස් දැක්වීම් සමඟ ඒවා විවරණය කිරීමට සහ අවශ්‍ය පරිදි ඒවා නැවත ඇණවුම් කිරීමට ඉඩ දෙයි.

"මෙම පහත් මට්ටමේ විස්තරය (උදා: විචල්‍ය) හඳුන්වා දුන්නේ ඇයි?", "මෙම ව්‍යාපෘතියට මගේ දායකත්වයෙන් ආසන්න වශයෙන් කොපමණ ප්‍රතිශතයක් ද යන්න නිදොස් කිරීම සහ පිළිතුරු සැපයීම සඳහා ඉතා වැදගත් වන ව්‍යාපෘතියේ අර්ථාන්විත අර්ථවත් ඉතිහාසයක් ලිවීමට සංවර්ධකයින්ට මෙම ක්‍රියාකාරීත්වය ඉඩ සලසයි. ?”, “ පිටු සලකුණු ක්‍රියාත්මක කිරීම් මඟින් හැක් කළේ කවුද සහ කවදාද?”, “මෙම ශ්‍රිතය බිඳ දැමූ පහත් මට්ටමේ වෙනස කුමක්ද (එය නොතිබිය යුතු බව පෙනුනද, අපි සියල්ල පරීක්ෂා කළෙමු!?)”

අනුවාද පාලන පද්ධති මෙය සංවර්ධකයාට අර්ථාන්විතව අර්ථවත් වන ව්‍යාපෘතියක පහත් මට්ටමේ ඉතිහාස කොටසකට යාබදව අදහස් කරන ශාඛාවක් යන සංකල්පය සමඟ මෙය සම්පුර්ණ කරයි. ශාඛා සාමාන්‍යයෙන් විශේෂාංගවල නිශ්චිත ක්‍රියාත්මක කිරීම් සඳහා භාවිතා වේ, සමහර විට එකම විශේෂාංගයේ විවිධ අපේක්ෂක ක්‍රියාත්මක කිරීම් සඳහා ශාඛා කිහිපයක් නිර්මාණය වේ. ශාඛා වැඩ ප්‍රවාහ භාවිතා කරමින් (ප්‍රායෝගිකව ප්‍රධාන ධාරාව සහ සංවර්ධන ප්‍රමිතියක් වන, සෑම තැනකම සහ සෑම තැනකම භාවිතා වේ), සෑම සංවර්ධකයෙකුටම ව්‍යාපෘතියක බොහෝ පරස්පර ශාඛා ඵලදායී ලෙස කළමනාකරණය කළ හැකි අතර, ඒ සෑම එකක්ම පරිණතභාවයෙන් හෝ ගුණාත්මක භාවයෙන් වෙනස් වේ. මෙමගින් සංවර්ධකයින්ට සෑම අවස්ථාවකදීම සියල්ල අතින් නැවත ටයිප් නොකර තමන්ගේ සහ වෙනත් පුද්ගලයින්ගේ වැඩ වල ප්‍රතිඵල ඒකාබද්ධ කිරීමට ඉඩ සලසයි.

සාමාන්‍යයෙන්, "නිල" නිෂ්පාදනය නියෝජනය කරමින් ප්‍රධාන ශාඛාවක් නිර්මාණය කර ඇති අතර, එක් එක් අංගය සඳහා ශාඛා ශාඛාවන් ප්‍රධාන ශාඛාව සමඟ නිතිපතා (සෑම කැපවීමෙන් පසුවම) සමමුහුර්ත කර ඇති අතර, සංවර්ධකයින්ට නිෂ්පාදනයේ නවතම අනුවාදය සමඟ වැඩ කිරීමට ඉඩ සලසයි. හැකි ඉක්මනින් අනෙකුත් සංවර්ධකයින්ගේ ක්‍රියාවන්හි ප්‍රතිඵලයක් ලෙස හඳුනා ගැනීමෙන් ඔවුන්ට අවශ්‍ය විශේෂාංග එකවර ක්‍රියාත්මක කරයි.

විවිධ ස්නැප්ෂොට් වල ක්‍රියාකාරකම් ඒකාබද්ධ කිරීමට උත්සාහ කරන විට (එය හුදෙක් පොදු මුතුන් මිත්තෙකු සොයා ගැනීම සහ ඒවා උත්පාදනය කරන වෙනස්කම් අනුපිළිවෙලින් තවත් එකක් මත යෙදීමයි, මෙම ක්‍රියාව rebase ලෙස හැඳින්වේ, ඒකාබද්ධ කිරීම බොහෝ දුරට rebase එකක් මෙන් වේ, එය හුදෙක් කැපවීම ව්‍යුහගත කරයි. ප්‍රස්ථාරය වෙනස් ලෙස, එහි ප්‍රතිඵලයක් ලෙස ඔවුන් හැසිරවීම අපහසු වේ, එබැවින් ඔවුන් නැවත සකස් කිරීම සඳහා ඒකාබද්ධ කිරීම් අත්හැරීමට උත්සාහ කරයි) ගැටළු මතු වේ. නවීන අනුවාද පාලන පද්ධති (VCS) අභ්‍යන්තර වෙනස් කිරීමේ ඒකාබද්ධ කිරීමේ ඇල්ගොරිතම භාවිතා කරයි, එමඟින් ගොනු තනි පේළි වලට කැඩී යයි, එක් එක් පේළිය අක්ෂරයක් ලෙස සහ ගොනු ඒවායේ අනුපිළිවෙල ලෙස සලකයි, ඉන්පසු ජෛව තොරතුරු වලින් එන ඒවා ඒකාබද්ධ කිරීමට ඇල්ගොරිතම යොදයි.

අවාසනාවකට, මූලාශ්‍ර කේතයේ මෙම පේළියෙන් පේළි නිරූපණයට එහි අන්තර්ගතය සමඟ කිසිදු සම්බන්ධයක් නැත. එහි එකම වාසිය එය සරල හා විශ්වීය වේ. නොගැලපීම ගැටුම් වලට තුඩු දෙයි, සංවර්ධකයින් සඳහා නිරන්තර හිසරදයක් වේ. ගැටුම් නිරාකරණය සඳහා සංවර්ධකයාට කේතයේ අනුවාද දෙකම ප්‍රවේශමෙන් අධ්‍යයනය කිරීම අවශ්‍ය වේ, පේළියෙන්-රේඛා සංසන්දන ඇල්ගොරිතම මගින් “වෙනස් කළ” හෝ “ගැටුම්කාරී” ලෙස නම් කර ඇති කොටස් පමණක් නොව, සමහර විට සම්පූර්ණ ව්‍යාපෘතියම.

සංවර්ධකයා වෙනස්කම් තේරුම් ගත යුතුය, ඒකාබද්ධ කළ කේතය අතින් ලිවිය යුතුය, සහ කිසියම් නොගැලපීම් විසඳිය යුතුය. කේත ප්‍රතිසංවිධානය වැනි සුළු සුළු දේවල් ඇතුළුව විශාල වෙනස්කම් සමඟ බොහෝ විට සිදු වන, පේළියෙන් පේළි මෙවලම වෙනස් කිරීම් වැරදි ලෙස හඳුනා ගන්නා විට ගැටලු වඩාත් ගැටලුකාරී වේ. අතින් ඒකාබද්ධ කළ කේතයට පසුකාලීන වෙනස්කම් යෙදිය නොහැකි නම්, තත්වය සම්පූර්ණ බියකරු සිහිනයක් බවට පත්වේ. බිහිසුණු අවස්ථාවන් තිබියදීත්, පේළියෙන්-රේඛා ඇල්ගොරිතම බොහෝ විට ක්රියා කරයි, විශේෂයෙන්ම සංවර්ධකයින් ක්රියාකාරීව ඒ සඳහා ගැටළු ඇති නොකිරීමට උත්සාහ කරයි. එවැනි ගැටළු අවම කිරීම සඳහා එක් ක්රමයක් වන්නේ කළු වැනි කැනොනිකල්කරණ මෙවලම් භාවිතයෙන් මූලාශ්ර කේත සැකසීමට අවශ්ය වීමයි.

ඇත්ත වශයෙන්ම, භයානක අවස්ථාවන්ට නිවැරදි විසඳුම (සහ සාමාන්‍යයෙන්, ඒවා සඳහා පමණක් නොව, පේළියෙන්-රේඛා ඇල්ගොරිතම යනු හූරිස්ටික් වේ, එය සුළු වශයෙන් බිඳුණු කේතයකට තුඩු දිය හැකිය, උදාහරණයක් ලෙස, එක් සංවර්ධකයෙකු විචල්‍යයක් ලෙස නම් කරන ලද අතර තවත් ඒ සමගම එම විචල්‍යය භාවිතා කරමින් නව කේතයක් ලියා ඇත, ගැටුමක් මෙහි ඒකාබද්ධ කිරීමක්/නැවත සකස් කිරීමක් සිදු නොවනු ඇත, නමුත් ප්‍රතිඵලය ක්‍රියා නොකරනු ඇත) - මෙය නිවැරදි අභ්‍යන්තර ආකෘතිය භාවිතා කිරීමයි.

මෙම ප්‍රදේශයේ පර්යේෂණ වසර 30 ක පමණ කාලයක් තිස්සේ සිදුවෙමින් පවතින අතර එහි ප්‍රතිඵලයක් ලෙස හිමිකාර වාණිජ නිෂ්පාදන කිහිපයක් නිර්මාණය වී ඇතත්, මෙම පර්යේෂණය මෑතක් වන තුරුම ප්‍රායෝගික විවෘත කේත නිෂ්පාදන බවට පත් කර නොමැත. විවෘත මූලාශ්‍ර මෘදුකාංග විසඳුම්වලින් වැඩි ප්‍රමාණයක් 2010 ගණන්වල මුල් භාගයේදී වර්ධනය වීමට පටන් ගත් අතර, ප්‍රධාන වශයෙන් ජාවා භාෂාව කෙරෙහි අවධානය යොමු කරන ලදී.

එම කාලපරිච්ඡේදයේ ප්‍රමුඛතම නිදහස් ක්‍රියාවක් වන GumTree නිර්මාණය කරන ලද්දේ ශාස්ත්‍රීය පසුබිමක් ඇති පර්යේෂකයෙකු විසිනි, එය ජාවා භාෂාවෙන් ලියා ඇත, එහිම වියුක්ත අභ්‍යන්තර නිරූපණයක් ඇත, එය ගස් කපන්නාට පෙරාතුව, සහ ගස් කපන්නා මත පදනම් වූ සහ මූලාශ්‍ර විග්‍රහ කිරීමේ වෙනත් මෙවලම් මත පදනම් වූ පසුබිම් ඇත. කේතය වියුක්ත නිරූපණයන් බවට පත් කරයි. මෙම පද්ධතියට ජනනය කළ හැක්කේ (පෙළ සිදුවීම් ලොගයක් ආකාරයෙන්, ජාවා වෙත බන්ධන ඇති ඕනෑම භාෂාවකින් පහසුවෙන් ඇමතීමට හැකි API එකක් ද ඇත) සහ වෙනස්කම් දෘශ්‍යමාන කිරීම පමණි. කෙසේ වෙතත්, වෙනස්කම් ඒකාබද්ධ කිරීම සඳහා මෙන්ම එමඟින් ජනනය කරන ලද diff ගොනු බැලීම සඳහා, එය කොටුවෙන් පිටත අදාළ නොවේ (කෙසේ වෙතත්, API හරහා වෙනස්කම් පැටවීම ක්‍රියාත්මක කළ හැකිය).

Difftastic හි තරුණ හා වඩා ප්‍රායෝගික ක්‍රියාත්මක කිරීමක් ගස් සිටර් මත පදනම්ව රස්ට් වලින් ලියා ඇති අතර කොන්සෝලය තුළ උද්දීපනය කළ වෙනස්කම් ජනනය කිරීම කෙරෙහි අවධානය යොමු කරයි. මෙම පද්ධතිය වෙනස්කම් දෘශ්‍යමාන කිරීම ද අරමුණු කර ඇති අතර සාමාන්‍යයෙන් වෙනස්කම් ඒකාබද්ධ කිරීම හෝ පැච් යෙදීම අරමුණු නොකරයි.

මර්ජිරාෆ් ව්‍යාපෘතිය මෑතකදී දර්ශනය වූ අතර ක්‍රියාකාරීව සංවර්ධනය වෙමින් පවතී. රස්ට් (21 MiB!) හි ලියා ඇති මෙම මෙවලම ද ගස්සිටර් මත පදනම් වේ, එය සංවර්ධන මෙවලම්වල සන්දර්භය-නිදහස් ව්‍යාකරණ විග්‍රහ කරන්නන් සඳහා ප්‍රමිතියක් බවට පත් වී ඇති අතර LLVM පහත මට්ටමේ උපදෙස් නිරූපණයන් ප්‍රශස්ත කිරීම සඳහා වී ඇත. එහි තරඟකරුවන් මෙන් නොව, mergiraf විසින් කාර්යයන් සපයන්නේ වෙනස්කම් ඇති කිරීම සඳහා නොව, ඒකාබද්ධ ගැටුම් ස්වයංක්‍රීයව විසඳීම සඳහා ය. තොප්පිය යටතේ, mergiraf GumTree හි භාවිතා කරන ඇල්ගොරිතමයේ ක්‍රියාවට නැංවීමක් භාවිතා කරයි පැච් උත්පාදනය කිරීම, සහ යෙදුම සඳහා, ගස්සිටර් ව්‍යුහයන් සඳහා අනුවර්තනය කරන ලද ස්පෝර්ක් වල භාවිතා කරන ඇල්ගොරිතම ක්‍රියාත්මක කිරීමකි.

අවාසනාවන්ත ලෙස පසුව යෙදිය හැකි ගොනු වලට පැච් අනුක්‍රමික කිරීම ක්‍රියාත්මක නොවේ (නමුත් GumTree විසින් ජනනය කරන ලද සිදුවීම් ලොග විග්‍රහ කිරීමෙන් එය ක්‍රියාත්මක කළ හැක). වෙනස්කම් යෙදීමට තවත් හොඳ ක්‍රමයක් වනුයේ වෙනස්කම් යෙදීම පැච් හරහා නොව, LSP සේවාදායකයන්ගේ ප්‍රතිනිර්මාණය කිරීමේ ක්‍රියාකාරීත්වය හරහා වන අතර එමඟින් ව්‍යාපෘති-පුළුල් මට්ටමින් ගැටුම් හඳුනා ගැනීමට උපකාරී වේ. දෘශ්‍යකරණය සහය දක්වන්නේ ගැටුම් සඳහා පමණි.

වැඩ කිරීමේදී උදාහරණය: පොදු මුතුන් මිත්තන් "base.py" (ඉන්ඩෙන්ට් ටැබ්, ආරම්භයේ අමතර රේඛාව) foo = 1 def main(): print(foo + 2 + 3) "a.py" (indented still tabs, 2 extra lines ආරම්භයේදී, එකක් වෙනුවට, icecream පුස්තකාලය debug මුද්‍රණය සඳහා භාවිතා කරයි, “baz” පන්තිය එකතු කරනු ලැබේ: icecream import ic foo = 1 def main(): ic(foo + 2 + 3) class baz: def __init__(self): """baz""" "b.py" (විචල්‍ය "foo" "bar" ලෙස නැවත නම් කර, වෙනස්කම් වලින් පසුව "black" සමඟ සකසන ලද අතර, එහි ප්‍රතිඵලයක් ලෙස හිස්තැන් සහ අමතර කොටස් සමඟ ඉන්ඩෙන්ටේෂන් ඇති වේ. රේඛා කපා ඇත): bar = 1 def main(): print(bar + 2 + 3) Call ./mergiraf merge ./base.py ./a.py ./b.py -x a.py -y b.py -s base.py -o ./res.py icecream import ic bar = 1 def main(): ic(bar + 2 + 3) class baz: def වෙතින් පහත ප්‍රතිඵලය ලබා දෙයි. __init__ (self): """baz""" (නිදොස්කරණය මුද්‍රණය සඳහා, "icecream" පුස්තකාලය භාවිතා කරයි, "foo" විචල්‍යය "bar" ලෙස නැවත නම් කර, වෙනස්කම් වලින් පසුව "black" සමඟ සකසන ලද අතර, එහි ප්‍රතිඵලයක් ලෙස ඉන්ඩෙන්ටේෂන් ඇතිවේ. - අවකාශ සහ අමතර රේඛා කපා, ටැබ් මිශ්රණයක් සහ ඉන්ඩෙන්ටේෂන් සඳහා අවකාශයන්, නමුත් අවසර ලත් ආකෘතිය).

මෙවලමක් නොමැතිකම ක්ෂණිකව පෙනේ. ලේඛන හැඩගැන්වීම සාමාන්‍යයෙන් වින්‍යාස කර ඇත්තේ .editorconfig ගොනු තුළ වන අතර, ටැබ් අවකාශයට වෙනස් කිරීම සහ b.py හි සිදු කර ඇති පරිදි කළු විලාසය අනුගමනය කිරීම වැනි ගෝලීය විලාස වෙනස්කම් සාමාන්‍යයෙන් .editorconfig හි වෙනස්කම් සමඟ සිදු වේ. එබැවින්, එවැනි වෙනස්කම් වඩාත් නිවැරදි යෙදුමක් සඳහා, මෙවලම ගෝලීය "පෙරනිමි" ශෛලිය සඳහා සංකල්පයක් තිබිය යුතු අතර, ".editorconfig" වෙතින් සිටුවම් ඇද ගැනීමට හැකි විය යුතුය.

මූලාශ්රය: opennet.ru

අදහස් එක් කරන්න