Я хочу видалити всі гілки, які перераховані у вихідних даних ...
$ 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
видалить такі гілки , навіть якщо це призведе до того, що коміти втратяться; використовуйте це з великою обережністю , оскільки це також видаляє перезаписування гілок, так що звичайні речі "відновлення від випадкового видалення" теж не працюють.
По суті, ніколи не використовуйте -force
версію, якщо ви не впевнені на 300%, що не втратите нічого важливого. Бо це втрачено назавжди .
git branch branchname commitid
$ git branch | grep -v "master" | xargs git branch -D
видалить всі гілки, крім master (замініть master на гілку, яку ви хочете зберегти, але потім видалить 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 -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
видалить такі гілки, навіть якщо це призведе до того, що коміти втратяться; використовуйте це з великою обережністю, оскільки це також видаляє перезаписування гілок, так що звичайні речі "відновлення від випадкового видалення" теж не працюють.
git branch -D $(git branch | grep -v '^*')
, якщо ви хочете видалити ті гілки, які об’єдналися.
Щоб видалити всі об’єднані гілки (крім поточної -v ‘*’
):
git branch --merged | grep -v '*' | xargs git branch -D
також я зробив таку команду для повного очищення репо:
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 $_ }
Видалити всі об’єднані гілки локально:
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
Одного разу я створив цю конструкцію для мого середовища 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
Тож я бачу тут безліч твердо закодованих назв гілок ... І я думаю, що моя відповідь тут є більш точною до "поточної гілки" частини запитання, зберігаючи її в одному рядку та читабельною для новачків, таких як я. Просто щоб розмістити кредит там, де це потрібно, відповідь досить очевидно також базується на відповіді @ pankijs.
git branch | grep -v $(git branch --show-current) | xargs git branch -d
і у мене це псевдонім на одному рядку в моїх .bash_aliases також у debian.
alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'
(Хоча я думаю, що деякі функції bash повинні бути активовані, щоб допоміжна команда працювала в деяких командних рядках)
Я використовую це, тому що стаю більш вибірковим у тому, що не хочу видаляти. Ця команда нижче видаляє кожну гілку, окрім майстра, розробки та поточної гілки.
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
ІМХО, найбезпечнішим способом видалення місцевих гілок є:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
Крім того, більше інформації, пов’язаної з цією темою, ви можете знайти Видалити всі локальні гітки git
gone
маркера, який ви повинні використати -vv
(детально двічі), в той час як вам -a
не допоможе (він також містить перелік віддалених гілок)