Έχω πολλά κλαδιά Git. Πώς μπορώ να διαγράψω κλάδους που έχουν ήδη συγχωνευτεί; Υπάρχει εύκολος τρόπος να τα διαγράψω όλα αντί να τα διαγράφω ένα προς ένα;
ΕΝΗΜΕΡΩΣΗ:
Μπορείτε να προσθέσετε άλλους κλάδους για να αποκλείσετε, όπως το master και το dev, αν η ροή εργασίας σας έχει αυτούς ως πιθανό πρόγονο. Συνήθως διακλαδώνομαι από μια ετικέτα "sprint-start" και οι master, dev και qa δεν είναι πρόγονοι.
Αρχικά, απαριθμήστε όλους τους κλάδους που συγχωνεύτηκαν σε απομακρυσμένο.
git branch --merged
Μπορεί να δείτε μερικούς κλάδους που δεν θέλετε να διαγράψετε. μπορούμε να προσθέσουμε μερικά επιχειρήματα για να παραλείψουμε σημαντικούς κλάδους που δεν θέλουμε να διαγράψουμε, όπως το master ή ένα develop. Η παρακάτω εντολή θα παραλείψει τον κλάδο master και οτιδήποτε έχει dev σε αυτόν.
git branch --merged| egrep -v "(^\*|master|dev)"
Αν θέλετε να παραλείψετε, μπορείτε να το προσθέσετε στην εντολή egrep όπως παρακάτω. Ο κλάδος skip_branch_name
δεν θα διαγραφεί.
git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"
Για να διαγράψετε όλους τους τοπικούς κλάδους που έχουν ήδη συγχωνευτεί στον τρέχοντα ελεγχόμενο κλάδο:
git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
Μπορείτε να δείτε ότι τα master και dev εξαιρούνται σε περίπτωση που είναι πρόγονος.
Μπορείτε να διαγράψετε έναν συγχωνευμένο τοπικό κλάδο με:
git branch -d branchname
Αν δεν έχει συγχωνευτεί, χρησιμοποιήστε:
git branch -D branchname
Για να το διαγράψετε από το απομακρυσμένο σε παλιές εκδόσεις του Git χρησιμοποιήστε:
git push origin :branchname
Σε πιο πρόσφατες εκδόσεις του Git χρησιμοποιήστε:
git push --delete origin branchname
Μόλις διαγράψετε τον κλάδο από το απομακρυσμένο, μπορείτε να κλαδέψετε για να απαλλαγείτε από τους κλάδους απομακρυσμένης παρακολούθησης με:
git remote prune origin
ή να κλαδέψετε μεμονωμένους κλάδους απομακρυσμένης παρακολούθησης, όπως προτείνει η άλλη απάντηση, με:
git branch -dr branchname
Ελπίζω αυτό να σας βοηθήσει.
Χρησιμοποιώ το ακόλουθο σενάριο Ruby για να διαγράψω τους ήδη συγχωνευμένους τοπικούς και απομακρυσμένους κλάδους μου. Αν το κάνω για ένα αποθετήριο με πολλά απομακρυσμένα και θέλω να διαγράψω μόνο από ένα, απλά προσθέτω μια δήλωση select στη λίστα απομακρυσμένων για να πάρω μόνο τα απομακρυσμένα που θέλω.
#!/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
Δεν υπάρχει καμία εντολή στο Git που να το κάνει αυτό αυτόματα για εσάς. Αλλά μπορείτε να γράψετε ένα σενάριο που χρησιμοποιεί εντολές του Git για να σας δώσει αυτό που χρειάζεστε. Αυτό θα μπορούσε να γίνει με πολλούς τρόπους ανάλογα με το μοντέλο διακλάδωσης που χρησιμοποιείτε.
Αν θέλετε να ξέρετε αν ένας κλάδος έχει συγχωνευτεί στο master, η ακόλουθη εντολή δεν θα δώσει κανένα αποτέλεσμα αν το myTopicBranch έχει συγχωνευτεί (δηλαδή μπορείτε να το διαγράψετε)
$ git rev-list master | grep $(git rev-parse myTopicBranch)
Θα μπορούσατε να χρησιμοποιήσετε την εντολή branch του Git και να αναλύσετε όλα τα branches στο Bash και να κάνετε έναν βρόχο for
σε όλα τα branches. Σε αυτόν τον βρόχο ελέγχετε με την παραπάνω εντολή αν μπορείτε να διαγράψετε το branch ή όχι.