මගේ නඩුවේදී, මට my-pluginගබඩාවක් සහ main-projectගබඩාවක් my-pluginතිබූ අතර, pluginsඋප බහලුම තුළ සෑම විටම සංවර්ධනය කර ඇති බව මවා පෑමට මට අවශ්ය විය main-project.
මූලික වශයෙන්, මම my-pluginගබඩාවේ ඉතිහාසය නැවත ලිවූ අතර එමඟින් සියලු සංවර්ධනය plugins/my-pluginඋප බහලුමේ සිදු වූ බව පෙනෙන්නට තිබුණි . එවිට, මම සංවර්ධනය ඉතිහාසය එකතු my-pluginතුලට main-projectඉතිහාසය, සහ එකට ගස් දෙකක් ඒකාබද්ධ. මේ වන plugins/my-pluginවිටත් main-projectගබඩාවේ කිසිදු නාමාවලියක් නොතිබූ බැවින් මෙය ඉතා සුළු ගැටුම් ඒකාබද්ධ කිරීමකි. එහි ප්රති ing ලයක් ලෙස නිධිය තුළ මුල් ව්යාපෘති දෙකේම ඉතිහාසය අඩංගු වූ අතර එයට මුල් දෙකක් තිබුණි.
ටීඑල්; ඩී.ආර්
$ cp -R my-plugin my-plugin-dirty
$ cd my-plugin-dirty
$ git filter-branch -f --tree-filter "zsh -c 'setopt extended_glob && setopt glob_dots && mkdir -p plugins/my-plugin && (mv ^(.git|plugins) plugins/my-plugin || true)'" -- --all
$ cd ../main-project
$ git checkout master
$ git remote add --fetch my-plugin ../my-plugin-dirty
$ git merge my-plugin/master --allow-unrelated-histories
$ cd ..
$ rm -rf my-plugin-dirty
දිගු අනුවාදය
පළමුව, my-pluginනිධියෙහි පිටපතක් සාදන්න , මන්ද අපි මෙම ගබඩාවේ ඉතිහාසය නැවත ලිවීමට යන බැවිනි.
දැන්, my-pluginගබඩාවේ මූලයට සැරිසැරීම , ඔබේ ප්රධාන ශාඛාව (බොහෝ විට master) පරීක්ෂා කර පහත විධානය ක්රියාත්මක කරන්න. ඇත්ත වශයෙන්ම, ඔබ වෙනුවෙන් ආදේශ කළ යුතු my-pluginහා pluginsඕනෑම දෙයක් ඔබගේ සත්ය නම් වේ.
$ git filter-branch -f --tree-filter "zsh -c 'setopt extended_glob && setopt glob_dots && mkdir -p plugins/my-plugin && (mv ^(.git|plugins) plugins/my-plugin || true)'" -- --all
දැන් පැහැදිලි කිරීමක් සඳහා. git filter-branch --tree-filter (...) HEADගස්වන්නේ (...)සෑම විධානය සිට ලගා වන බව නසා HEAD. මෙය එක් එක් බැඳීම සඳහා ගබඩා කර ඇති දත්ත මත කෙලින්ම ක්රියාත්මක වන බව සලකන්න, එබැවින් “වැඩ කරන නාමාවලිය”, “දර්ශකය”, “වේදිකාගත කිරීම” සහ යනාදිය ගැන අපට කරදර විය යුතු නැත.
ඔබ ක්රියාත්මක කරන්නේ නම් filter-branchඅසමත් විධානය, එය සමහර ගොනු පිටුපස ඉතිරි වනු ඇත .gitනාමාවලිය සහ ඉදිරි කාලය ඔබ උත්සාහ filter-branchඔබ සැපයීමට මිස එය, මේ ගැන පැමිණිලි කරනු ඇත -fකිරීමට විකල්පය filter-branch.
සැබෑ විධානය සඳහා වන ලෙස, මම ලබා බොහෝ වාසනාව නැහැ bashඒ නිසා ඒ වෙනුවට මම භාවිතා මට අවශ්ය දේ කරන්න, zsh -cකරන්න zshඅණ ක්රියාත්මක කිරීම. පළමු මම සකස් extended_globසක්රීය දේ වන විකල්පය, ^(...)තුළ කාරක රීති mvඅණ මෙන්ම, glob_dotsමට dotfiles (වැනි තෝරා ගැනීමට ඉඩ සලසා දෙයි විකල්පය, .gitignoreඉතා glob සමග) ( ^(...)).
ඊළඟට, මම භාවිතා mkdir -pදෙකම නිර්මාණය කිරීමට විධාන pluginsහා plugins/my-pluginඑම අවස්ථාවේ දී.
අවසාන වශයෙන්, මම zsh"negative ණ ග්ලෝබ්" විශේෂාංගය භාවිතා කර ^(.git|plugins)නිධියෙහි මූල නාමාවලියෙහි ඇති සියලුම ලිපිගොනු .gitහා අලුතින් සාදන ලද my-pluginෆෝල්ඩරය හැරුණු විට ගැලපේ . (බැහැර .gitකිරීම මෙහි අවශ්ය නොවනු ඇත, නමුත් ඩිරෙක්ටරියක් ඒ තුළට ගෙන යාමට උත්සාහ කිරීම දෝෂයකි.)
මගේ ගබඩාවේ, ආරම්භක බැඳීම කිසිදු ලිපිගොනු ඇතුළත් කර නොතිබූ හෙයින්, mvවිධානය මඟින් ආරම්භක බැඳීමෙහි දෝෂයක් නැවත ලබා දෙන ලදි (ගෙනයාමට කිසිවක් නොමැති බැවින්). ඒ නිසා, මම එකතු || trueඑසේ git filter-branchනොවේ ඉවත්වීම බව.
මෙම --allවිකල්පය මඟින් filter-branchසඳහා ඉතිහාසය සකස්කල සියලු නිධිය තුල ශාඛා, සහ අමතර --කියන්න අවශ්ය gitවෙනුවට සඳහා විකල්පයක් ලෙස, සකස්කල ශාඛා සඳහා වන විකල්පය ලැයිස්තුව කොටසක් ලෙස එය අර්ථ නිරූපණය කිරීමට filter-branchයොමුවෙමු.
දැන්, ඔබේ main-projectගබඩාවට සංචාලනය කර ඔබට ඒකාබද්ධ වීමට අවශ්ය ඕනෑම ශාඛාවක් පරීක්ෂා කරන්න. දුරස්ථයක් ලෙස ඔබේ my-pluginගබඩාවේ දේශීය පිටපත (එහි ඉතිහාසය වෙනස් කර ඇති) එක් main-projectකරන්න:
$ git remote add --fetch my-plugin $PATH_TO_MY_PLUGIN_REPOSITORY
ඔබගේ කැපවීමේ ඉතිහාසයේ දැන් ඔබට සම්බන්ධයක් නැති ගස් දෙකක් ඇති අතර, ඒවා භාවිතයෙන් මනාව දෘශ්යමාන කළ හැකිය:
$ git log --color --graph --decorate --all
ඒවා ඒකාබද්ධ කිරීම සඳහා, භාවිතා කරන්න:
$ git merge my-plugin/master --allow-unrelated-histories
2.9.0 ට පෙර Git හි --allow-unrelated-historiesවිකල්පය නොපවතින බව සලකන්න . බව එම දෝශ පණිවිඩය: ඔබ එක් අනුවාදයක් භාවිතා කරන්නේ නම්, හුදෙක් විකල්පය පළමුෙවන් --allow-unrelated-historiesකිරීම වළක්වා විය ද 2.9.0 දී වැඩිදුරටත් සඳහන් කළේය.
ඔබට ඒකාබද්ධ කිරීමේ ගැටුම් නොතිබිය යුතුය. ඔබ එසේ කරන්නේ නම්, බොහෝ විට එයින් අදහස් වන්නේ එක්කෝ filter-branchවිධානය නිවැරදිව ක්රියා නොකළ බව හෝ දැනටමත් plugins/my-pluginඩිරෙක්ටරියක් තිබී ඇති main-projectබවයි.
මුල් දෙකක් සහිත ගබඩාවක් සෑදීමට හැකරි සිදුවන්නේ කුමක් දැයි කල්පනා කරමින් අනාගත දායකයින් සඳහා පැහැදිලි කිරීමේ පණිවිඩයක් ඇතුළත් කිරීමට වග බලා ගන්න.
ඉහත git logවිධානය භාවිතා කර මූල කොමිට් දෙකක් තිබිය යුතු නව කැපවීමේ ප්රස්ථාරය ඔබට දෘශ්යමාන කළ හැකිය . ශාඛාව පමණක් masterඒකාබද්ධ වන බව සලකන්න . මෙයින් අදහස් කරන්නේ ඔබට ගසට my-pluginඒකාබද්ධ වීමට අවශ්ය වෙනත් ශාඛා පිළිබඳ වැදගත් වැඩක් තිබේ නම් main-project, ඔබ my-pluginමෙම ඒකාබද්ධ කිරීම් සිදු කරන තුරු දුරස්ථය මකා දැමීමෙන් වැළකී සිටිය යුතු බවයි. ඔබ එසේ නොකරන්නේ නම්, එම ශාඛා වලින් ලැබෙන මුදල් තවමත් main-projectගබඩාවේ පවතිනු ඇත, නමුත් සමහර ඒවා ළඟා විය නොහැකි අතර අවසානයේ කසළ එකතු කිරීමට ඉඩ ඇත. (එසේම, ඔබට SHA විසින් ඒවා යොමු කිරීමට සිදුවනු ඇත, මන්ද දුරස්ථයක් මකා දැමීමෙන් එහි දුරස්ථ ලුහුබැඳීමේ ශාඛා ඉවත් වේ.)
විකල්පයක් ලෙස, ඔබට තබා ගැනීමට අවශ්ය සියල්ල ඒකාබද්ධ කිරීමෙන් පසුව my-plugin, ඔබට my-pluginදුරස්ථ භාවිතයෙන් ඉවත් කළ හැකිය:
$ git remote remove my-plugin
ඔබ my-pluginඉතිහාසය වෙනස් කළ ගබඩාවේ පිටපත දැන් ඔබට ආරක්ෂිතව මකා දැමිය හැකිය . මගේ නඩුවේදී, my-pluginඒකාබද්ධ කිරීම සම්පුර්ණ කර තල්ලු කිරීමෙන් පසුව මම සැබෑ ගබඩාවට ක්ෂය කිරීමේ දැන්වීමක් එක් කළෙමි .
මැක් ඕඑස් එක්ස් එල් කැපිටන් සමඟ git --version 2.9.0සහ සමඟ පරීක්ෂා කර zsh --version 5.2ඇත. ඔබගේ සැතපුම් ගණන වෙනස් විය හැකිය.
යොමුව: