ඒකාබද්ධ කර ඇති සියලුම Git ශාඛා මකා දැමිය හැක්කේ කෙසේද?


1948

මට බොහෝ Git ශාඛා ඇත. දැනටමත් ඒකාබද්ධ කර ඇති ශාඛා මකා දැමිය හැක්කේ කෙසේද? ඒවා එකින් එක මකා දැමීම වෙනුවට ඒවා මකා දැමීමට පහසු ක්‍රමයක් තිබේද?


47
තරමක් විශේෂිත වීමට නම් git branch -Dඕනෑම ශාඛාවක් ඒකාබද්ධ වී තිබේද නැද්ද යන්න මකා දමයි.
ෆිල්ට්

12
ඔබේ ගබඩාවේ (ශාඛා 'කොටසට (උදා: github.com/<username>/<repo_name>/branches ) ගියහොත් ඔබට මෙය කෙලින්ම GitHub වෙතින් කළ හැකිය . ඔබේ සියලු ශාඛා ලැයිස්තුවක් තිබිය යුතු අතර, පැත්තේ රතු කුණු කූඩ නිරූපකයක් ඇති අතර එමඟින් තෝරාගත් ශාඛාව මකා දැමෙනු ඇත. පර්යන්තයේ එය කරනවාට වඩා වේගවත්! masterඑක් එක් ශාඛාව කොතරම් ඉදිරියෙන් / පිටුපසින් සිටිනවාද යන්න ද පෙන්වනු ඇත. කෙසේ වෙතත්, ඔබ ධාවනය කරන්නේ නම් ඔබේ දේශීය සේවාදායකයා තවමත් පැරණි ශාඛා ලැයිස්තුගත කරනු ඇත git branch -a; git fetch --pruneඒවා ඉවත් කිරීමට භාවිතා කරන්න ( මෙම පිළිතුරට අනුව ).
user5359531

3
මෙය දේශීයව හෝ දුරස්ථව සිදු කිරීමට ස්ක්‍රිප්ට් - ආරක්ෂිත චෙක්පත් සහ පෙර සැකසූ “ආරක්ෂිත ශාඛා” සමඟ: github.com/fatso83/dotfiles/tree/master/utils/… git delete-merged --doit origin හෝgit delete-merged --doit --local
ඔලිගොෆ්‍රන්

ඒකාබද්ධ කළ ශාඛා ස්වයංක්‍රීයව මකා දැමීමට ඔබට මෙම යෙදුම භාවිතා කළ හැකිය .
සෙබස් වෑන් බොක්සෙල්

rm -fr work && git clone http://example.com/work.gitවසර ගණනාවක් තිස්සේ අච්චාරු වලින් ඉවත් වීමට පහසුම ක්‍රමය බවට පත්ව ඇත.
ප්‍රතික්‍රියාකාරක

Answers:


3144

යාවත්කාලීන කිරීම:

ඔබේ වැඩ ප්‍රවාහයට හැකි මුතුන් මිත්තෙකු සිටී නම් ඔබට ස්වාමියා සහ දේව් වැනි බැහැර කිරීමට වෙනත් ශාඛා එකතු කළ හැකිය. සාමාන්‍යයෙන් මම “ස්ප්‍රින්ට්-ස්ටාර්ට්” ටැගයකින් වෙන් වී මාස්ටර්, දේව් සහ ක්වා මුතුන් මිත්තන් නොවේ.

පළමුව, දුරස්ථව ඒකාබද්ධ කළ සියලුම ශාඛා ලැයිස්තුගත කරන්න.

git branch --merged

ඔබට ඉවත් කිරීමට අවශ්‍ය නොවන ශාඛා කිහිපයක් ඔබට පෙනෙනු ඇත. ප්‍රධාන හෝ සංවර්ධනයක් වැනි මකා දැමීමට අපට අවශ්‍ය නැති වැදගත් ශාඛා මඟ හැරීමට අපට තර්ක කිහිපයක් එකතු කළ හැකිය. පහත දැක්වෙන විධානය මඟින් ප්‍රධාන ශාඛාව සහ එහි ඇති ඕනෑම දෙයක් මඟ හැරෙනු ඇත.

git branch --merged| egrep -v "(^\*|master|dev)"

ඔබට මඟ හැරීමට අවශ්‍ය නම්, ඔබට එය පහත දැක්වෙන ආකාරයට egrep විධානයට එක් කළ හැකිය. ශාඛාව skip_branch_nameමකා නොදමනු ඇත.

git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"

දැනට පරීක්ෂා කර ඇති ශාඛාවට දැනටමත් ඒකාබද්ධ කර ඇති සියලුම දේශීය ශාඛා මකා දැමීමට:

git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d

ස්වාමියා සහ දේව් මුතුන් මිත්තෙකු නම් ඔවුන් බැහැර කර ඇති බව ඔබට පෙනේ.


ඔබට ඒකාබද්ධ කළ දේශීය ශාඛාවක් මකා දැමිය හැකිය:

git branch -d branchname

එය ඒකාබද්ධ නොකළේ නම්, භාවිතා කරන්න:

git branch -D branchname

දුරස්ථ භාවිතයෙන් එය මකා දැමීමට:

git push --delete origin branchname

git push origin :branchname    # for really old git

ඔබ දුරස්ථයෙන් ශාඛාව මකා දැමූ පසු, දුරස්ථ ලුහුබැඳීමේ ශාඛා ඉවත් කිරීමට ඔබට කප්පාදු කළ හැකිය:

git remote prune origin

හෝ අනෙක් පිළිතුරෙන් දැක්වෙන පරිදි තනි දුරස්ථ ෙසොයා ගැනීෙම් ශාඛා කප්පාදු කරන්න:

git branch -dr branchname

මෙය උපකාරී වේ යැයි සිතමි.


48
අවවාදයයි: ඔබ දැන් ශාඛාවක් නිර්මාණය කළහොත් එය ද මකා දමනු ඇත. ඔබ ඉහළම විධානය ක්‍රියාත්මක කිරීමට පෙර ලැයිස්තුවේ අලුතින් සාදන ලද ශාඛාවක් නොමැති බවට වග බලා ගන්න.
ගැරී හරන්

155
අවවාදයේ විකල්පය: reflog මඟින් ඔබේ බේකන් සුරකිනු ඇත. එබැවින් කරදර නොවන්න.
ඇඩම් ඩිමිට්‍රක්

33
පළමු විධානය මකා දමන්නේ දේශීය ශාඛා පමණක් බව මතක තබා ගන්න, එබැවින් සමහරු පෙන්වා දී ඇති පරිදි එය 'භයානක' නොවේ.
ifightcrime

79
පවර්ෂෙල් ප්‍රභේදය, ඊළඟ වතාවේ මම මෙහි පිළිතුර සොයාගත් විට මට එය සොයාගත හැකි විය:git branch --merged | %{$_.trim()} | ?{$_ -notmatch 'develop' -and $_ -notmatch 'master'} | %{git branch -d $_}
vorou

23
fatal: branch name requiredමකා දැමිය යුතු ශාඛා නොමැති නම් මෙය දෝෂයක් ඇති කරයි . ඔබ සමත් හැකි බව වැලැක්විමට කිරීමට -rකිරීමට xargsඑය ක්රියාත්මක කල නොහැකි වනු ඇත එසේ git branch -dවූ stdin හිස් නම්. (මෙය man පිටුවට අනුව GNU xargs දිගුවකි).
මාරියස් ගෙඩ්මිනාස්

461

දැනටමත් ඒකාබද්ධ කර ඇති දුරස්ථයේ ඇති සියලුම ශාඛා මකා දැමීමට:

git branch -r --merged | grep -v master | sed 's/origin\//:/' | xargs -n 1 git push origin

Git හි වඩාත් මෑත සංස්කරණ වල

git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin

යාවත්කාලීන කිරීම (@oliver විසින්; අදහස් දැක්වීමට නොගැලපෙන නමුත් දැනටමත් ප්‍රමාණවත් පිළිතුරු ඇත) : ඔබ ABC git branch -r --mergedශාඛාවේ සිටී නම් ශාඛාව නිශ්චිතව දක්වා නොමැති නිසා ABC ප්‍රති results ලවල දිස්වනු ඇත , එබැවින් ශාඛාව පැහැර හැරීම වත්මන් ශාඛාවට සහ ශාඛාවකට සෑම විටම තමාටම ඒකාබද්ධ වූ ලෙස සුදුසුකම් ලබයි (ශාඛාවක් සහ තමා අතර කිසිදු වෙනසක් නැති නිසා!).

එබැවින් එක්කෝ ශාඛාව සඳහන් කරන්න:

git branch -r --merged master | grep -v master ...

හෝ පළමු පිටවීමේ මාස්ටර්:

git checkout master | git branch -r --merged | grep -v ...

19
මෙතෙක් හොඳම පිළිතුර. සටහනක් පමණක්, මගේ ප්‍රධාන ශාඛාව නම් කර ඇති devබැවින් මට එය වෙනස් කිරීමට සිදුවිය
ඩෝරියන්

41
වෙනත් දුරස්ථ වල අතු සම්භවය වීම වැළැක්වීම සඳහා මට | grep originපසුව එකතු කිරීමට සිදු grep -v masterවිය. ප්‍රතිදානය කලින් පරීක්ෂා කිරීමට ඉහළින්ම නිර්දේශ කිරීම, භාවිතා කරමින්git branch -r --merged | grep -v master | grep origin | sed 's/origin\//:/' | xargs -n 1 echo
L0LN1NJ4

9
developශාඛාව බැහැර කිරීම සඳහා මම තරමක් වෙනස් කළෙමි . git branch -r --merged | grep -v master | grep -v develop | sed 's/origin\///' | xargs -n 1 git push --delete origin. දැන් මෙය මගේ අන්වර්ථය විය.
සරත්

8
මෙය මා කියවා ඇති හොඳම පිළිතුර බවට පත්ව ඇත්තේ -rවෙනත් තැනක සඳහන් කර නැති තර්කයයි. ගෘහ පාලනයක් කිරීම වටී දේශීය ශාඛා පමණක් බව සලකනු ලැබේ. නමුත් දුරස්ථව කුණු වලින් පිරී ඇත.
අස්බ්ජර්න් උල්ස්බර්ග්

19
අවවාදයයි - දැන් අවබෝධ වී ඇත: මෙය පැහැදිලිවම ශාඛා වර්තමාන ශාඛාවට ඒකාබද්ධ වී ඇති බව සොයා ගනු ඇත , ස්වාමියා නොවේ, එබැවින් ඔබ එහි සිටී myFeatureBranchනම් පිස දමනු ඇත origin/myFeatureBranch. git checkout masterපළමුවෙන්ම එය වඩාත් සුදුසුය .
jakub.g

191

ආදම්ගේ පිළිතුර ටිකක් දිගු කරමින්:

ධාවනය කිරීමෙන් මෙය ඔබගේ Git වින්‍යාසයට එක් කරන්න git config -e --global

[alias]
    cleanup = "!git branch --merged | grep  -v '\\*\\|master\\|develop' | xargs -n 1 git branch -d"

එවිට ඔබට සරලව සිදුකරන සියලුම දේශීය ඒකාබද්ධ ශාඛා මකා දැමිය හැකිය git cleanup.


11
පළමු විධානය විය යුතු නොවේ: git branch --merged masterඔබට ස්වාමියා සමඟ ඒකාබද්ධ වී ඇති දේ බැලීමට අවශ්‍ය බැවින්, දැනට පරීක්ෂා නොකළ ශාඛාව නොවේද?
ජෝ ෆිලිප්ස්

OJoePhilllips සමහර පුද්ගලයින්ට ප්‍රධාන ශාඛාව ස්වාමියා නොව ඒ වෙනුවට developහෝ devඑසේ වුවහොත් fatal: malformed object nameසාමාන්‍ය විධානයක් තිබීම වඩා හොඳ වන අතර එය ක්‍රියාත්මක කිරීමේ වගකීම ඔබට ඇත
smhomed

1
Answer ජෝ ෆිලිප්ස් මෙම පිළිතුරේ කාරණය වන්නේ ආදම්ගේ පිළිතුර (මෙම ප්‍රශ්නයට ඉහළම පිළිතුර) ප්‍රයෝජනවත් git අන්වර්ථය තුළ ඇසුරුම් කිරීමයි. ආදම්ගේ පිළිතුරට ඔබ යෝජනා කරන දේ නොමැති අතර බොහෝ අය එය ප්‍රයෝජනවත් බව සොයාගෙන ඇති නිසා මගේ වෙනස් නොකිරීමට මම නැඹුරු වෙමි. ඔබට ආදම්ගේ පිළිතුර ගැන දැඩි ලෙස හැඟෙන්නේ නම් එය විවෘත කිරීමට මම නිර්දේශ කරමි
real_ate

13
එකතු -rකිරීමෙන් xargsඅනවශ්‍ය දෝෂ ( branch name required) මෙම අන්වර්ථය කිහිප වතාවක් ධාවනය කිරීමේදී හෝ මැකීමට කිසිදු ශාඛාවක් නොමැති විට වලක්වනු ඇත. මගේ අන්වර්ථය මේ වගේ ය:cleanup = "!git branch --merged | grep -v -P '^\\*|master|develop' | xargs -n1 -r git branch -d"
spezifanta

1
වත්මන් විධානය මඟින් මාස්ටර් පෙරහන් කර ශාඛා සංවර්ධනය නොකරයි
ඇන්ඩ්‍රි එෆ්.

83

මාස්ටර් හැර ඒකාබද්ධ කරන ලද සියලුම ශාඛා මකා දැමීමටද මෙය ක්‍රියා කරයි.

git branch --merged | grep -v '^* master$' | grep -v '^  master$' | xargs git branch -d

3
දැන් එය එහි ඇති කිසිදු ශාඛාවක් මකා නොදමනු masterඇත. grep -v ^master$මැදට උත්සාහ කරන්න .
wchargin

| grep -v '^\*'ඔබ ස්වාමියා නොමැති
svassr

5
මෙය නියමයි, ස්තූතියි! මෙය භාවිතා කරන ඕනෑම කෙනෙකුට එක් අවවාදයක්: අවකාශ දෙකක් ඇති බව සලකන්න grep -v '^ master$'. ඔබ එය ටයිප් කර එකක් මග හැරියහොත්, ඔබ එය masterනොමැති නම් මකා දමනු ඇත.
ස්ටයිජර්

3
Poly පොලිවර්ල් මහතා ඔබේ සංස්කරණය විධානය කඩ කරන අතර ඔබ එය ආපසු හැරවිය යුතුය. අවකාශයන් දෙක අත්‍යවශ්‍යය, මන්දයත් git branchඑක් එක් ශාඛා නාමය දැනට පරීක්ෂා කර ඇති ශාඛාව නොවේ නම් වම් පැත්තට අවකාශ දෙකක් සහිත නව පේළියක ලැයිස්තු ගත කරනු ඇත. මෙම විධානය ක්‍රියාත්මක කරන ඕනෑම අයෙකු ඔවුන්ගේ ප්‍රධාන ශාඛාව මකා දමන බවට ඔබ සහතික වී ඇත.
ස්ටයිජර්

79

ඔබට එම විධානයන්ගෙන් master& developශාඛා බැහැර කිරීමට අවශ්‍ය වනු ඇත .

දේශීය git පැහැදිලි:

git branch --merged | grep -v '\*\|master\|develop' | xargs -n 1 git branch -d

දුරස්ථ git පැහැදිලි:

git branch -r --merged | grep -v '\*\|master\|develop' | sed 's/origin\///' | xargs -n 1 git push --delete origin

දුරස්ථ ශාඛා වල දේශීය ලේඛකාධිකාරය සමමුහුර්ත කරන්න:

git fetch -p

3
දුරස්ථ අනුවාදය සඳහා +1 ද (නමුත් අපට දුරස්ථ --prune ඇති බැවින් අඩු අවශ්‍යතාවයක් ඇත). පැරණි git අනුවාදය සමඟ තෝස් ක්‍රියා නොකරනු ඇති බව ද සඳහන් කිරීම වටී
malko

4
git config --global --add fetch.prune trueලබා ගැනීමට හෝ අදින්නට ස්වයංක්‍රීයව කප්පාදු කිරීමට.
T3rm1

1
කප්පාදු කිරීම දුරස්ථ පැහැදිලිව සමාන නොවේ. දුරස්ථ පැහැදිලි කිරීම ඇත්ත වශයෙන්ම ඔබගේ වර්තමාන ශාඛාව සමඟ සම්පුර්ණයෙන්ම ඒකාබද්ධ වී ඇති දුරස්ථ ශාඛා මකා දමයි. කප්පාදු කිරීම දැනටමත් මකා දමා ඇති දුරස්ථ ශාඛා පිළිබඳ ඔබේ දේශීය ලේඛකාධිකාරය පිරිසිදු කරයි.
ගයිඩෝ බූමන්

සම්පුර්ණයෙන්ම වචනය මඳක් නොමඟ යවන සුළුය, මන්දයත් ශාඛාවක් මීට පෙර ඒකාබද්ධ වූ විට එය ඒකාබද්ධ කිරීමක් ලෙස සලකනු ඇත, නමුත් ඒකාබද්ධ කිරීමෙන් පසුව නව බැඳීම් ඇති අතර ඒවා ඒකාබද්ධ නොවීය.
scones

සියලුම ඇමතුම් වලින් දුරස්ථ git branch -r --merged | grep -v '\*\|master\|develop' | grep '^\s*origin/' | sed 's/origin\///' | tr "\n" " " | xargs git push --delete origin
දුරස්ථයන්

48

ඔබ වින්ඩෝස් හි සිටින සහ පවර්ෂෙල් ස්ක්‍රිප්ට් වලට කැමති අය සඳහා, දේශීය ඒකාබද්ධ ශාඛා මකා දැමූ එකක් මෙන්න:

function Remove-MergedBranches
{
  git branch --merged |
    ForEach-Object { $_.Trim() } |
    Where-Object {$_ -NotMatch "^\*"} |
    Where-Object {-not ( $_ -Like "*master" )} |
    ForEach-Object { git branch -d $_ }
}

13
කුතුහලය නිසා මෙය කෙටි කළ හැකිය git branch --merged | ?{-not ($_ -like "*master")} | %{git branch -d $_.trim()}
ඉයන් බැලාර්ඩ්

5
AinIainBallard ෂුවර්, මට අන්වර්ථ නාම භාවිතා කරන්න තිබුණා. ඔබට කියවීමේ හැකියාව උපරිම කිරීමට අවශ්‍ය විට එය නිර්දේශ නොකරයි. github.com/darkoperator/PSStyleGuide/blob/master/English.md
ක්ලාස් මෙල්බර්න්

1
විශ්වාසයි. ඔබේ පිළිතුර ඉතා ප්‍රයෝජනවත් බව මට පෙනී ගියේය :-) කෙසේ වෙතත් සමහර විට දිගුකාලීන බලැති සින්ටැක්ස් කුට්ටි වල සිදුවෙමින් පවතින දෙයට මග පාදයි. නමුත් මූලික වශයෙන්, මම ඔබට පිටපත් කිරීම / ඇලවීම හෝ ටයිප් කළ හැකි යමක් එකවර ඉදිරිපත් කරමි. නැවත ස්තූතියි.
ඉයන් බල්ලාර්ඩ්

4
වින්ඩෝස් සී.එම්.ඩී ෂෙල් සඳහා එක් ලයිනර් එකක් මාස්ටර් සහ ඔබේ වර්තමාන ශාඛාව ආරක්ෂා කරයි: for /f "usebackq" %B in (``git branch --merged^|findstr /v /c:"* " /c:"master"``) do @git branch -d %B(සුසුම්ලන්න, ද්විත්ව පසුබිම් තනි ආදේශ කරන්න,
පසුපෙළ

43

මම දැන් අවුරුදු ගණනාවක් තිස්සේ ආදම්ගේ පිළිතුර භාවිතා කර ඇත්තෙමි. එයින් කියැවුණේ, මා බලාපොරොත්තු වූ පරිදි හැසිරෙන්නේ නැති අවස්ථා කිහිපයක් ඇති බවයි:

  1. “මාස්ටර්” යන වචනය අඩංගු ශාඛා නොසලකා හරින ලදි, උදා: “නොට්මාස්ටර්” හෝ “මාස්ටර්”, ප්‍රධාන ශාඛාවට පමණක්
  2. "dev" යන වචනය අඩංගු ශාඛා නොසලකා හරින ලදි, උදා: dev ශාඛාවට වඩා "dev-test"
  3. වත්මන් ශාඛාවේ හෙඩ් වෙතින් ළඟා විය හැකි ශාඛා මකා දැමීම (එනම්, අනිවාර්යයෙන්ම ප්‍රධාන නොවේ)
  4. වෙන් කළ HEAD තත්වයේ දී, වර්තමාන බැඳීමෙන් ළඟා විය හැකි සෑම ශාඛාවක්ම මකා දැමීම

1 සහ 2 ආමන්ත්‍රණය කිරීමට සරල විය, රීජෙක්ස් හි වෙනසක් පමණි. 3 රඳා පවතින්නේ ඔබට අවශ්‍ය දේවල සන්දර්භය මත ය (එනම්, ප්‍රධාන හා ඔබේ වර්තමාන ශාඛාවට එරෙහිව ඒකාබද්ධ නොකළ ශාඛා පමණක් මකා දමන්න). 4 git reflogඔබ නොදැනුවත්වම මෙය වෙන් කළ හෙඩ් තත්වයට ගෙන ගියහොත් විනාශකාරී විය හැකිය (ආපසු අයකර ගත හැකි වුවද ).

අවසාන වශයෙන්, මට අවශ්‍ය වූයේ මේ සියල්ල වෙනම (බාෂ් | රූබි | පයිතන්) ස්ක්‍රිප්ට් අවශ්‍ය නොවන එක් ලයිනර් එකක තිබීමයි.

ටීඑල්; ඩී.ආර්

විකල්ප -fධජයක් පිළිගන්නා "අතුගෑම" යන අන්වර්ථ නාමයක් සාදන්න :

git config --global alias.sweep '!git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d'

එය සමඟ ආයාචනා කරන්න:

git sweep

හෝ:

git sweep -f

දිගු, සවිස්තරාත්මක පිළිතුර

සමහර ශාඛා සමඟ නිදර්ශන git repo එකක් නිර්මාණය කිරීම මට පහසු වූ අතර නිවැරදි හැසිරීම පරීක්ෂා කිරීමට කැපවිය:

තනි කැපවීමකින් නව git repo එකක් සාදන්න

mkdir sweep-test && cd sweep-test && git init
echo "hello" > hello
git add . && git commit -am "initial commit"

නව ශාඛා කිහිපයක් සාදන්න

git branch foo && git branch bar && git branch develop && git branch notmaster && git branch masterful
git branch --list
  bar
  develop
  foo
* master
  masterful
  notmaster

කැමති හැසිරීම: ඒකාබද්ධ කළ සියලුම ශාඛා තෝරන්න: මාස්ටර්, සංවර්ධනය හෝ ධාරාව

මුල් රීජෙක්ස් "මාස්ටර්ෆුල්" සහ "නොට්මාස්ටර්" යන ශාඛා මග හැරේ:

git checkout foo
git branch --merged | egrep -v "(^\*|master|dev)"
  bar

යාවත්කාලීන කරන ලද රීජෙක්ස් සමඟ (දැන් එය "dev" වෙනුවට "සංවර්ධනය" බැහැර කරයි):

git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar
masterful
notmaster

ශාඛා foo වෙත මාරුවන්න, නව කැපවීමක් කරන්න, ඉන්පසු foo මත පදනම්ව නව ශාඛාවක්, foobar පරීක්ෂා කරන්න:

echo "foo" > foo
git add . && git commit -am "foo"
git checkout -b foobar
echo "foobar" > foobar
git add . && git commit -am "foobar"

මගේ වර්තමාන ශාඛාව foobar වන අතර, මට මැකීමට අවශ්‍ය ශාඛා ලැයිස්තුගත කිරීම සඳහා ඉහත විධානය නැවත ක්‍රියාත්මක කරන්නේ නම්, එය "foo" ශාඛාව මාස්ටර් සමඟ ඒකාබද්ධ කර නොතිබුණද ඇතුළත් වේ:

git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  foo
  masterful
  notmaster

කෙසේ වෙතත්, මම එකම විධානය මාස්ටර් මත ධාවනය කරන්නේ නම්, "foo" ශාඛාව ඇතුළත් නොවේ:

git checkout master && git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

මෙය හුදෙක් git branch --mergedවෙනත් ආකාරයකින් නිශ්චිතව දක්වා නොමැති නම් වත්මන් ශාඛාවේ හෙඩ් වෙත පෙරනිමි නිසාය . අවම වශයෙන් මගේ කාර්ය ප්‍රවාහය සඳහා, දේශීය ශාඛා මාස්ටර් සමඟ ඒකාබද්ධ කර ඇත්නම් මිස මකා දැමීමට මට අවශ්‍ය නැත, එබැවින් මම පහත ප්‍රභේදයට කැමැත්තෙමි:

git checkout foobar
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

වෙන්වූ HEAD තත්වය

හි පෙරනිමි හැසිරීම මත රඳා සිටීම, git branch --mergedවෙන් වූ HEAD තත්වයේ ඊටත් වඩා වැදගත් ප්‍රතිවිපාක ඇත:

git checkout foobar
git checkout HEAD~0
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  foo
  foobar
  masterful
  notmaster

මෙය මා දැන් සිටි ශාඛාව වන "ෆූබාර්" සහ "ෆූ" සමඟ මකා දැමෙනු ඇත, එය නිසැකවම අපේක්ෂිත ප්‍රති come ලය නොවේ. කෙසේ වෙතත්, අපගේ සංශෝධිත විධානය සමඟ:

git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

සත්‍ය මකා දැමීම ඇතුළුව එක් පේළියක්

git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" | xargs git branch -d

සියල්ලම "අතුගා දැමීම" යන අන්වර්ථ නාමයෙන් ඔතා ඇත:

git config --global alias.sweep '!git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d'

අන්වර්ථය විකල්ප -fධජයක් පිළිගනී . පෙරනිමි හැසිරීම වන්නේ මාස්ටර් සමඟ ඒකාබද්ධ කර ඇති ශාඛා පමණක් මකා දැමීමයි, නමුත් -fධජය මඟින් වර්තමාන ශාඛාවට ඒකාබද්ධ කරන ලද ශාඛා මකා දමනු ඇත.

git sweep
Deleted branch bar (was 9a56952).
Deleted branch masterful (was 9a56952).
Deleted branch notmaster (was 9a56952).
git sweep -f
Deleted branch foo (was 2cea1ab).

ඔබට ශ්‍රිතයක් නිර්මාණය කිරීමට අවශ්‍ය ඇයි? නැත git configපරමාණුක?
VasiliNovikov

විකල්ප '-f' තර්කය සමඟ කටයුතු කිරීම සඳහා (මම ඔබේ ප්‍රශ්නය නිවැරදිව තේරුම් ගන්නේ නම්)
එඩීස්

1
නමුත් එය උපකාර කරන්නේ කෙසේද? මම අදහස් කළේ ප්‍රකාශනයේ ආරම්භය , !f(){ git branch .... ඒක ක්‍රියාකාරී ප්‍රකාශයක් නේද? කෙලින්ම ආරම්භ නොකරන්නේ ඇයි git branch ...?
වාසිලිනොවිකොව්

1
ඔබ ඇත්තෙන්ම හරි. මගේ පිළිතුර ඒ අනුව සංස්කරණය කළා. දර්ශකයට ස්තූතියි!
එඩීස්

බල රහිත මාදිලිය ලෙස පහත සඳහන් දෑ සිදු නොවේද? git checkout master && git branch -d `git branch --merged` && git checkout - එය මකා developදැමිය හැකි බව හැර , නමුත් සරල ප්‍රවේශයක් විය හැකිය.
ගයිඩෝ බූමන්


18

Git අනුවාදය 2.5.0 භාවිතා කිරීම:

git branch -d `git branch --merged`

16
මෙය masterbtw ශාඛාව මකා දැමිය හැකිය !
Wazery

4
සැබෑ. මම එය භාවිතා කරන්නේ මා සිටින බව මට විශ්වාස වූ විට පමණි master.
drautb

11
git branch -d $(git branch --merged | grep -v master)
ඇලෙක්ස්

1
ඔබට ප්‍රවාහයක් තිබේ නම් මෙය භයානක ය, ඔබට ප්‍රධාන <- අදියර <- dev ඇති බව සිතන්න. තවමත් පහසුම විසඳුම imo
ජෝශප් බ්‍රිග්ස්

14

--Mmerged විකල්පයට ඔබට බැඳීම එකතු කළ හැකිය. මේ ආකාරයෙන් ඔබට සහතික විය හැක්කේ මූලාරම්භය / ස්වාමියා සමඟ ඒකාබද්ධ වී ඇති අතු ඉවත් කිරීමට පමණි

පහත දැක්වෙන විධානය මඟින් ඔබේ සම්භවයක් ඇති ඒකාබද්ධ ශාඛා ඉවත් කරනු ඇත.

git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 git push origin --delete 

Git push සම්භවය වෙනුවට ප්‍රතිස්ථාපනය කරන ලද අතු ඉවත් කරන්නේ කුමන අතුදැයි ඔබට පරීක්ෂා කළ හැකිය

git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 echo

2
මම පරීක්ෂණ විකල්පයට කැමතියි
iwein

12

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

#!/usr/bin/env ruby

current_branch = `git symbolic-ref --short HEAD`.chomp
if current_branch != "master"
  if $?.exitstatus == 0
    puts "WARNING: You are on branch #{current_branch}, NOT master."
  else
    puts "WARNING: You are not on a branch"
  end
  puts
end

puts "Fetching merged branches..."
remote_branches= `git branch -r --merged`.
  split("\n").
  map(&:strip).
  reject {|b| b =~ /\/(#{current_branch}|master)/}

local_branches= `git branch --merged`.
  gsub(/^\* /, '').
  split("\n").
  map(&:strip).
  reject {|b| b =~ /(#{current_branch}|master)/}

if remote_branches.empty? && local_branches.empty?
  puts "No existing branches have been merged into #{current_branch}."
else
  puts "This will remove the following branches:"
  puts remote_branches.join("\n")
  puts local_branches.join("\n")
  puts "Proceed?"
  if gets =~ /^y/i
    remote_branches.each do |b|
      remote, branch = b.split(/\//)
      `git push #{remote} :#{branch}`
    end

    # Remove local branches
    `git branch -d #{local_branches.join(' ')}`
  else
    puts "No branches removed."
  end
end

කුඩා git උපකාරක පුස්තකාලයක් සඳහා මම මෙම තොරතුරු සොරකම් කළහොත් මතකද? github.com/yupiq/git-branch-util
ලෝගන්

1
ඒ සඳහා යන්න, යම් ආකාරයකින් කේතය නැවත භාවිතා කිරීම ගැන මිනිසුන් සැලකිලිමත් වූයේ නම් මම එය මෙහි තබන්නේ නැත
mmrobins

@mmrobins රේඛාව \/සඳහා ප්‍රතික්ෂේප කිරීමේ ප්‍රකාශයේ ආරම්භයේ දී ඔබට අමතර යමක් තිබේ remote_branches. එය අක්ෂර වින්‍යාසයක්ද? නැතහොත් එය අරමුණක් ඉටු කරයිද?
ජව්වාඩ්

@mmrobins, අනේ කමක් නෑ මම b.split(/\//)දැන් පේළිය දකිනවා
ජාව්වාඩ්

ඔබට මූලික වශයෙන් මෙය කිරීමට අවශ්‍ය නම් රූබිට
රාමන්

11

පවර්ෂෙල් කොන්සෝලය තුළ ඒකාබද්ධ කළ ශාඛා මකා දැමිය යුතු ආකාරය

git branch --merged | %{git branch -d $_.Trim()}

ඔබට මාස්ටර් හෝ වෙනත් ශාඛා නම් බැහැර කිරීමට අවශ්‍ය නම්, ඔබට මේ ආකාරයට පවර්ෂෙල් තෝරන්න-ස්ට්‍රිං සමඟ නළා ප්‍රති result ලය ලබා දිය හැකිය git branch -d:

git branch -d $(git branch --merged | Select-String -NotMatch "master" | %{$_.ToString().Trim()})

1
ඉහළ පිළිතුරු මඟින් මාස්ටර් හෝ වෙනත් ශාඛා පෙරීම යෝජනා කරයි. බලයෙන් එය කිරීමට බලාපොරොත්තු වන අය සඳහා: git branch --merged | findstr / v "ස්වාමියා" | % {git branch -d $ _. ටිම් ()}
tredzko

retredzko හොඳ කරුණක්. FTR ඉහළ පිළිතුර වන්නේ stackoverflow.com/questions/6127328/… - ඔබට ඔබේ අදහස් එම සම්බන්ධය සමඟ නැවත පළ කළ හැකි අතර පසුව මම මෙය මකා
දමමි

එය මකා දැමීමට ද උත්සාහ කරයි * master:)
iesen

9

කුබූන්ගේ පිළිතුරට ශාඛා නාමයේ මාස්ටර් යන වචනය ඇති ශාඛා මකා දැමීම මග හැරුණි. ඔහුගේ පිළිතුර මත පහත සඳහන් කරුණු වැඩි දියුණු වේ:

git branch -r --merged | grep -v "origin/master$" | sed 's/\s*origin\///' | xargs -n 1 git push --delete origin

ඇත්ත වශයෙන්ම, එය "මාස්ටර්" ශාඛාව මකා නොදමයි :)


8

මෙය ස්වයංක්‍රීයව ඔබ වෙනුවෙන් කරන විධානයක් Git හි නොමැත. නමුත් ඔබට අවශ්‍ය දේ ලබා දීමට Git විධාන භාවිතා කරන ස්ක්‍රිප්ටයක් ලිවිය හැකිය. ඔබ භාවිතා කරන ශාඛා ආකෘතිය අනුව මෙය බොහෝ ආකාරවලින් කළ හැකිය.

ශාඛාවක් මාස්ටර් සමඟ ඒකාබද්ධ වී ඇත්දැයි දැන ගැනීමට අවශ්‍ය නම්, MyTopicBranch ඒකාබද්ධ කර ඇත්නම් පහත විධානය මඟින් ප්‍රතිදානයක් නොලැබේ (එනම් ඔබට එය මකා දැමිය හැකිය)

$ git rev-list master | grep $(git rev-parse myTopicBranch)

ඔබට Git ශාඛා විධානය භාවිතා කර Bash හි ඇති සියලුම ශාඛා විග්‍රහ කර සියලු ශාඛා වලට forවඩා ලූපයක් කළ හැකිය. මෙම ලූපය තුළ ඔබට ශාඛාව මකා දැමිය හැකිද නැද්ද යන්න ඉහත විධානයෙන් පරීක්ෂා කරන්න.


8

ඔබ වින්ඩෝස් හි සිටී නම් ඔබට වින්ඩෝස් පවර්ෂෙල් හෝ පවර්ෂෙල් 7 භාවිතා කළ හැකිය අවුට්-ග්‍රිඩ්වීව් සමඟ හොඳ ශාඛා ලැයිස්තුවක් ඇති අතර ඔබට මකා දැමීමට අවශ්‍ය මූසිකය සමඟ තෝරන්න:

git branch --format "%(refname:short)" --merged  | Out-GridView -PassThru | % { git branch -d $_ }

රූප විස්තරය මෙහි ඇතුළත් කරන්න හරි ක්ලික් කිරීමෙන් පසු පවර්ෂෙල් විසින් මෙම ශාඛා නම් git branch -dවිධාන හා මකා දැමෙනු ඇතරූප විස්තරය මෙහි ඇතුළත් කරන්න


ඔබ දක්ෂයෙක්, බොහොම ස්තුතියි!
ක්‍රිස්ටෝෆ් බ්ලින්

7

git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d දැනට පරීක්ෂා කර ඇති ශාඛාව සහ / හෝ හැර අනෙකුත් සියලුම දේශීය ශාඛා මකා දමනු ඇත master .

මෙම විධානයන් අවබෝධ කර ගැනීමට බලාපොරොත්තු වන අයට මෙන්න ප්‍රයෝජනවත් ලිපියක්: Git Clean: දැනටමත් ඒකාබද්ධ කළ ශාඛා මකන්න, ස්ටීවන් හර්මන් විසිනි.


7

සටහන : පෙර පිළිතුරු ගැන මම සතුටු නොවෙමි, (සියලුම පද්ධතිවල වැඩ නොකිරීම, දුරස්ථව වැඩ නොකිරීම, - ගිලී ගිය ශාඛාව නියම නොකිරීම, හරියටම පෙරීම නොකිරීම). ඉතින්, මම මගේම පිළිතුරක් එක් කරමි.

ප්‍රධාන අවස්ථා දෙකක් තිබේ:

දේශීය

ඔබට අවශ්ය දේශීය ශාඛා මකා ඇති බව මේ වන විටත් තවත් ශාඛා කිරීමට ඒකාබද්ධ . මකාදැමීමේදී, මාස්ටර්, සංවර්ධනය වැනි වැදගත් ශාඛා කිහිපයක් තබා ගැනීමට ඔබට අවශ්‍යය.

git branch --format "%(refname:short)" --merged master | grep -E -v '^master$|^feature/develop$' | xargs -n 1 git branch -d

සටහන් :

  • git branch output --format ".." යනු හිස් අවකාශයන් ඉවත් කර හරියටම grep ගැලපීමට ඉඩ දීමයි
  • grep -Eභාවිතා කරනු වෙනුවට egrep , එබැවින් එය උදාසීන නොවන පද්ධති වලද ක්‍රියා කරයි (එනම්: කවුළු සඳහා git).
  • grep -E -v '^master$|^feature/develop$' මට මැකීමට අවශ්‍ය නැති දේශීය ශාඛා නියම කිරීමයි
  • xargs -n 1 git branch -d: දේශීය ශාඛා මකාදැමීම සිදු කරන්න (එය දුරස්ථ ඒවා සඳහා ක්‍රියා නොකරනු ඇත)
  • දැනට පරීක්ෂා කර ඇති ශාඛාව මකා දැමීමට උත්සාහ කළහොත් ඇත්ත වශයෙන්ම ඔබට දෝෂයක් ඇතිවේ. එබැවින්, මාස්ටර් වෙත මාරු වීමට පෙර යෝජනා කරමි.

දුරස්ථ

ඔබට අවශ්ය දුරස්ථ ශාඛා මකා ඇති බව මේ වන විටත් තවත් දුරස්ථ ශාඛාව ඒකාබද්ධ . මකාදැමීමේදී, ඔබට HEAD, master, release වැනි වැදගත් ශාඛා කිහිපයක් තබා ගැනීමට අවශ්‍යය.

git branch -r --format "%(refname:short)" --merged origin/master | grep -E -v '^*HEAD$|^*/master$|^*release' | cut -d/ -f2- | xargs -n 1 git push --delete origin

සටහන් :

  • දුරස්ථ සඳහා, අපි -rවිකල්පය භාවිතා කර සම්පූර්ණ ශාඛා නාමය සපයන්නෙමු :origin/master
  • grep -E -v '^*HEAD$|^*/master$|^*release' අපට මැකීමට අවශ්‍ය නොවන දුරස්ථ ශාඛා සමඟ ගැලපීමයි.
  • cut -d/ -f2-: git branchවිධානය මඟින් මුද්‍රණය කර ඇති අනවශ්‍ය 'සම්භවය /' උපසර්ගය ඉවත් කරන්න .
  • xargs -n 1 git push --delete origin : දුරස්ථ ශාඛා මකාදැමීම සිදු කරන්න.

6

ඔබට git-del-br මෙවලම භාවිතා කළ හැකිය .

git-del-br -a

pipභාවිතයෙන් ඔබට එය ස්ථාපනය කළ හැකිය

pip install git-del-br

PS: මම මෙවලමෙහි කර්තෘ. ඕනෑම යෝජනා / ප්‍රතිපෝෂණ සාදරයෙන් පිළිගනිමු.


1
@ stackoverflow.com/users/100297/martijn-pieters : මෙම පිළිතුර මකා දමා පහත් කොට සලකනු ලැබුවේ ඇයි?
tusharmakkar08

1
ඔබගේ පිළිතුර සහ මෙවලම ක්‍රියා නොකරයි. මම ඒ සඳහා පැය කිහිපයක් ගත කරනවා. කිසිවක් නැත.
SpoiledTechie.com

@ SpoiledTechie.com: ඔබ හරියටම මුහුණ දෙන ගැටලුව කුමක්දැයි මට කියන්න පුළුවන්ද? මම එය නිතිපතා භාවිතා කරමි.
tusharmakkar08

ඔබට මෙය නොබැඳි ලෙස ගැනීමට අවශ්‍ය නම් මට තිර රුවක් බෙදා ගත හැකිද? ඒ ගූගල් තැපැල් දේ ගැන නරක් වුණා. :)
SpoiledTechie.com

5

ඔබ දැනට සිටින ශාඛාවට දැනටමත් ඒකාබද්ධ වී ඇති සියලුම දේශීය ශාඛා මකා දැමීමට ඔබ කැමති නම්, කලින් පිළිතුරු මත පදනම්ව, එසේ කිරීමට මම ආරක්ෂිත විධානයක් ඉදිරිපත් කර ඇත්තෙමි.

git branch --merged | grep -v \* | grep -v '^\s*master$' | xargs -t -n 1 git branch -d

මෙම විධානය ඔබගේ වර්තමාන ශාඛාවට හෝ ප්‍රධාන ශාඛාවට බලපාන්නේ නැත. -Tar ධජය xargs භාවිතා කරමින් එය කිරීමට පෙර එය කරන්නේ කුමක්ද යන්නත් එය ඔබට කියනු ඇත.



5

මම git-flow esque නම් කිරීමේ ක්‍රමයක් භාවිතා කරමි, එබැවින් මෙය මට ඉතා ආරක්ෂිතව ක්‍රියා කරයි:

git branch --merged | grep -e "^\s\+\(fix\|feature\)/" | xargs git branch -d

එය මූලික වශයෙන් සොයන්නේ නූල් fix/හෝ සමඟ ආරම්භ වන ඒකාබද්ධ කොමිස් ය feature/.


4

පහත විධානය උත්සාහ කරන්න:

git branch -d $(git branch --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

භාවිතා කිරීමෙන් එය බැහැර කිරීම සඳහා වත්මන් ශාඛා නාමයgit rev-parse ලැබෙනු ඇත . ඔබට දෝෂයක් තිබේ නම්, එයින් අදහස් වන්නේ ඉවත් කිරීමට දේශීය ශාඛා නොමැති බවයි.

දුරස්ථ ශාඛා සමඟ එය කිරීමට ( originඔබගේ දුරස්ථ නම සමඟ වෙනස් කරන්න), උත්සාහ කරන්න:

git push origin -vd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD) | cut -d/ -f2)

ඔබ දුරස්ථ දුරස්ථ නම්, පෙරීමට grep origin |පෙර එක් කරන්න .cutorigin

ඉහත විධානය අසමත් වුවහොත්, පළමුව ඒකාබද්ධ කළ දුරස්ථ ලුහුබැඳීමේ ශාඛා මකා දැමීමට උත්සාහ කරන්න:

git branch -rd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

ඉන්පසු git fetchදුරස්ථය නැවත පෙර git push -vdවිධානය භාවිතා කරන්න .

ඔබ එය බොහෝ විට භාවිතා කරන්නේ නම්, ඔබේ ~/.gitconfigගොනුවට අන්වර්ථ නාමයක් ලෙස එකතු කිරීම සලකා බලන්න .

ඔබ වැරදීමකින් සමහර ශාඛා ඉවත් git reflogකර ඇත්නම්, නැතිවූ කොමිස් සොයා ගැනීමට භාවිතා කරන්න.


4

මෙම සමහර පිළිතුරු මත පදනම්ව මම එය කිරීමට මගේම බාෂ් පිටපතක් සාදන ලදී !

එය ඒකාබද්ධ කර ඇති ශාඛා භාවිතා කිරීම git branch --mergedසහ git branch -dමකා දැමීම සහ මකා දැමීමට පෙර එක් එක් ශාඛා සඳහා ඔබෙන් විමසනු ඇත.

merged_branches(){
  local current_branch=$(git rev-parse --abbrev-ref HEAD)
  for branch in $(git branch --merged | cut -c3-)
    do
      echo "Branch $branch is already merged into $current_branch."
      echo "Would you like to delete it? [Y]es/[N]o "
      read REPLY
      if [[ $REPLY =~ ^[Yy] ]]; then
        git branch -d $branch
      fi
  done
}

4

පහත විමසුම මට වැඩ කරයි

for branch in  `git branch -r --merged | grep -v '\*\|master\|develop'|awk 'NR > 0 {print$1}'|awk '{gsub(/origin\//, "")}1'`;do git push origin --delete $branch; done

මෙය ග්‍රෙප් පයිප්පයේ ඇති ඕනෑම ශාඛාවක් පෙරහන් කරයි.

Http ක්ලෝන හරහා හොඳින් ක්‍රියා කරයි, නමුත් ssh සම්බන්ධතාවය සඳහා එතරම් හොඳ නැත.


4

2018.07 වන විට

[alias]ඔබගේ කොටස වෙත මෙය එක් කරන්න ~/.gitconfig:

sweep = !"f() { git branch --merged | egrep -v \"(^\\*|master|dev)\" || true | xargs git branch -d; }; f"

දැන් ඔබට git sweepඅවශ්‍ය පිරිසිදු කිරීම සිදු කිරීමට ඇමතිය හැකිය .


මට නම්, git sweep ඇමතීමෙන් ලැයිස්තුගත කළ යුත්තේ පිරිසිදු කළ යුතු අතු පමණි, නමුත් එය ඒවා ඉවත් නොකරයි
වික්ටර් මොරේස්

4

වින්ඩෝස් වල git bash ස්ථාපනය කර ඇති egrep -v ක්‍රියා නොකරනු ඇත

git branch --merged | grep -E -v "(master|test|dev)" | xargs git branch -d

එහිදී grep -E -vසමාන වේegrep -v

-dදැනටමත් ඒකාබද්ධ කරන ලද අතු -Dඉවත් කිරීමට හෝ නොකැඩූ අතු ඉවත් කිරීමට භාවිතා කරන්න


egrep -v මා වෙනුවෙන් වැඩ කරයි. මම gitxtensions ස්ථාපකයෙන් gitbash භාවිතා කරමි
ජෝ ෆිලිප්ස්

4

එක් සෙන්ටිමීටරයකින් ඒකාබද්ධ කළ දේශීය හා දුරස්ථ ශාඛා ඉවත් කිරීමට මම පහත ක්‍රමය භාවිතා කර ඇත්තෙමි .

මගේ bashrcගොනුවේ පහත සඳහන් දෑ ඇත :

function rmb {
  current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
  if [ "$current_branch" != "master" ]; then
    echo "WARNING: You are on branch $current_branch, NOT master."
  fi
  echo "Fetching merged branches..."
  git remote prune origin
  remote_branches=$(git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$")
  local_branches=$(git branch --merged | grep -v 'master$' | grep -v "$current_branch$")
  if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
    echo "No existing branches have been merged into $current_branch."
  else
    echo "This will remove the following branches:"
    if [ -n "$remote_branches" ]; then
      echo "$remote_branches"
    fi
    if [ -n "$local_branches" ]; then
      echo "$local_branches"
    fi
    read -p "Continue? (y/n): " -n 1 choice
    echo
    if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
      # Remove remote branches
      git push origin `git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$" | sed 's/origin\//:/g' | tr -d '\n'`
      # Remove local branches
      git branch -d `git branch --merged | grep -v 'master$' | grep -v "$current_branch$" | sed 's/origin\///g' | tr -d '\n'`
    else
      echo "No branches removed."
    fi
  fi
}

මුල් ප්‍රභවය

මෙය ප්‍රධාන ශාඛාව මකා නොදමනු ඇත, නමුත් ඒකාබද්ධ කළ දේශීය හා දුරස්ථ ශාඛා ඉවත් කරයි . ඔබ මෙය ඔබගේ rc ගොනුවේ ඇති පසු, ධාවනය කරන්න rmb, ඔබට ඒකාබද්ධ කරන ලද ශාඛා ලැයිස්තුවක් පෙන්වනු ලබන අතර ඒවා පිරිසිදු කර ක්‍රියාව පිළිබඳ තහවුරු කිරීමක් ඉල්ලා සිටිනු ඇත. තහවුරු කිරීම ඉල්ලා නොසිටීම සඳහා ඔබට කේතය වෙනස් කළ හැකිය, නමුත් එය තබා ගැනීම හොඳය.


3

මාස්ටර් සමඟ ඒකාබද්ධ කර ඇති සියලුම ශාඛා Git විසින් පරීක්ෂා කරන පිටපතක් ලියන්න.

එහෙනම් කරන්න git checkout master.

අවසාන වශයෙන්, ඒකාබද්ධ කළ ශාඛා මකන්න.

for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do
  branchnew=$(echo $k | sed -e "s/origin\///" | sed -e "s/remotes\///")
  echo branch-name: $branchnew
  git checkout $branchnew
done

git checkout master

for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do
  branchnew=$(echo $k | sed -e "s/origin\///" | sed -e "s/remotes\///")
  echo branch-name: $branchnew
  git push origin --delete $branchnew
done

3

පිළිගත් විසඳුම ඉතා හොඳයි, නමුත් එක් ගැටළුවක් ඇත, එය දුරස්ථයකට ඒකාබද්ධ නොවූ දේශීය ශාඛා ද මකා දමයි.

ඔබ ප්‍රතිදානය දෙස බැලුවහොත් ඔබේ වැනි දෙයක් පෙනෙනු ඇත

$ git branch --merged master -v
  api_doc                  3a05427 [gone] Start of describing the Java API
  bla                      52e080a Update wording.
  branch-1.0               32f1a72 [maven-release-plugin] prepare release 1.0.1
  initial_proposal         6e59fb0 [gone] Original proposal, converted to AsciiDoc.
  issue_248                be2ba3c Skip unit-for-type checking. This needs more work. (#254)
  master                   be2ba3c Skip unit-for-type checking. This needs more work. (#254)

ශාඛා blaසහ issue_248නිශ්ශබ්දව මකා දැමිය හැකි දේශීය ශාඛා වේ.

නමුත් ඔබට එම වචනය දැක ගත හැකිය [gone], එයින් කියවෙන්නේ දුරස්ථයකට තල්ලු කර ඇති අතු (දැන් නැති වී ඇති) සහ එමඟින් අතු මකා දැමිය හැකි බවයි.

මුල් පිළිතුර මේ අනුව වෙනස් කළ හැකිය (කෙටි රේඛා දිග සඳහා බහු රේඛාවට බෙදන්න)

git branch --merged master -v | \
     grep  "\\[gone\\]" | \
     sed -e 's/^..//' -e 's/\S* .*//' | \
      xargs git branch -d

තවමත් ඒකාබද්ධ නොවූ අතු ආරක්ෂා කිරීමට. මෙය දුරස්ථ සම්භවයක් ඇති නිසාත්, නැති වී ඇති බවක් නොපෙන්වන නිසාත්, එය ආරක්ෂා කිරීම සඳහා ස්වාමියාට ඇඹරීම අවශ්‍ය නොවේ.


3

මට git branch --mergedGitHub PR හරහා ඒකාබද්ධ කළ ශාඛා නොපෙන්වයි. හේතු ගැන මට විශ්වාස නැත, නමුත් දුරස්ථ ලුහුබැඳීමේ ශාඛාවක් නොමැති සියලුම දේශීය ශාඛා මකා දැමීමට මම පහත රේඛාව භාවිතා කරමි :

diff <(git branch --format "%(refname:short)") <(git branch -r | grep -v HEAD | cut -d/ -f2-) | grep '<' | cut -c 3- | xargs git branch -D

පැහැදිලි කිරීම:

  • git branch --format "%(refname:short)" දේශීය ශාඛා ලැයිස්තුවක් ලබා දෙයි
  • git branch -r | grep -v HEAD | cut -d/ -f2- දුරස්ථ ශාඛා ලැයිස්තුවක් ලබා දෙයි, පෙරීම HEAD
  • diff <(...) <(...) වරහන් තුළ විධාන දෙකක ප්‍රතිදානයේ වෙනසක් ලබා දෙයි
  • grep '<' පළමු ලැයිස්තුවේ පවතින ශාඛා පෙරහන් කරයි, නමුත් දෙවන ලැයිස්තුවේ නැත
  • cut -c 3- 3 වන අක්ෂරයෙන් ආරම්භ වන රේඛාව ලබා දෙයි, එමඟින් උපසර්ගය ඉවත් කරයි <
  • xargs git branch -Dgit branch -Dඑක් එක් ශාඛා නාමයට එරෙහිව ක්‍රියාත්මක වේ

විකල්පයක් ලෙස, ඔබට මේ ආකාරයෙන් වැළකී සිටිය හැකිය grep -v '<':

diff --old-line-format="%L" --new-line-format="" --unchanged-line-format="" <(git branch --format "%(refname:short)") <(git branch -r | grep -v HEAD | cut -d/ -f2-) | xargs git branch -D
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.