ฉันต้องการลบสาขาทั้งหมดที่แสดงในผลลัพธ์ของ ...
$ git branch
... แต่รักษาสาขาปัจจุบันไว้ในขั้นตอนเดียว เป็นไปได้หรือไม่ ถ้าเป็นเช่นนั้นอย่างไร?
ฉันต้องการลบสาขาทั้งหมดที่แสดงในผลลัพธ์ของ ...
$ git branch
... แต่รักษาสาขาปัจจุบันไว้ในขั้นตอนเดียว เป็นไปได้หรือไม่ ถ้าเป็นเช่นนั้นอย่างไร?
คำตอบ:
จากคำตอบของ @pankijs ฉันสร้างชื่อแทน git สองชื่อ:
[alias]
# Delete all local branches but master and the current one, only if they are fully merged with master.
br-delete-useless = "!f(){\
git branch | grep -v "master" | grep -v ^* | xargs git branch -d;\
}; f"
# Delete all local branches but master and the current one.
br-delete-useless-force = "!f(){\
git branch | grep -v "master" | grep -v ^* | xargs git branch -D;\
}; f"
ที่จะเพิ่มใน ~/.gitconfig
และตามที่ @torek ชี้ให้เห็น:
โปรดทราบว่าตัวพิมพ์เล็ก
-d
จะไม่ลบสาขาที่ "ไม่รวมทั้งหมด" (ดูเอกสารประกอบ) การใช้-D
จะลบสาขาดังกล่าวแม้ว่าจะทำให้เกิดการ "สูญหาย" ก็ตาม ใช้สิ่งนี้ด้วยความระมัดระวังเนื่องจากจะลบ reflogs สาขาเช่นกันดังนั้นสิ่งที่ "กู้คืนจากการลบโดยไม่ตั้งใจ" ตามปกติจะไม่ทำงานเช่นกัน
โดยทั่วไปอย่าใช้-force
เวอร์ชันนี้หากคุณไม่แน่ใจว่า 300% จะไม่สูญเสียสิ่งที่สำคัญไป เพราะมันหายไปตลอดกาล .
git branch branchname commitid
$ git branch | grep -v "master" | xargs git branch -D
จะลบสาขาทั้งหมดยกเว้น master (แทนที่ master ด้วย branch ที่คุณต้องการเก็บไว้ แต่มันจะลบ master)
grep -v ^*
ใช้สาขา
master-copy
เช่น
grep -v "^ *master$"
grep -v "master\|my-other-branch"
หากคุณต้องการที่จะทำให้การใช้งานทั้งสองสาขา
ขั้นแรก (สลับไปยังสาขาที่คุณต้องการเก็บไว้> ex : master ):
git checkout master
วินาที ( ตรวจสอบให้แน่ใจว่าคุณอยู่ในระดับหลัก )
git branch -D $(git branch)
git branch -D $(git branch).Trim()
ไฟล์.
$(git branch)
เครื่องหมายคำพูดหรือไม่? ไม่ได้ผล: ไม่พบข้อผิดพลาด: branch '$ (git' not found. error: branch 'branch)'
git branch -d
(หรือ-D
) อนุญาตให้ใช้ชื่อสาขาได้หลายชื่อ แต่การจัดหา "สาขาในพื้นที่ทั้งหมดยกเว้นสาขาที่ฉันใช้อยู่ในขณะนี้" โดยไม่ต้องเขียนโค้ดอย่างน้อยก็เป็นเรื่องยุ่งยากเล็กน้อย
วิธีที่ "ดีที่สุด" (ถูกต้องอย่างเป็นทางการ) คือการใช้git for-each-ref
เพื่อรับชื่อสาขา:
git for-each-ref --format '%(refname:short)' refs/heads
แต่ก็ยิ่งยากที่จะเข้าใจว่าคุณอยู่ในสาขาใด ( git symbolic-ref HEAD
เป็นวิธีที่ "ถูกต้องอย่างเป็นทางการ" สำหรับสิ่งนี้หากคุณต้องการเขียนสคริปต์แฟนซี)
สะดวกยิ่งขึ้นคุณสามารถใช้git branch
ซึ่งพิมพ์ชื่อสาขาท้องถิ่นของคุณนำโดยสองช่องว่างหรือ (สำหรับสาขาในปัจจุบัน) *
ด้วยเครื่องหมายดอกจัน ดังนั้นเรียกใช้สิ่งนี้ผ่านบางสิ่งเพื่อลบ*
เวอร์ชันและคุณจะเหลือชื่อสาขาที่คั่นด้วยช่องว่างซึ่งคุณสามารถส่งผ่านไปยังgit branch -d
:
git branch -d $(git branch | grep -v '^*')
หรือ:
git branch | grep -v '^*' | xargs git branch -d
โปรดทราบว่าตัวพิมพ์เล็ก-d
จะไม่ลบสาขาที่ "ไม่รวมทั้งหมด" (ดูเอกสารประกอบ) การใช้-D
จะลบสาขาดังกล่าวแม้ว่าจะทำให้เกิดการ "สูญหาย" ก็ตาม ใช้สิ่งนี้ด้วยความระมัดระวังเนื่องจากจะลบ reflogs สาขาเช่นกันดังนั้นสิ่งที่ "กู้คืนจากการลบโดยไม่ตั้งใจ" ตามปกติจะไม่ทำงานเช่นกัน
git branch -D $(git branch | grep -v '^*')
ถ้าคุณต้องการลบสาขาเหล่านั้นที่รวมเข้าด้วยกัน
ในการลบสาขาที่ผสานทั้งหมด (ยกเว้นปัจจุบัน-v ‘*’
):
git branch --merged | grep -v '*' | xargs git branch -D
ฉันยังสร้างคำสั่งดังกล่าวสำหรับการล้าง repo ให้เสร็จสมบูรณ์
alias git-clean="git branch | grep -v '*' | grep -v 'master' | xargs git branch -D && git reset --hard && git clean -d -x -f"
ลบสาขาทั้งหมดยกเว้นสาขาเฉพาะ :
git branch | grep -v "branch name" | xargs git branch -D
ลบสาขาในพื้นที่ทั้งหมดยกเว้นการพัฒนาและการควบคุมหลัก
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
สำหรับ Windows ใน Powershell ให้ใช้:
git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
ฉันเคยสร้างโครงสร้างนี้สำหรับสภาพแวดล้อม Windows ของฉัน บางทีมันอาจจะช่วยคนอื่นได้ ในระหว่างการดำเนินการหลักและสาขาในปัจจุบันจะไม่ถูกลบ สาขาที่ผสานอื่น ๆ ทั้งหมดจะถูกลบโดยไม่คำนึงถึง
@echo off
cd PATH_TO_YOUR_REPO
REM -- Variable declerations
set "textFile=tempBranchInfo.txt"
set "branchToKeep=master"
set "branchToReplaceWith="
git branch --merged > %textFile%
REM -- remove "master" from list to keep the branch
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
set "line=%%i"
setlocal enabledelayedexpansion
>>"%textFile%" echo(!line:%branchToKeep%=%branchToReplaceWith%!
endlocal
)
REM -- execute branch delete commands
for /f "delims=" %%a in (%textFile%) do (
git branch -D %%a
)
REM -- remove temp-file with branch information inside
DEL %textFile%
REM -- show local branches after the cleaning
echo Local branches:
git branch
pause
exit
ในการลบสาขาทั้งหมดยกเว้นสาขาปัจจุบันในขั้นตอนเดียว:
git branch | grep -v $(git rev-parse --abbrev-ref HEAD) | xargs git branch -D
ลบสาขาที่รวมทั้งหมดในเครื่อง:
git branch -D `git branch --merged | grep -v \* | xargs`
ลบสาขาทั้งหมดยกเว้นสาขาเฉพาะ :
git branch | grep -v "branch name" | xargs git branch -D
ลบสาขาในพื้นที่ทั้งหมดยกเว้นการพัฒนาและการควบคุมหลัก
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
สมมติgit branch
แสดงสาขาปัจจุบันที่นำหน้าด้วย*
; ใช้ Powershell *
หนึ่งต่อไปนี้สายการบินจะลบทุกสาขาที่ไม่ได้เริ่มต้นด้วย
git branch | ? { $_ -lt "*" } | % { git branch -D $_.Trim() }
?
= ที่ไหน - วัตถุ
%
= Foreach-Object
ดังนั้นฉันจึงเห็นชื่อสาขาที่เข้ารหัสยากมากมายที่นี่ ... และฉันคิดว่าคำตอบของฉันที่นี่ถูกต้องกว่าสำหรับส่วน "สาขาปัจจุบัน" ของคำถามในขณะที่คงไว้ซึ่งบรรทัดเดียวและสามารถอ่านได้สำหรับมือใหม่อย่างฉัน เพียงเพื่อวางเครดิตเมื่อถึงกำหนดคำตอบก็ค่อนข้างชัดเจนเช่นกันตามคำตอบของ @ pankijs
git branch | grep -v $(git branch --show-current) | xargs git branch -d
และฉันใช้นามแฝงในหนึ่งบรรทัดใน. bash_aliases ของฉันในเดเบียนเช่นกัน
alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'
(แม้ว่าฉันคิดว่าต้องเปิดใช้งานคุณสมบัติทุบตีบางอย่างเพื่อให้คำสั่งย่อยทำงานบนบรรทัดคำสั่งบางบรรทัด)
ฉันใช้สิ่งนี้เพราะฉันเลือกได้มากขึ้นในสิ่งที่ฉันไม่ต้องการลบ คำสั่งด้านล่างนี้จะลบทุกสาขายกเว้นมาสเตอร์พัฒนาและสาขาปัจจุบัน
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
ฉันจึงใส่สิ่งนี้ในไฟล์ ~/.zshrc
delete_branches() {
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
}
alias cleanup_branches=delete_branches
IMHO วิธีที่ปลอดภัยที่สุดในการลบสาขาในพื้นที่คือ:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
นอกจากนี้ข้อมูลเพิ่มเติมที่เกี่ยวข้องกับหัวข้อนี้คุณสามารถค้นหาลบสาขาคอมไพล์ในเครื่องทั้งหมด
gone
เครื่องหมายคุณควรใช้-vv
(verbose สองครั้ง) ในขณะที่-a
จะไม่ช่วยคุณ (มันแสดงรายการสาขาระยะไกลด้วย)