Tôi muốn xóa tất cả các nhánh được liệt kê trong kết quả đầu ra của ...
$ git branch
... nhưng vẫn giữ chi nhánh hiện tại, trong một bước . Điều đó có thể không? Nếu vậy, làm thế nào?
Tôi muốn xóa tất cả các nhánh được liệt kê trong kết quả đầu ra của ...
$ git branch
... nhưng vẫn giữ chi nhánh hiện tại, trong một bước . Điều đó có thể không? Nếu vậy, làm thế nào?
Câu trả lời:
Dựa trên câu trả lời của @pankijs, tôi đã tạo hai bí danh 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"
Để được thêm vào ~/.gitconfig
Và, như @torek đã chỉ ra:
Lưu ý rằng chữ thường
-d
sẽ không xóa một nhánh "không được hợp nhất hoàn toàn" (xem tài liệu). Việc sử dụng-D
sẽ xóa các nhánh như vậy , ngay cả khi điều này làm cho các cam kết bị "mất"; sử dụng điều này một cách cẩn thận , vì thao tác này cũng xóa các nhật ký nhánh, do đó, nội dung thông thường "khôi phục sau khi xóa ngẫu nhiên" cũng không hoạt động.
Về cơ bản, đừng bao giờ sử dụng -force
phiên bản nếu bạn không chắc chắn 300% rằng bạn sẽ không mất bất cứ thứ gì quan trọng. Vì nó đã mất vĩnh viễn .
git branch branchname commitid
$ git branch | grep -v "master" | xargs git branch -D
sẽ xóa tất cả các nhánh ngoại trừ cái chính (thay thế cái chính bằng nhánh bạn muốn giữ lại, nhưng sau đó nó sẽ xóa cái chính)
grep -v ^*
.
master-copy
ví dụ: nó sẽ không xóa một nhánh được gọi
grep -v "^ *master$"
grep -v "master\|my-other-branch"
.
đầu tiên (chuyển sang nhánh bạn muốn giữ> ví dụ : master ):
git checkout master
thứ hai (đảm bảo rằng bạn đang làm chủ )
git branch -D $(git branch)
git branch -D $(git branch).Trim()
.
git branch -d
(hoặc -D
) cho phép nhiều tên chi nhánh, nhưng hơi khó khăn khi tự động cung cấp "tất cả các chi nhánh cục bộ trừ chi nhánh hiện tại tôi đang ở" mà không cần viết ít nhất một chút mã.
Phương pháp "tốt nhất" (chính xác) là sử dụng git for-each-ref
để lấy tên nhánh:
git for-each-ref --format '%(refname:short)' refs/heads
nhưng sau đó thậm chí còn khó hơn để biết bạn đang ở nhánh nào ( git symbolic-ref HEAD
là phương pháp "chính thức" cho việc này, nếu bạn muốn viết một kịch bản ưa thích).
Thuận tiện hơn, bạn có thể sử dụng git branch
, in tên chi nhánh cục bộ của bạn trước hai dấu cách hoặc (đối với chi nhánh hiện tại) bằng dấu hoa thị *
. Vì vậy, hãy chạy điều này qua một cái gì đó để xóa *
phiên bản và bạn chỉ còn lại tên nhánh được phân tách bằng dấu cách, sau đó bạn có thể chuyển đến git branch -d
:
git branch -d $(git branch | grep -v '^*')
hoặc là:
git branch | grep -v '^*' | xargs git branch -d
Lưu ý rằng chữ thường -d
sẽ không xóa một nhánh "không được hợp nhất hoàn toàn" (xem tài liệu). Việc sử dụng -D
sẽ xóa các nhánh như vậy, ngay cả khi điều này làm cho các cam kết bị "mất"; sử dụng điều này một cách cẩn thận, vì thao tác này cũng xóa các nhật ký nhánh, do đó, nội dung thông thường "khôi phục sau khi xóa ngẫu nhiên" cũng không hoạt động.
git branch -D $(git branch | grep -v '^*')
, nếu bạn muốn xóa những nhánh đã hợp nhất.
Để xóa tất cả các nhánh đã hợp nhất (ngoại trừ hiện tại -v ‘*’
):
git branch --merged | grep -v '*' | xargs git branch -D
Ngoài ra, tôi đã thực hiện lệnh như vậy để dọn dẹp hoàn toàn repo:
alias git-clean="git branch | grep -v '*' | grep -v 'master' | xargs git branch -D && git reset --hard && git clean -d -x -f"
lấy từ đây .
Xóa tất cả các nhánh ngoại trừ một nhánh cụ thể :
git branch | grep -v "branch name" | xargs git branch -D
Xóa tất cả các nhánh cục bộ ngoại trừ phát triển và làm chủ
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Đối với Windows, sử dụng Powershell:
git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
Xóa cục bộ tất cả chi nhánh đã hợp nhất:
git branch -D `git branch --merged | grep -v \* | xargs`
Xóa tất cả các nhánh ngoại trừ một nhánh cụ thể :
git branch | grep -v "branch name" | xargs git branch -D
Xóa tất cả các nhánh cục bộ ngoại trừ phát triển và làm chủ
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Tôi đã từng tạo cấu trúc này cho môi trường Windows của mình. Có thể nó sẽ giúp ích cho người khác. Trong quá trình thực thi, nhánh chính và nhánh hiện tại không bị xóa . Tất cả các chi nhánh đã hợp nhất khác sẽ bị xóa bất kể.
@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
Vì vậy, tôi thấy rất nhiều tên nhánh được mã hóa cứng ở đây ... Và tôi nghĩ câu trả lời của tôi ở đây chính xác hơn cho phần "nhánh hiện tại" của câu hỏi trong khi vẫn giữ nó một dòng và dễ đọc đối với những người mới như tôi. Chỉ cần đặt tín dụng đến hạn, câu trả lời rõ ràng là cũng dựa trên câu trả lời của @ pankijs.
git branch | grep -v $(git branch --show-current) | xargs git branch -d
và tôi có bí danh nó trên một dòng trong .bash_aliases của tôi trong debian cũng vậy.
alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'
(Mặc dù tôi nghĩ rằng một số tính năng bash cần được kích hoạt để lệnh phụ chạy trên một số dòng lệnh)
Tôi sử dụng điều này vì tôi có thể lựa chọn nhiều hơn trong những gì tôi không muốn xóa. Lệnh dưới đây loại bỏ mọi nhánh ngoại trừ nhánh chính, phát triển và nhánh hiện tại.
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
Vì vậy, tôi đặt cái này vào ~/.zshrc
delete_branches() {
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
}
alias cleanup_branches=delete_branches
IMHO, cách an toàn nhất để loại bỏ các nhánh cục bộ là:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
Ngoài ra, bạn có thể tìm thấy thêm thông tin liên quan đến chủ đề này Xóa tất cả các nhánh git cục bộ
gone
điểm đánh dấu bạn nên sử dụng -vv
(verbose hai lần), trong khi -a
sẽ không giúp bạn (nó cũng liệt kê các chi nhánh từ xa)