ลบสาขาระยะไกลหลายแห่งในคอมไพล์


129

ฉันมีสมาชิกในทีมที่ผลักดันสาขาในท้องถิ่นของเขากว่า 150 สาขาไปยัง repo ส่วนกลางของเราโดยไม่ได้ตั้งใจ โชคดีที่พวกเขาทั้งหมดมีคำนำหน้าเหมือนกัน การใช้คำนำหน้านั้นมีคำสั่ง git หรือเชลล์สคริปต์เล็ก ๆ น้อย ๆ ที่ฉันสามารถใช้ซึ่งจะลบทั้งหมดในครั้งเดียวหรือไม่

คำตอบ:


151

ใช้คำสั่งต่อไปนี้เพื่อลบสาขาทั้งหมดที่มีPREFIXคำนำหน้าบนเซิร์ฟเวอร์ระยะไกล

git branch -r | awk -F/ '/\/PREFIX/{print $2}' | xargs -I {} git push origin :{}

คุณอาจต้องทำการ dry-run ก่อนเพื่อดูว่าเป็นสาขาที่คุณต้องการเอาออกหรือไม่:

git branch -r | awk -F/ '/\/PREFIX/{print $2}'

2
ฉันชอบตัวนี้เพราะมันเป็นซับเดียวและฉันสามารถวิ่งแบบแห้งก่อนได้ น่าเสียดายที่ข้อความนี้เกิดข้อผิดพลาด: $ git branch -r | awk -F/ '/\/APR/{print $2}' | xargs -I {} git push origin :{} error: unable to push to unqualified destination: APR-04-DPH The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'GIT_URL'
Jake

ด้วยgit branch -r | awk -F/ '/\/APR/{print $2}'คุณสามารถดูทั้งหมดเมษายนคำนำหน้าชื่อสาขาที่ระบุไว้?
neevek

1
ตกลงเป็นเพราะAPR-04-DPHสาขาถูกลบไปแล้ว ลองดูคำถามที่ตอบแล้วเหล่านี้: นี่และนี่และนี่ด้วย คำตอบสำหรับคำถามเหล่านี้ช่วยแก้ปัญหาเดียวกันคุณอาจต้องการทดสอบวิธีแก้ปัญหาด้วยตัวเอง
neevek

26
หากคุณมี / ในชื่อสาขาของคุณ (หากคุณใช้ git-flow หรืออะไรบางอย่าง) ให้พิมพ์ {$ 2 "/" $ 3} แทน
ajma

4
ฉันใช้ msysgit ใน Windows และคำสั่งต่อไปนี้ใช้ได้กับฉัน (ร่วมกับความคิดเห็นของ @ ajma สำหรับชื่อสาขาที่มีเครื่องหมายทับ:git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
rikoe

96

หากคุณชอบวิธีที่ง่ายกว่านี้เช่นลบ 3 หรือ 4 สาขา:

git push origin --delete <branch1> <branch2> <branch3>

สำคัญ: ใช้งานได้กับGit v1.7.0ขึ้นไปเท่านั้น


6
ฉันลงเอยด้วยการใช้git branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
Aram Kocharyan

36

ขอบคุณNeevekสำหรับโซลูชันที่ยอดเยี่ยมและสง่างาม!

แต่ฉันมีปัญหากับเครื่องหมายทับในชื่อสาขา (ฉันใช้ Git Flow) เนื่องจากawkตัวคั่นฟิลด์/( -Fตัวเลือก)

ดังนั้นวิธีแก้ปัญหาของฉันจึงขึ้นอยู่กับNeevekแต่แยกวิเคราะห์ชื่อสาขาด้วย/. ในกรณีนี้ฉันคิดว่ารีโมทของคุณโทรoriginมา คำสั่งสำหรับการลบสาขาระยะไกลที่มีชื่อที่จ้องมองด้วยPATTERN:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}' | xargs -I {} git push origin :{}

และอย่าลืมตรวจสอบสิ่งที่คุณกำลังจะลบ:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}'

เคล็ดลับที่เป็นประโยชน์:หากชื่อสาขาของคุณ (ไม่มีorigin/คำนำหน้า) เก็บไว้ในไฟล์ข้อความ (ชื่อสาขาหนึ่งชื่อต่อบรรทัด) ให้เรียกใช้:

cat your_file.txt | xargs -I {} git push origin :{}

2
ใช้xargs -a file -Lแทนcat file | xargs. xargs -a file git push --delete originได้ง่าย
musiKk

15

นี่อาจเป็นคำตอบที่ซ้ำกัน แต่ด้านล่างผ่านการทดสอบและใช้ได้ผลสำหรับฉันอย่างสมบูรณ์แบบ

  1. ลบสาขาในพื้นที่อย่างมีผลบังคับ

git branch -D branch-name

  1. ลบสาขาระยะไกล

git push origin - ลบชื่อสาขา

  1. ลบสาขาในพื้นที่มากกว่า 1 สาขา

สาขา git -D branch-name1 branch-name2

  1. ลบสาขาระยะไกลมากกว่า 1 สาขา

git push origin - ลบ branch-name1 branch-name2

  1. ลบสาขาในพื้นที่ด้วยคำนำหน้า ตัวอย่างเช่นคุณลักษณะ / *

สาขา git -D $ (git branch --list 'feature / *')

git branch -D backticks $ (git branch --list 'feature / *' backticks )

  1. แสดงรายการสาขาระยะไกลพร้อมคำนำหน้า

สาขา git -r | grep -Eo 'คุณลักษณะ /.*'

  1. ลบสาขาระยะไกลด้วยคำนำหน้า

สาขา git -r | grep -Eo 'คุณลักษณะ /.*' | xargs -I {} git push origin: {}


2
ฉันคิดว่าคุณตั้งใจจะหนีการตีกลับในขั้นตอนที่ 5
GPL

จะเพิ่ม backticks ได้อย่างไร?
เร

1
@ นเรนทร์: ปัญหาคือการจัดรูปแบบ markdown จะเปลี่ยน backticks ของคุณเป็นคำสั่งสไตล์ ฉันแทนที่ด้วยวิธีการแทนที่คำสั่งอื่น (เช่น "$ (command)" เทียบเท่ากับ "command" แต่ไม่ได้รับการแปลโดย markdown เป็นสิ่งแปลก ๆ ) สิ่งอื่นที่คุณสามารถทำได้คือหลีกเลี่ยง backticks ด้วย '\'
Stabledog

13

เช่นเดียวกันกับ git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}grep:

branch -rorigin/prefix/branchnameแสดงให้เห็นว่า prefix/branchnameดังนั้นมันจะใช้เวลา


ฉันคิดว่าคุณหมายถึงไม่ได้xargs -I {} git push origin :{} -i
jojo

1
@jojo, AFAIK เพราะ-iใช้การแทนที่เริ่มต้นสำหรับ{}แต่-Iคุณอาจประกาศของคุณเอง ... พบเพียงในคู่มือ:-i ... the same as -I{}
Kirby

10

โซลูชันของ Neevek นั้นสวยงาม แต่จะดีกว่า: โซลูชันตามที่เสนอเรียกว่า 'git push' หนึ่งครั้งต่อสาขาซึ่งหมายถึงเครือข่ายเพิ่มเติมแบบไปกลับต่อสาขาที่จะถูกลบ เนื่องจากคุณใช้ awk อยู่แล้วทำไมไม่ใช้เพื่อนำหน้า ':' จากนั้น xargs สามารถเรียก 'git push' ได้ในครั้งเดียวและลบสาขาทั้งหมดพร้อมกัน:

Dry-run เพื่อแสดงรายการสาขาที่จะถูกลบ:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}'

วิธีสุดท้ายในการผลักดันการลบจริง:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}' | xargs git push origin

2
ทำงานได้อย่างสมบูรณ์ในสถานการณ์ที่คุณไม่สามารถใช้ตัวเลือก "-I" สำหรับ xargs เมื่อคุณมี bash เวอร์ชันที่ต่ำกว่าหรือใช้ git bash เวอร์ชัน windows
zchholmes

ฉันมีxargs: replstr may not be emptyวิธีแก้ปัญหาของ Neevek อาจจะเป็นเวอร์ชัน git .. git version 1.9.5แต่วิธีนี้ใช้ได้ผลดีสำหรับฉัน ขอบคุณคุณทั้งสอง
IamFace

8

แหล่งข้อมูลhttps://coderwall.com/p/eis0ba

    1 - List all your remote branches:

    $ git branch -r

    2 - Filter the branches by some regular expression. In this case I'm interested in deleting any branch with the 'feature-' prefix:

    $ git branch -r | awk -F/ '/\/feature-/{print $2}'
    3 - Pipe the last command to git push to delete them:
    # **Edit** - Removed extra colon, which is not needed
    $ git branch -r | awk -F/ '/\/feature-/{print $2}' | xargs -I {} git push origin {}
    4 - Grab a beer.

    5 - Remove any local reference to those branches:

    $ git remote prune origin

ขอบคุณสิ่งนี้ได้ผลสำหรับฉัน ในกรณีที่ฉันสามารถลบสาขาในพื้นที่หลายแห่งได้ ขอบคุณ!
Prashant Kabade

5

ขอบคุณ Steve และ Neevek ฉันพบวิธีแก้ปัญหาที่ใช้ได้ผลดีสำหรับฉันฉันคิดว่าควรค่าแก่การแบ่งปัน:

วิธีแก้ปัญหาของสตีฟใช้ได้ผลกับฉันด้วยการปรับเปลี่ยนเล็กน้อย รีโมทของฉันถูกตั้งชื่อorigin/feature/some-feature-nameดังนั้นฉันจึงตัดawk:

git branch -r | awk -Forigin/ '/\/feature/ {print $2 $3}' | xargs -I {} git push origin :{}

ตอนนี้กำลังทำขั้นตอนการลบเล็กน้อยที่ดี:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
To github.com:project/project-name.git
- [deleted]         feature/search-placeholder
To github.com:project/project-name.git
- [deleted]         feature/server-error-message
To github.com:project/project-name.git
- [deleted]         feature/six-point-asterisk

สงสัยว่ามีใครมีไอเดียสำหรับวิธีแก้ปัญหาที่หรูหรากว่านี้หรือไม่ซึ่งอาจให้ผลลัพธ์บางอย่างเช่นนี้ (สคริปต์ CLI ของฉันค่อนข้างแย่ดังนั้นฉันจึงต้องใช้เวลาสักพักในการคิดออก):

git push origin :feature/search-min-chars :feature/search-placeholder :feature/server-error-message :feature/six-point-asterisk

สิ่งนี้จะทำให้ได้ผลลัพธ์เดียวที่ดีพร้อมคำขอเครือข่ายเดียว:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
- [deleted]         feature/search-placeholder
- [deleted]         feature/server-error-message
- [deleted]         feature/six-point-asterisk

4

ขอบคุณ Neevek สิ่งนี้ใช้งานได้ดีหลังจากกำหนดค่าใหม่ตามจุดประสงค์ของฉัน:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2 "/" $3}' | xargs -I {} git push origin :{}

ฉันยังต้องคำนึงถึงโครงสร้างโฟลเดอร์ด้วย สาขาคุณลักษณะของฉันอยู่ในโครงสร้างโฟลเดอร์เช่นต้นทาง / คุณลักษณะ / PREFIX-FEATURENUMBER ดังนั้นฉันจึงต้องสร้างรูปแบบของฉันจาก $ 2 = โฟลเดอร์ + $ 3 = แผดเผา


4

ทุกคนใช้awkไม่แน่ใจว่าทำไม ฉันรู้สึกว่ามันซับซ้อนมากขึ้น นี่คือสิ่งที่ฉันใช้เพื่อลบสาขาระยะไกลทั้งหมดบนforkรีโมทของฉัน:

$ git branch -r --list 'fork/*' | sed 's/fork\///' | xargs git push --delete fork

โยนgrepระหว่างxargsและsedถ้าคุณต้องการกรองรายการให้เหลือเพียงส่วนย่อยของสาขาระยะไกล


1
ขอบคุณมาก. หนึ่งนี้ทำงานจริงสำหรับฉันในหมู่โซลูชั่นทั้งหมด .. grep origin/blaprefix_anotherblaกำลังจะกลับสาขาเต็มรูปแบบที่มีชื่อระยะไกลด้วยเช่น แต่ใช้sedการจัดการได้ดี ข้อดีอีกอย่างของวิธีนี้คือฉันใช้ bitbucket และฉันไม่จำเป็นต้องป้อนรหัสผ่านการตรวจสอบสิทธิ์สำหรับการลบสาขาทุกครั้งด้วยตนเอง อันนี้ลบสาขาทั้งหมดในชุดเดียว
Madhur Bhaiya

หากต้องการลบสาขาgit branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
Greenkeeper

4

ฉันรู้ว่านี่เป็นคำสั่ง git แต่ถ้าคุณกำลังมองหาทางเลือกอื่นเพื่อให้ได้ผลลัพธ์ที่คล้ายกันหรือเหมือนกัน:

คุณสามารถทำได้จากที่นี่ (Git Remove Remote Branches):

จากนั้นเลือกสาขาที่คุณต้องการ:

ตรวจสอบให้แน่ใจว่าคุณมีสิทธิ์ในการลบสาขาระยะไกล


นี่น่าจะเป็นคำตอบอันดับต้น ๆ เพราะเป็นแพลตฟอร์มที่ไม่ขึ้นต่อกัน
karmington

ซอฟต์แวร์คืออะไรและมีให้สำหรับ linux หรือไม่?
abhisekp

1

Github ยังมี UI และกลไกที่ดีสำหรับการลบสาขาอย่างรวดเร็วนั่นคือถ้าคุณต้องการใช้ UI


1
ใช่มีการบันทึกไว้ที่นี่แต่คุณยังต้องคลิกหนึ่งครั้งสำหรับแต่ละสาขา โซลูชันที่ได้รับการโหวตสูงสุดที่นี่เป็นวิธีที่ดีที่สุดในการทำหลายสาขาที่คุณสามารถเขียน regex เพื่อจับคู่ได้
thewoolleyman

0

ฉันพยายามลบสาขาระยะไกลต้นทาง / release / r1-1 * ทั้งหมดดังนั้นบรรทัดคำสั่งต่อไปนี้จึงทำงานได้ดี

git branch -r | awk -Forigin/ '/\/*r1-1/ {print $2}' |  xargs -I {} git push origin :{}

0

ฉันไม่สามารถใช้ awk ได้เนื่องจากเราใช้โครงสร้างสแลชสำหรับชื่อสาขาของเรา

git branch -r | grep "origin/users/YOURNAME" | sed -r 's/^.{9}//'| xargs -i  sh -c 'git push origin --delete {}'

สิ่งนี้จะได้รับสาขาระยะไกลทั้งหมดรับเพียงอันเดียวสำหรับผู้ใช้คนเดียวจากระยะไกลสตริง "ต้นทาง /" และดำเนินการลบในแต่ละรายการ


0

วิ่งแห้ง:

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} echo {}

ลบสาขาระยะไกล:

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

ลบเฉพาะสาขาระยะไกลที่ผสานอย่างสมบูรณ์:

git branch -r --merged --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

คำอธิบาย:

sed "s/origin\///"จะลบออกorigin/จากชื่อสาขา โดยไม่ต้องถอดสิ่งนั้นออกไปฉันได้:remote ref does not exist


0

คำตอบก่อนหน้านี้ช่วยให้ฉันลบสาขารีลีสทั้งหมดออกจากปี 2018 ฉันรันสิ่งนี้บนพรอมต์คำสั่ง windows 10 ของฉัน ฉันติดตั้งเสียงกริ๊กแล้วดังนั้นคำสั่งเช่น Linux จึงใช้ได้กับฉัน

วิ่งแห้ง:

git branch -a | grep -o "release-.*2018" | xargs -I {} echo {}

หาก dry run แสดงสาขาที่ไม่ได้อยู่ในระยะไกล / ต้นทาง เรียกใช้คำสั่ง git prune ด้านล่างเพื่อแก้ไขและตรวจสอบอีกครั้ง

git remote prune origin

ลบเมื่อคุณพอใจกับผลลัพธ์ด้านบน:

git branch -a | grep -o "release-.*2018" | xargs -I {} git push origin --delete {}

หากคุณเห็น: error: unable to delete 'release-...2018': remote ref does not exist. จากนั้นเรียกใช้คำสั่ง prune ก่อนหน้าแล้วลองอีกครั้ง


-4

คำเตือน: การดำเนินการนี้จะลบสาขาระยะไกลทั้งหมด ใช้ด้วยความระมัดระวัง

ฉันคิดว่าวิธีการลบสาขาระยะไกลนั้นดีที่สุด

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

คำเตือน: การดำเนินการนี้จะลบสาขาระยะไกลทั้งหมด ใช้ด้วยความระมัดระวัง


4
ถูกโหวตให้เป็นโทรลล์อย่างชัดเจน จะลบถ้าฉันมีสิทธิ์
Jake

คุณพบการหลอกล่อที่ไหน
Dmytro Gorpynenko

2
สิ่งนี้ไม่ถูกต้องคุณไม่มีข้อโต้แย้งที่สำคัญบางประการสำหรับ xargs และไม่ได้ตอบคำถาม
Rob

@ JakeA Smith Jake ฉันเดาว่าคุณคิดว่ารหัสนี้จะลบรีโมตมาสเตอร์ - ซึ่งไม่ใช่กรณีที่ grep -v master ค้นหาทุกอย่างยกเว้น master
Vadim Samokhin

@Rob มีอะไรไม่ถูกต้องที่นี่? คำสั่งที่ดำเนินการขั้นสุดท้ายจะเป็น smth เช่น git push: some_branch: another_branch ซึ่งถูกต้องแน่นอน
Vadim Samokhin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.