මගේ නඩුවේදී, මට 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
ඇත. ඔබගේ සැතපුම් ගණන වෙනස් විය හැකිය.
යොමුව: