ลบสาขา git ท้องถิ่นทั้งหมด


323

ฉันทำตามกระบวนการพัฒนาที่ฉันสร้างสาขาท้องถิ่นใหม่สำหรับคุณสมบัติใหม่หรือการ์ดเรื่องราว เมื่อเสร็จแล้วฉันจะรวมสาขาเป็นหลักแล้วกด

สิ่งที่มีแนวโน้มที่จะเกิดขึ้นเมื่อเวลาผ่านไปเนื่องจากการผสมผสานของความเกียจคร้านหรือความหลงลืมคือฉันท้ายที่สุดมีรายการสาขาท้องถิ่นจำนวนมากซึ่งบางส่วน (เช่นแหลม) อาจไม่ถูกรวมเข้าด้วยกัน

ฉันรู้วิธีการแสดงรายการสาขาในพื้นที่ทั้งหมดของฉันและฉันรู้วิธีลบสาขาเดียว แต่ฉันสงสัยว่ามีคำสั่ง git ที่ทำให้ฉันสามารถลบสาขาท้องถิ่นทั้งหมดของฉันได้หรือไม่

ด้านล่างเป็นผลลัพธ์ของgit branch --mergedคำสั่ง

user@machine:~/projects/application[master]$ git branch --merged
  STORY-123-Short-Description
  STORY-456-Another-Description
  STORY-789-Blah-Blah
* master

ความพยายามในการลบสาขาที่มีรายชื่อgrep -v \*(ตามคำตอบด้านล่าง) ส่งผลให้เกิดข้อผิดพลาด:

error: branch 'STORY-123-Short-Description' not found.
error: branch 'STORY-456-Another-Description' not found.
error: branch 'STORY-789-Blah-Blah' not found.

ฉันใช้:
git 1.7.4.1
ubuntu 10.04
ทุบตี GNU, รุ่น 4.1.5 (1) - ปล่อย
GNU grep 2.5.4


7
ฉันขอให้คุณยอมรับ @Andrew คำตอบ!
Robert Siemer


@GiulioCaccin คำถามนี้เกี่ยวข้องกับสาขาที่อาจไม่ได้รับการผสานและฉันได้อัปเดตคำถามเพื่อให้สะท้อนสิ่งนี้อย่างชัดเจน
Louth

คำตอบ:


384

คำสั่งย่อย 'git branch -d' สามารถลบมากกว่าหนึ่งสาขา ดังนั้นลดความซับซ้อนของคำตอบ @ sblom แต่เพิ่ม xargs สำคัญ:

git branch -D `git branch --merged | grep -v \* | xargs`

หรือเพิ่มความง่ายให้กับ:

git branch --merged | grep -v \* | xargs git branch -D 

ที่สำคัญตามที่ระบุไว้โดย @AndrewC การใช้git branchงานสคริปต์ไม่ได้รับการสนับสนุน เพื่อหลีกเลี่ยงมันใช้สิ่งที่ชอบ:

git for-each-ref --format '%(refname:short)' refs/heads | grep -v master | xargs git branch -D

ข้อควรระวังเกี่ยวกับการลบ!

$ mkdir br
$ cd br; git init
Initialized empty Git repository in /Users/ebg/test/br/.git/
$ touch README; git add README; git commit -m 'First commit'
[master (root-commit) 1d738b5] First commit
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README
$ git branch Story-123-a
$ git branch Story-123-b
$ git branch Story-123-c
$ git branch --merged
  Story-123-a
  Story-123-b
  Story-123-c
* master
$ git branch --merged | grep -v \* | xargs
Story-123-a Story-123-b Story-123-c
$ git branch --merged | grep -v \* | xargs git branch -D
Deleted branch Story-123-a (was 1d738b5).
Deleted branch Story-123-b (was 1d738b5).
Deleted branch Story-123-c (was 1d738b5).

คำสั่งนี้ยังคงรายงานข้อผิดพลาดเช่นเดียวกับที่ระบุไว้ในความคิดเห็นสำหรับคำตอบด้านล่าง error:branch 'STORY-123-Short-Description' not found.สำหรับแต่ละสาขาที่ระบุไว้
Louth

1
ได้ผลสำหรับฉัน ดูด้านบนพร้อมรายละเอียดที่เพิ่มเข้ามา
GoZoner

1
ดังนั้นการใช้ git 1.7.10 แก้ปัญหาของคุณหรือคุณชอบที่จะทำงานโดยตรงในที่เก็บ. git หรือไม่?
GoZoner

1
หากคุณได้รับerror:branch 'STORY-123-Short-Description' not found.ข้อผิดพลาดอาจเป็นเพราะการตั้งค่าสี git สิ่งนี้ใช้ได้สำหรับฉัน (สังเกต--no-colorตัวเลือก):git branch --no-color --merged | grep -v \* | xargs git branch -D
marcok

3
คำตอบเดียวของ SO ฉันพบว่าใช้งานได้ ขอบคุณ!
Kevin Suttle

140

ฉันพบวิธีที่ดีกว่าในการแสดงความคิดเห็นในปัญหานี้ใน github :

git branch --merged master --no-color | grep -v master | grep -v stable | xargs git branch -d

แก้ไข:เพิ่มตัวเลือกที่ไม่มีสีและไม่รวมสาขาที่มีเสถียรภาพ (เพิ่มสาขาอื่น ๆ ตามต้องการในกรณีของคุณ)


2
ในที่สุดการแก้ปัญหาที่ฉันต้องการ
Code Whisperer

1
ฉันลองมาแล้ว แต่จะได้รับerror: branch 'my-branch-name' not found.ทุกสาขา ใช้ git เวอร์ชั่น 1.8.3.4 (Apple Git-47) มีความคิดอะไรไหม?
wheresrhys

ลอง 'git branch - masterged master | grep -v master | xargs echo 'เพื่อดีบักสิ่งที่พยายามลบอย่างแน่นอน? ไม่มีความคิดที่ดีกว่า ...
mBardos

2
ดังนั้น. git for-each-ref --format '%(refname:short)' refs/heads/ | grep -v master | xargs git branch -d
ПавелТявин

1
เรียนรู้การใช้งาน xargs พร้อมกับสิ่งนี้ ขอบคุณ
Volem

105

git branchไม่แนะนำให้แยกเอาต์พุตของและไม่ใช่คำตอบที่ดีสำหรับผู้อ่านในอนาคตเกี่ยวกับ Stack Overflow

  1. git branchเป็นสิ่งที่เรียกว่าคำสั่งเครื่องเคลือบ คำสั่งเครื่องเคลือบดินเผาไม่ได้รับการออกแบบให้แยกวิเคราะห์เครื่องจักรและผลผลิตอาจเปลี่ยนไประหว่าง Git รุ่นต่าง ๆ
  2. มีตัวเลือกการกำหนดค่าผู้ใช้ที่เปลี่ยนเอาต์พุตgit branchในลักษณะที่ทำให้แยกวิเคราะห์ได้ยาก (ตัวอย่างเช่น colorization) หากผู้ใช้ตั้งค่าไว้color.branchแล้วคุณจะได้รับรหัสควบคุมในเอาต์พุตสิ่งนี้จะนำไปสู่error: branch 'foo' not found.หากคุณพยายามไพพ์ไปยังคำสั่งอื่น คุณสามารถหลีกเลี่ยงสิ่งนี้ได้ด้วยการ--no-colorตั้งค่าสถานะgit branchแต่ใครจะรู้ว่าการกำหนดค่าผู้ใช้อื่น ๆ อาจทำลายสิ่งต่าง
  3. git branch อาจทำสิ่งอื่น ๆ ที่น่ารำคาญในการแยกวิเคราะห์เช่นวางเครื่องหมายดอกจันที่อยู่ถัดจากสาขาที่เช็คเอาท์ในปัจจุบัน

ผู้ดูแลระบบ git ได้กล่าวถึงการเขียนสคริปต์เกี่ยวกับgit branchเอาต์พุต

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

คำตอบที่แนะนำการแก้ไขไฟล์ด้วยตนเองใน.gitไดเรกทอรี (เช่น. git / refs / heads) มีปัญหาคล้ายกัน (refs อาจอยู่ใน. git / packing-refs แทนหรือ Git อาจเปลี่ยนเค้าโครงภายในของพวกเขาในอนาคต)

Git จัดเตรียมfor-each-refคำสั่งเพื่อดึงรายชื่อสาขา

Git 2.7.X จะแนะนำ--mergedตัวเลือกเพื่อให้คุณสามารถทำสิ่งต่าง ๆ ด้านล่างเพื่อค้นหาและลบสาขาทั้งหมดที่รวมอยู่ในHEAD

for mergedBranch in $(git for-each-ref --format '%(refname:short)' --merged HEAD refs/heads/)
do
    git branch -d ${mergedBranch}
done

Git 2.6.X และเก่ากว่าคุณจะต้องแสดงรายการสาขาท้องถิ่นทั้งหมดแล้วทดสอบแยกกันเพื่อดูว่ามีการรวมสาขาหรือไม่ (ซึ่งจะช้ากว่ามากและซับซ้อนกว่าเล็กน้อย)

for branch in $(git for-each-ref --format '%(refname:short)' refs/heads/)
do
    git merge-base --is-ancestor ${branch} HEAD && git branch -d ${branch}
done

git branch --no-color 2>/dev/null?
ดี

5
มันเป็นการปรับปรุงอย่างแน่นอน คุณจะมีปัญหาในการจำเป็นต้องกรอง * และมันจะทำให้สิ่งต่าง ๆ น่าขบขันถ้าใครบางคนวิ่งออกมาจากหัวเดี่ยว แม้ว่าปัญหาหลักคือgit branchคำสั่งเครื่องเคลือบและไม่มีการรับประกันว่าผลผลิตจะไม่เปลี่ยนแปลงในบางรุ่นในอนาคตของ git
Andrew C

ขอบคุณ @AndrewC - นี่คือคำตอบสำหรับคำถามเกี่ยวกับข้อผิดพลาด "ไม่พบสาขา" ที่ลึกลับและมอบวิธีการแก้ปัญหาการทำงานโดยใช้คำสั่งที่เหมาะสมยิ่งขึ้น! 👍
Jason

2
คำสั่ง GIT 'Porcelain' และ 'non-Porcelain' ถูกระบุอย่างไร
GoZoner

1
อาจเป็นการปรับปรุงที่มีประโยชน์หากไม่รวม 'dev' และ 'master' เป็นค่าเริ่มต้น
PandaWood

66

วิธีที่ง่ายกว่าในการลบสาขาทั้งหมด แต่ทำให้คนอื่น ๆ เช่น "พัฒนา" และ "หลัก" มีดังต่อไปนี้:

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D

มีประโยชน์มาก !


8
คุณได้สร้างเธรดเก่าที่มีอายุเก่าแล้วและโพสต์คำตอบที่เหมือนกันกับคำตอบที่มีอยู่เดิมนั่นคือ buggy และขาดการเปลี่ยนแปลงด้านความปลอดภัยที่มี นี่ไม่ใช่คำตอบที่ดี
Andrew C

6
คำตอบนี้มีความชัดเจนในการไพพ์เอาท์พุทจากสาขา git แก้ไขและส่งผ่านไปยัง git branch -D ไม่จำเป็นต้องใจร้าย
Pam

วิธีนี้ใช้ได้ผลสำหรับฉัน ลบสาขาท้องถิ่นทั้งหมดแล้ว
Prad

1
สิ่งนี้จะไม่ลบสาขาใด ๆ ที่มีคำที่พัฒนาหรือต้นแบบเช่น 'develop_feature' หรือ 'master_feature'
django

นี่คือคำตอบที่ฉันกำลังมองหา👆🏻
Konrad G

62

หากต้องการลบทุกสาขายกเว้นสาขาที่คุณได้ชำระเงินแล้ว:

for b in `git branch --merged | grep -v \*`; do git branch -D $b; done

ฉันขอแนะนำให้เปลี่ยนgit branch -D $bเป็นecho $bสองสามครั้งแรกเพื่อให้แน่ใจว่าจะลบสาขาที่คุณต้องการ


1
ด้วยคำสั่งนี้ฉันจะได้error:branch 'a_branch_name' not found.เห็นสิ่งที่คุณกำลังพยายามทำและฉันได้เล่นกับคำสั่ง แต่ด้วยเหตุผลบางอย่าง git ดูเหมือนจะไม่เหมือนชื่อสาขาที่ให้ ...
Louth

อืมม เพื่อช่วยแก้ไขปัญหามันจะมีประโยชน์ในการดูตัวอย่างผลลัพธ์จากgit branch --merged
sblom

ชื่อสาขาของฉันของรูปแบบSTORY-123-Short-Description
ลู ธ

และเมื่อคุณเรียกใช้git branch --mergedคุณจะได้รับรายชื่อหนึ่งในแต่ละบรรทัด?
sblom

1
มันพูดอย่างแท้จริงerror:branch 'a_branch_name' not found.? หรือมันบ่นเกี่ยวกับหนึ่งในชื่อสาขาจากgit branchผลลัพธ์ของคุณข้างต้น?
sblom

52

คำสั่งด้านล่างจะลบสาขาท้องถิ่นทั้งหมดยกเว้นสาขาหลัก

git branch | grep -v "master" | xargs git branch -D

คำสั่งดังกล่าว

  1. รายการสาขาทั้งหมด
  2. จากรายการให้ละเว้นสาขาหลักและใช้ส่วนที่เหลือของสาขา
  3. ลบสาขา

4
ฉันจะใช้git branch | grep -v "master" | xargs git branch -dก่อนดังนั้นฉันจะไม่ลบสาขาที่ไม่ได้แยกทิ้งเพื่อความปลอดภัย แต่คำตอบที่ดี!
Jonas Lomholdt

3
นี่คือรุ่น PowerShell,@(git branch | Select-String -Pattern "[^(*?)\s? master]") | ForEach-Object{$_.Line.Trim()} | %{git branch -D $_}
Jonas Lomholdt

1
@baklazan สิ่งนี้จะใช้ได้เฉพาะในบรรทัดคำสั่งของ Windows 10 หากคุณมีเครื่องมือบางอย่างติดตั้งอยู่ คุณอาจมี MINGW หรือสิ่งอื่น ๆ และคุณไม่รู้
KthProg

42

แค่ทราบว่าฉันจะอัพเกรดเป็นคอมไพล์ 1.7.10 คุณอาจได้รับคำตอบที่นี่ซึ่งไม่สามารถใช้ได้กับเวอร์ชั่นของคุณ refs/heads/ฉันเดาว่าคุณจะมีคำนำหน้าชื่อสาขาที่มี

ข้อควรระวังให้ทำตามขั้นตอนต่อไปนี้เฉพาะในกรณีที่คุณทำสำเนาโฟลเดอร์ทำงานและไดเรกทอรี. git

.git/refs/headsบางครั้งผมก็เพียงไปข้างหน้าและลบสาขาฉันไม่ต้องการตรงจาก สาขาทั้งหมดเหล่านี้เป็นไฟล์ข้อความที่มีอักขระ 40 sha-1 ของการกระทำที่ชี้ไป คุณจะมีข้อมูลที่ไม่เกี่ยวข้องในตัวคุณ.git/configหากคุณมีการตั้งค่าการติดตามเฉพาะสำหรับพวกเขา คุณสามารถลบรายการเหล่านั้นด้วยตนเองเช่นกัน


ในที่สุดตัวเลือกที่ง่ายและในทางปฏิบัติ ฉันชอบมัน: D
Melvyn

2
สิ่งนี้จะไม่ทำงานหากคุณมีการอ้างอิงที่บรรจุหรือบางครั้งคุณโคลนจากเซิร์ฟเวอร์ระยะไกล (ซึ่งจะให้ไฟล์ที่คุณบรรจุ) หากคุณอ้างอิงจะถูกบรรจุแล้วอ้างอิงจะไม่ถูกเก็บไว้ใน. git / refs / หัวพวกเขาจะถูกเก็บไว้ในไฟล์ที่เรียกว่า "บรรจุอ้างอิง" ดูgit-scm.com/docs/git-pack-refs
Alexander Bird

1
ดูเหมือนว่าเป็นความคิดที่ไม่ดีที่จะลบสาขาที่คุณเช็คเอาท์ในขณะนี้
Moberg

@Moberg เพียงแค่ส่งคำสั่งล่วงหน้าและ HEAD เดี่ยวของคุณจะลอยได้เลย
RomainValeri

34

ลองใช้คำสั่งเชลล์ต่อไปนี้:

git branch | grep -v "master" | xargs git branch -D

คำอธิบาย:

  • 🛒รับทุกสาขาผ่านgit branch | grep -v "master"คำสั่ง
  • 👇เลือกทุกสาขาด้วยxargsคำสั่ง
  • 💦ลบสาขาด้วย xargs git branch -D

3
แม้ว่านี่อาจเป็นคำตอบที่ถูกต้อง โค้ดหนึ่งบรรทัดไม่มีประโยชน์อย่างมากหากไม่มีคำอธิบายว่าอะไรและจะแก้ไขคำถามเดิมได้อย่างไร กรุณาให้รายละเอียดคำตอบของคุณ
RyanNerd

28

หากต้องการลบสาขาท้องถิ่นทั้งหมดใน linux ยกเว้นสาขาที่คุณเปิด

// hard delete

git branch -D $(git branch)

2
อันนี้ให้ความรู้สึกปลอดภัยกว่าไปหา. git และเอาของออก
nelsontruran

25

ฉันพบว่าการใช้ text editor และ shell ง่ายขึ้น

  1. พิมพ์git checkout <TAB>ในเปลือก จะแสดงสาขาท้องถิ่นทั้งหมด
  2. คัดลอกไปยังโปรแกรมแก้ไขข้อความลบสิ่งที่คุณต้องการเก็บไว้
  3. แทนที่ตัวแบ่งบรรทัดด้วยช่องว่าง (ใน SublimeText มันง่ายสุด ๆ )
  4. git branch -D <PASTE THE BRANCHES NAMES HERE>เปิดเปลือกชนิด

แค่นั้นแหละ.


ฉันไม่คิดว่าคุณจะลบสาขาที่คุณยืนอยู่ได้
ดงทัง

@Dong มี * ข้างสาขานั้นดังนั้นคุณแค่ลบมันออกจากรายการที่ถูกคัดลอก!
เมลานี

12

ฉันมีสถานการณ์คล้ายกันและเพิ่งพบคำสั่งต่อไปนี้มีประโยชน์

git branch -D `git branch | awk '{ if ($0 !~ /<Branch_You_Want_to_Keep>/) printf "%s", $0 }'`

ถ้าคุณต้องการเก็บหลายสาขาแล้ว

git branch -D `git branch | awk '{ if ($0 !~ /<Branch_You_Want_to_Keep1>|<Branch_You_Want_to_Keep2>/) printf "%s", $0 }'`

หวังว่านี่จะช่วยใครซักคน


1
Nice one แต่ฉันต้องการ backticks เพื่อให้มันทำงาน - โดยgit branch -D `git branch | awk '{ if ($0 !~ /master/) printf "%s", $0 }'` ปกติฉันคิดว่าคุณมีพวกมัน แต่แรกเริ่ม แต่พวกเขาก็หลงทางในการฟอร์แมต SO
tassinari

10

จาก Windows Command Line ลบทั้งหมดยกเว้นสาขาที่เช็คเอาท์ปัจจุบันโดยใช้:

for /f "tokens=*" %f in ('git branch ^| find /v "*"') do git branch -D %f

7

หากคุณไม่จำเป็นต้องผ่าน Git เองคุณสามารถลบส่วนหัวภายใต้. git / refs / headsด้วยตนเองหรือโดยทางโปรแกรม ต่อไปนี้ควรใช้กับการปรับแต่งน้อยที่สุดภายใต้ Bash:

shopt -s extglob
rm -rf .git/refs/heads/!(master)

การดำเนินการนี้จะลบทุกสาขาท้องถิ่นยกเว้นสาขาหลักของคุณ เนื่องจากสาขาต้นน้ำของคุณจะถูกเก็บไว้ภายใต้. git / refs / remotesพวกเขาจะยังคงไม่ถูกแตะต้อง

หากคุณไม่ได้ใช้ Bash หรือต้องการเก็บที่เก็บ Git จำนวนมากในคราวเดียวคุณสามารถทำสิ่งที่คล้ายกับ GNU เพื่อค้นหา:

find . \
    -path remotes -path logs -prune -o \
    -wholename \*.git/refs/heads/\* \! -name master -print0 |
xargs -0 rm -rf

โซลูชันการค้นหาน่าจะพกพาได้มากกว่า แต่การตัดเส้นทางและชื่อไฟล์นั้นยุ่งยากและอาจเกิดข้อผิดพลาดได้ง่ายกว่า


เย็น. Visual delete :)
sandalone

5

ไม่มีคำตอบที่ตรงกับความต้องการของฉันอย่างสมบูรณ์ดังนั้นเราไปที่นี่

git branch --merged | grep -E "(feature|bugfix|hotfix)/" | xargs git branch -D && git remote prune origin

นี้จะลบสาขาในประเทศทั้งหมดที่มีการควบรวมกิจการและการเริ่มต้นด้วยfeature/, หรือbugfix/ hotfix/หลังจากนั้นรีโมตอัพoriginสตรีมจะถูกตัดทิ้ง (คุณอาจต้องป้อนรหัสผ่าน)

ทำงานบน Git 1.9.5


5

ขึ้นอยู่กับการรวมกันของคำตอบจำนวนมากที่นี่ - หากคุณต้องการให้สาขาทั้งหมดที่อยู่ในระยะไกล แต่ลบส่วนที่เหลือ oneliner ต่อไปนี้จะทำเคล็ดลับ:

git for-each-ref --format '%(refname:short)' refs/heads | grep -Ev `git ls-remote --quiet --heads origin | awk '{print substr($2, 12)}'| paste -sd "|" -` | xargs git branch -D

3

แม้ว่านี่จะไม่ใช่วิธีแก้ไขปัญหาบรรทัดคำสั่ง แต่ฉันก็แปลกใจที่Git GUIยังไม่ได้รับการแนะนำ

ฉันใช้บรรทัดคำสั่ง 99% ของเวลา แต่ในกรณีนี้มันอาจจะช้าไป (ดังนั้นคำถามเดิม) หรือคุณไม่รู้ว่าคุณกำลังจะลบอะไรเมื่อหันไปใช้ความยาว แต่การจัดการเชลล์ที่ฉลาด

UI แก้ปัญหานี้ได้เนื่องจากคุณสามารถตรวจสอบสาขาที่คุณต้องการลบได้อย่างรวดเร็วและเตือนให้นึกถึงสาขาที่คุณต้องการเก็บไว้โดยไม่ต้องพิมพ์คำสั่งสำหรับทุกสาขา

จาก UI ไปที่สาขา -> ลบและ Ctrl + คลิกสาขาที่คุณต้องการลบเพื่อให้มีการเน้น หากคุณต้องการให้แน่ใจว่าพวกเขาจะรวมเป็นสาขา (เช่นdev) ภายใต้การลบเท่านั้นถ้ากลืนเข้าไปตั้งสาขาในประเทศdevเพื่อ มิฉะนั้นให้ตั้งค่าเป็นเสมอเพื่อละเว้นการตรวจสอบนี้

GitUI: ลบสาขาท้องถิ่น


1

สำหรับ PowerShell สิ่งนี้จะได้ผล:

git branch --format '%(refname:lstrip=2)' --merged `
    | Where-Object { $_ -ne 'master' } `
    | ForEach-Object { git branch -d $_ }

0

สคริปต์ต่อไปนี้ลบสาขา ใช้งานและแก้ไขตามความเสี่ยงของคุณเอง ฯลฯ

จากคำตอบอื่น ๆ ในคำถามนี้ฉันสิ้นสุดการเขียนสคริปต์ทุบตีด่วนสำหรับตัวเอง ฉันเรียกมันว่า "gitbd" (git branch -D) แต่ถ้าคุณใช้คุณสามารถเปลี่ยนชื่อมันเป็นอะไรก็ได้ที่คุณต้องการ

gitbd() {
if [ $# -le 1 ]
  then
    local branches_to_delete=`git for-each-ref --format '%(refname:short)' refs/heads/ | grep "$1"`
    printf "Matching branches:\n\n$branches_to_delete\n\nDelete? [Y/n] "
    read -n 1 -r # Immediately continue after getting 1 keypress
    echo # Move to a new line
    if [[ ! $REPLY == 'N' && ! $REPLY == 'n' ]]
      then
        echo $branches_to_delete | xargs git branch -D
    fi
else
  echo "This command takes one arg (match pattern) or no args (match all)"
fi
}

มันจะเสนอให้ลบสาขาใด ๆ ที่ตรงกับอาร์กิวเมนต์รูปแบบหากผ่านหรือสาขาท้องถิ่นทั้งหมดเมื่อถูกเรียกโดยไม่มีอาร์กิวเมนต์ นอกจากนี้ยังจะให้ขั้นตอนการยืนยันเนื่องจากคุณรู้ว่าเรากำลังลบสิ่งต่าง ๆ ดังนั้นมันจึงเป็นเรื่องดี

มันช่างโง่เง่า - ถ้าไม่มีกิ่งที่ตรงกับรูปแบบมันก็ไม่รู้ตัว

ตัวอย่างเอาต์พุตที่รัน:

$ gitbd test
Matching branches:

dummy+test1
dummy+test2
dummy+test3

Delete? [Y/n] 

0

ฉันเขียนเชลล์สคริปต์เพื่อลบสาขาท้องถิ่นทั้งหมดยกเว้น develop

branches=$(git branch | tr -d " *")
output=""
for branch in $branches 
do
  if [[ $branch != "develop" ]]; then
    output="$output $branch"
  fi
done
git branch -d $output

0

คำตอบข้างต้นทำงานได้ดี นี่คือวิธีการอื่นเมื่อเรามีสาขาจำนวนมากใน repo ท้องถิ่นและเราต้องลบหลายสาขายกเว้นบางส่วนที่อยู่ในเครื่องท้องถิ่น

อันดับแรกgit branchจะแสดงรายการสาขาท้องถิ่นทั้งหมด

ในการแปลงคอลัมน์ชื่อสาขาเป็นแถวเดียวในไฟล์โดยเรียกใช้คำสั่ง unix
git branch > sample.txt
สิ่งนี้จะบันทึกไว้ในไฟล์sample.txt และเรียกใช้
awk 'BEGIN { ORS = " " } { print }' sample.txt
คำสั่งในเชลล์ สิ่งนี้จะแปลงคอลัมน์เป็นแถวและคัดลอกรายการชื่อสาขาในแถวเดียว


git branch -D branch_name(s)และเรียกใช้แล้ว
การดำเนินการนี้จะลบสาขาที่ปรากฏในท้องถิ่นทั้งหมด


0

วิธีปฏิบัติมากที่สุด: ตรวจสอบให้แน่ใจว่าคุณไม่ได้ทำงานที่ปราศจากข้อผูกมัดคอมmasterมิชชัน / พุชถ้า Needbe โคลนสำเนาใหม่ของที่เก็บและลบอันเก่า


0

เพื่อจุดประสงค์นี้คุณสามารถใช้git-extras

$ git delete-merged-branches
Deleted feature/themes (was c029ab3).
Deleted feature/live_preview (was a81b002).
Deleted feature/dashboard (was 923befa).

0

ฉันไม่มี grep หรือ unix อื่น ๆ ในกล่อง แต่สิ่งนี้ใช้ได้จากเทอร์มินัลของ VSCode:

git branch -d $(git branch).trim()

ฉันใช้ตัวพิมพ์เล็ก d ดังนั้นมันจะไม่ลบกิ่งที่ยังไม่จม

ฉันยังเป็นปรมาจารย์ด้วยเมื่อฉันทำเช่นนั้นจึง* masterไม่มีตัวตนดังนั้นจึงไม่ได้พยายามลบข้อมูลหลัก


ได้รับการยืนยัน: ถ้าไม่ได้อยู่ในคำสั่งนี้จะลบmaster master
Brett Rowberry

-1

ให้แน่ใจว่าคุณทำสิ่งนี้ก่อน

git fetch

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

 git branch -a | grep -v "master" | grep remotes | sed 's/remotes\/origin\///g' | xargs git push origin --delete
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.