Jeg har mange Git-grener. Hvordan sletter jeg grener som allerede er slått sammen? Finnes det en enkel måte å slette dem alle på i stedet for å slette dem én etter én?
OPPDATERING:
Du kan legge til andre grener for å ekskludere som master og dev hvis arbeidsflyten din har disse som en mulig forfader. Vanligvis forgrener jeg meg fra en " sprint-start " tag og master, dev og qa er ikke forfedre.
Først lister du opp alle grener som ble slått sammen i fjernkontrollen.
git branch --merged
Du kan se noen grener du ikke vil fjerne. vi kan legge til noen argumenter for å hoppe over viktige grener som vi ikke vil slette, for eksempel master eller a develop. Følgende kommando vil hoppe over master-grenen og alt som har dev i seg.
git branch --merged| egrep -v "(^\*|master|dev)"
Hvis du vil hoppe over, kan du legge det til egrep-kommandoen som følgende. Grenen skip_grennavn
vil ikke bli slettet.
git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"
For å slette alle lokale grener som allerede er slått sammen med den aktuelle grenen:
git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
Du kan se at master og dev er ekskludert i tilfelle de er en forfader.
Du kan slette en sammenslått lokal gren med:
git branch -d branchname
Hvis den ikke er slått sammen, bruker du:
git branch -D branchname
For å slette den fra fjernkontrollen i gamle versjoner av Git bruk:
git push origin :branchname
I nyere versjoner av Git bruk:
git push --delete origin branchname
Når du har slettet grenen fra fjernkontrollen, kan du beskjære for å bli kvitt eksterne sporingsgrener med:
git remote prune origin
eller beskjære individuelle fjernsporingsgrener, som det andre svaret antyder, med:
git branch -dr branchname
Håper dette hjelper.
Jeg bruker følgende Ruby-skript for å slette mine allerede sammenslåtte lokale og eksterne grener. Hvis jeg gjør det for et depot med flere fjernkontroller og bare vil slette fra en, legger jeg bare til en select-setning i fjernkontrollisten for bare å få de fjernkontrollene jeg vil ha.
#!/usr/bin/env ruby
current_branch = `git symbolic-ref --short HEAD`.chomp
if current_branch != "master"
if $?.exitstatus == 0
puts "WARNING: You are on branch #{current_branch}, NOT master."
else
puts "WARNING: You are not on a branch"
end
puts
end
puts "Fetching merged branches..."
remote_branches= `git branch -r --merged`.
split("\n").
map(&:strip).
reject {|b| b =~ /\/(#{current_branch}|master)/}
local_branches= `git branch --merged`.
gsub(/^\* /, '').
split("\n").
map(&:strip).
reject {|b| b =~ /(#{current_branch}|master)/}
if remote_branches.empty? && local_branches.empty?
puts "No existing branches have been merged into #{current_branch}."
else
puts "This will remove the following branches:"
puts remote_branches.join("\n")
puts local_branches.join("\n")
puts "Proceed?"
if gets =~ /^y/i
remote_branches.each do |b|
remote, branch = b.split(/\//)
`git push #{remote} :#{branch}`
end
# Remove local branches
`git branch -d #{local_branches.join(' ')}`
else
puts "No branches removed."
end
end
Det er ingen kommando i Git som vil gjøre dette for deg automatisk. Men du kan skrive et skript som bruker Git-kommandoer for å gi deg det du trenger. Dette kan gjøres på mange måter, avhengig av hvilken forgreningsmodell du bruker.
Hvis du trenger å vite om en gren har blitt slått sammen til master, vil følgende kommando ikke gi noen utdata hvis myTopicBranch har blitt slått sammen (dvs. at du kan slette det)
$ git rev-list master | grep $(git rev-parse myTopicBranch)
Du kan bruke Git branch-kommandoen og analysere alle grener i Bash og gjøre en for
-løkke over alle grenene. I denne løkken sjekker du med kommandoen ovenfor om du kan slette grenen eller ikke.