গিটে একাধিক দূরবর্তী শাখা মুছুন


128

আমার একটি টিম সদস্য আছেন যা অজান্তেই তাঁর স্থানীয় শাখাগুলির মধ্যে দেড় শতাধিককে আমাদের কেন্দ্রীয় রেপোতে ঠেলে দেয়। ধন্যবাদ, তাদের সকলেরই উপসর্গ রয়েছে। এই উপসর্গটি ব্যবহার করে, আমি কি কোনও গিট কমান্ড বা শীতল ছোট শেল স্ক্রিপ্ট ব্যবহার করতে পারি যা একবারে সমস্তগুলি মুছে ফেলতে পারে?

উত্তর:


150

PREFIXদূরবর্তী সার্ভারে উপসর্গ সহ সমস্ত শাখা অপসারণ করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন ।

git branch -r | awk -F/ '/\/PREFIX/{print $2}' | xargs -I {} git push origin :{}

আপনি প্রথমে একটি শুকনো রান করতে চান এটি দেখতে যে শাখাগুলি আপনি মুছে ফেলতে চান এটি কিনা:

git branch -r | awk -F/ '/\/PREFIX/{print $2}'

2
আমি এটি পছন্দ করি কারণ এটি ওয়ান লাইনার এবং আমি প্রথমে একটি ড্রাই ড্রাই করতে পারি। দুর্ভাগ্যক্রমে, এটি এই বার্তার সাথে ত্রুটিযুক্ত: $ git branch -r | awk -F/ '/\/APR/{print $2}' | xargs -I {} git push origin :{} error: unable to push to unqualified destination: APR-04-DPH The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'GIT_URL'
জ্যাক এ স্মিথ

এর সাথে git branch -r | awk -F/ '/\/APR/{print $2}', আপনি কি সমস্ত এপিআর উপসর্গযুক্ত শাখার নাম তালিকাভুক্ত দেখতে পাচ্ছেন?
neevek

1
ঠিক আছে, কারণ APR-04-DPHশাখাটি ইতিমধ্যে মুছে ফেলা হয়েছিল। : এই প্রশ্নগুলির উত্তর দিয়েছেন কটাক্ষপাত এই এবং এই এবং এই । এই প্রশ্নগুলির উত্তরগুলি একই সমস্যার সমাধান করে, আপনি নিজেই সমাধানগুলি পরীক্ষা করতে চাইতে পারেন।
neevek

26
যদি আপনার / আপনার শাখার নাম থাকে (যদি আপনি গিট-ফ্লো বা অন্য কিছু ব্যবহার করছেন), তবে তার পরিবর্তে {$ 2 "/" $ 3 print মুদ্রণ করুন
আজমা

4
আমি উইন্ডোজটিতে এমএসজিগিট ব্যবহার করছি, এবং নিম্নলিখিত কমান্ডটি আমার জন্য কাজ করেছে (ফরোয়ার্ড git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
স্ল্যাশযুক্ত

96

আপনি যদি সহজ পদ্ধতির পছন্দ করেন তবে উদাহরণস্বরূপ 3 বা 4 টি শাখা মুছুন:

git push origin --delete <branch1> <branch2> <branch3>

গুরুত্বপূর্ণ: শুধুমাত্র গিট v1.7.0 এবং তারপরের উপর কাজ করে ।


6
আমি ব্যবহার করে শেষ করেছিgit branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
আরম কোচার্যান

36

দুর্দান্ত এবং মার্জিত সমাধানের জন্য নীভেককে ধন্যবাদ !

তবে awkক্ষেত্র বিভাজক /( -Fবিকল্প) এর কারণে শাখার নামগুলিতে (আমি গিট ফ্লো ব্যবহার করছি) স্ল্যাশ নিয়ে আমার কিছুটা সমস্যা রয়েছে

সুতরাং আমার সমাধান নীভেকের উপর ভিত্তি করে , তবে এর সাথে শাখার নামগুলি সঠিকভাবে পার্স করে /। এই ক্ষেত্রে আমি অনুমান করি যে আপনার দূরবর্তী কল করেছে origin। দুরত্বপূর্ণ নাম সহ প্রত্যন্ত শাখাগুলি মুছে ফেলার আদেশ PATTERN:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}' | xargs -I {} git push origin :{}

এবং আপনি কী মুছতে চলেছেন তা পরীক্ষা করতে ভুলবেন না:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}'

দরকারী টিপ: যদি আপনার শাখার নামগুলি ( origin/উপসর্গ ব্যতীত) কোনও পাঠ্য ফাইলে সঞ্চিত থাকে (প্রতি লাইনে একটি শাখার নাম), কেবল চালান:

cat your_file.txt | xargs -I {} git push origin :{}

2
xargs -a file -Lপরিবর্তে ব্যবহার করুন cat file | xargs। এমনকি সহজ xargs -a file git push --delete origin
musiKk

15

এটি একটি সদৃশ উত্তর হতে পারে তবে নীচে পরীক্ষিত এবং পুরোপুরি আমার জন্য কাজ করেছেন worked

  1. জোর করে স্থানীয় শাখা মুছুন

গিট শাখা -D শাখা-নাম

  1. রিমোট শাখা মুছুন

গিট পুশ অরিজিন - শাখার নাম মুছে ফেলুন

  1. 1 টিরও বেশি স্থানীয় শাখা মুছুন

গিট শাখা -D শাখা-নাম 1 শাখা-নাম 2

  1. 1 টিরও বেশি দূরবর্তী শাখা মুছুন

গিট পুশ উত্স - শাখা-নাম 1 শাখা-নাম 2

  1. উপসর্গ সহ স্থানীয় শাখা মুছুন। উদাহরণস্বরূপ, বৈশিষ্ট্য / *

গিট শাখা -D $ (গিট শাখা - তালিকা 'বৈশিষ্ট্য / *')

গিট শাখা -D ব্যাকটিক্স $ (গিট শাখা - তালিকা 'বৈশিষ্ট্য / *' ব্যাকটিক্স )

  1. উপসর্গ সহ দূরবর্তী শাখা তালিকাভুক্ত করুন।

গিট শাখা -r | গ্রেপ -ইও 'বৈশিষ্ট্য /.*'

  1. উপসর্গ সহ দূরবর্তী শাখা মুছুন

গিট শাখা -r | গ্রেপ -ইও 'বৈশিষ্ট্য /.*' | xargs -I {} গিট পুশ উত্স: {}


2
আমি মনে করি আপনি 5 ধাপে ব্যাকটিক্স থেকে পালাতে চেয়েছিলেন
জিপিএল

কীভাবে ব্যাকটিকস যুক্ত করবেন?
নরেন

1
@ নরেন: সমস্যা হ'ল মার্কডাউন ফর্ম্যাটিং আপনার ব্যাকটিক্সকে স্টাইলিং কমান্ডে রূপান্তরিত করে। আমি তাদের একটি আলাদা কমান্ড প্রতিস্থাপন পদ্ধতি দিয়ে প্রতিস্থাপন করেছি (যেমন "$ (কমান্ড)" `কমান্ডের সমতুল্য তবে মার্কডাউন দ্বারা কোনও অদ্ভুত কিছুতে অনুবাদ করা যায় না)) আপনি যা করতে পারতেন অন্য জিনিসটি '\' দিয়ে ব্যাকটিক্স থেকে বাঁচা is
স্টেলেডোগ

13

, Grep সঙ্গে একই: git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}

branch -rশো origin/prefix/branchname। সুতরাং এটি নিতে হবে prefix/branchname


আমি মনে করি আপনি বোঝাতে চেয়েছিলেন xargs -I {} git push origin :{}, না -i
jojo

1
@ জোজো, আফাইক, কারণ -iএটির জন্য ডিফল্ট প্রতিস্থাপন ব্যবহার করা হয়েছে {}তবে -Iআপনি নিজের একটি ঘোষণা করতে পারেন। ... ম্যানুয়ালটিতে সবেমাত্র পাওয়া গেছে:-i ... the same as -I{}
কির্বি

10

নীভেকের দ্রবণটি মার্জিত, তবে এটি আরও ভাল হতে পারে: প্রস্তাবিত কল হিসাবে 'গিট পুশ' প্রতি শাখায় একবার পরামর্শ দেওয়া হয়েছে, যার অর্থ শাখা প্রতি একটি অতিরিক্ত নেটওয়ার্ক রাউন্ড-ট্রিপ মোছা হবে। যেহেতু আপনি যেকোন উপায়ে ব্যবহার করছেন, কেন এটি ':' উপসর্গ করতে ব্যবহার করবেন না এবং তারপরে xargs ঠিক একবারে 'গিট পুশ' কল করতে পারে এবং সমস্ত শাখা একবারে মুছে ফেলতে পারে:

মুছে ফেলা হবে এমন শাখাগুলি তালিকা করতে ড্রাই-রান করুন:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}'

আসলে মুছে ফেলার চূড়ান্ত সমাধান:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}' | xargs git push origin

2
এটি এমন পরিস্থিতিতে পুরোপুরি কাজ করে যে আপনি যখন কম সংস্করণ বাশ পাবেন বা উইন্ডোজ সংস্করণ গিট ব্যাশ ব্যবহার করবেন তখন আপনি xargs এর জন্য "-I" বিকল্পটি ব্যবহার করতে পারবেন না।
zchholmes

আমি xargs: replstr may not be emptyনীভেকের সমাধান দিয়েছিলাম, সম্ভবত গিট সংস্করণ .. git version 1.9.5তবে এটি আমার পক্ষে দুর্দান্ত কাজ করেছে। আপনাদের উভয়েরই ধন্যবাদ
IamFace

8

উত্স https://coderwall.com/p/eis0ba

    1 - List all your remote branches:

    $ git branch -r

    2 - Filter the branches by some regular expression. In this case I'm interested in deleting any branch with the 'feature-' prefix:

    $ git branch -r | awk -F/ '/\/feature-/{print $2}'
    3 - Pipe the last command to git push to delete them:
    # **Edit** - Removed extra colon, which is not needed
    $ git branch -r | awk -F/ '/\/feature-/{print $2}' | xargs -I {} git push origin {}
    4 - Grab a beer.

    5 - Remove any local reference to those branches:

    $ git remote prune origin

ধন্যবাদ এটি আমার জন্য কাজ করেছে। মিউ ক্ষেত্রে আমি একাধিক স্থানীয় শাখা মুছতে সক্ষম করতে পারি। ধন্যবাদ!
প্রশান্ত কাবাদে

5

স্টিভ এবং নীভেককে ধন্যবাদ, আমি এমন একটি সমাধান পেয়েছি যা আমার জন্য বেশ ভালভাবে কাজ করেছে আমি ভাগ করে নেওয়ার মতো মূল্যবান বলে মনে করেছি:

স্টিভের সমাধানটি আমার জন্য একটি ছোটখাটো সামঞ্জস্য নিয়ে কাজ করেছিল। আমার রিমোটগুলির নাম দেওয়া হয়েছিল origin/feature/some-feature-nameতাই আমি আপনার ছাঁটাই করেছি awk:

git branch -r | awk -Forigin/ '/\/feature/ {print $2 $3}' | xargs -I {} git push origin :{}

এটি এখন একটি দুর্দান্ত সামান্য মুছে ফ্লো করছে:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
To github.com:project/project-name.git
- [deleted]         feature/search-placeholder
To github.com:project/project-name.git
- [deleted]         feature/server-error-message
To github.com:project/project-name.git
- [deleted]         feature/six-point-asterisk

ভাবছিলাম যে কারওরও আরও মার্জিত সমাধানের জন্য কিছু ধারণা রয়েছে কিনা, যদিও এর থেকে এই জাতীয় কিছু আউটপুট হতে পারে (আমার সিএলআই স্ক্রিপ্টিংটি বেশ খারাপ, সুতরাং এটি বের করতে আমার কিছুটা সময় লাগবে):

git push origin :feature/search-min-chars :feature/search-placeholder :feature/server-error-message :feature/six-point-asterisk

এটির জন্য একটি নেটওয়ার্ক অনুরোধ সহ একটি দুর্দান্ত একক আউটপুট হবে:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
- [deleted]         feature/search-placeholder
- [deleted]         feature/server-error-message
- [deleted]         feature/six-point-asterisk

4

ধন্যবাদ নীভেককে। এটি আমার উদ্দেশ্যে এটি পুনর্নির্মাণের পরে ভালভাবে কাজ করেছে:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2 "/" $3}' | xargs -I {} git push origin :{}

আমারও ফোল্ডারের কাঠামোটিকে অ্যাকাউন্টে নেওয়া দরকার ছিল। আমার বৈশিষ্ট্য-শাখাগুলি ফোল্ডার কাঠামোতে উত্স / বৈশিষ্ট্য / প্রাক-ফিচার-ফিচারের মতো রয়েছে। সুতরাং আমাকে আমার প্যাটার্নটি + 2 = ফোল্ডার + $ 3 = শাখার নাম থেকে তৈরি করতে হয়েছিল।


4

সবাই ব্যবহার করছে awk, কেন তা নিশ্চিত নয়। আমি মনে করি এটি আরও জটিল। আমার forkরিমোটের সমস্ত দূরবর্তী শাখা মুছতে আমি যা ব্যবহার করি তা এখানে :

$ git branch -r --list 'fork/*' | sed 's/fork\///' | xargs git push --delete fork

এর মধ্যে একটি নিক্ষেপ grepকরুন xargsএবং sedযদি আপনাকে তালিকাটি কেবল দূরবর্তী শাখাগুলির একটি উপসেটে ফিল্টার করতে হয় need


1
অনেক ধন্যবাদ. প্রকৃতপক্ষে এই একদম সমস্ত সমাধানের মধ্যে আমার জন্য কাজ করেছিল .. গ্রেপ রিমোট নামের পাশাপাশি পুরো শাখাটি ফিরিয়ে দিচ্ছিল origin/blaprefix_anotherbla। তবে ব্যবহার করে sedএটি ভালভাবে পরিচালনা করা হয়েছে। এই পদ্ধতির আরেকটি সুবিধা হ'ল আমি বিটবাকেট ব্যবহার করি এবং প্রতিটি শাখা মুছে ফেলার জন্য ম্যানুয়ালি প্রমাণীকরণের পাসওয়ার্ড দেওয়ার দরকার নেই। এটি একক ব্যাচে সমস্ত শাখা মুছে ফেলবে।
মধুর ভাইয়া

সমস্ত গ্রীনকিপার শাখা মুছে ফেলতেgit branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
abhisekp

4

আমি বুঝতে পারি এটি গিট কমান্ডের জন্য, তবে আপনি যদি অনুরূপ বা একই ফলাফলটি করার কোনও বিকল্প সমাধান খুঁজছেন:

আপনি এখান থেকে এটি করতে পারেন (গিট রিমোট ব্রাঞ্চগুলি সরান):

তারপরে আপনার যে শাখাগুলি চান তা নির্বাচন করুন:

আপনার কাছে দূরবর্তী শাখাগুলি সরানোর অনুমতি রয়েছে তা নিশ্চিত করুন।


এটি একটি শীর্ষ উত্তর হওয়া উচিত, এটি প্ল্যাটফর্মটি স্বাধীন।
কার্মিংটন

সফ্টওয়্যারটি কী এবং এটি লিনাক্সের জন্য উপলব্ধ?
abhisekp

1

গিথুবেরও শাখাগুলি দ্রুত মুছে ফেলার জন্য একটি দুর্দান্ত ইউআই এবং মেকানিজম রয়েছে, এটি যদি আপনি বরং একটি ইউআই ব্যবহার করেন


1
হ্যাঁ, এটি এখানে নথিভুক্ত করা হয়েছে তবে প্রতিটি স্বতন্ত্র শাখার জন্য আপনাকে অবশ্যই একবার ক্লিক করতে হবে। এখানে শীর্ষে ভোট দেওয়া সমাধানটি বহু শাখাগুলির করার সেরা উপায় যা আপনি মিলে যাওয়ার জন্য একটি রেজেেক্স লিখতে পারেন।
দ্য উইলিউম্যান

0

আমি সমস্ত উত্স / রিলিজ / আর 1-1 * দূরবর্তী শাখাগুলি মুছে ফেলার চেষ্টা করেছি, সুতরাং নিম্নলিখিত কমান্ড লাইনটি দুর্দান্তভাবে কাজ করেছে।

git branch -r | awk -Forigin/ '/\/*r1-1/ {print $2}' |  xargs -I {} git push origin :{}

0

আমি বিশ্রী ব্যবহার করতে পারিনি কারণ আমরা আমাদের শাখার নামের জন্য স্ল্যাশ কাঠামো ব্যবহার করছি।

git branch -r | grep "origin/users/YOURNAME" | sed -r 's/^.{9}//'| xargs -i  sh -c 'git push origin --delete {}'

এটি সমস্ত দূরবর্তী শাখা পায়, একটি একক ব্যবহারকারীর জন্য একটি মাত্র পান, "উত্স /" স্ট্রিংটি রিমোট করুন এবং তাদের প্রত্যেকটিতে একটি মুছুন কার্যকর করুন।


0

শুকনো রান:

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} echo {}

দূরবর্তী শাখাগুলি মুছুন:

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

শুধুমাত্র সম্পূর্ণরূপে মার্জ করা দূরবর্তী শাখাগুলি মুছুন:

git branch -r --merged --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

ব্যাখ্যা:

sed "s/origin\///"origin/শাখার নাম থেকে মুছে ফেলা হবে । দূরে না ফেলে আমি পেয়েছি:remote ref does not exist


0

পূর্ববর্তী উত্তরগুলি আমাকে 2018 থেকে সমস্ত রিলিজ শাখা অপসারণ করতে সহায়তা করেছে I আমি এটি আমার উইন্ডোজ 10 কমান্ড প্রম্পটে চালিয়েছি। আমি ক্লিঙ্ক ইনস্টল করেছি , তাই লিনাক্সের মতো আদেশও আমার পক্ষে কাজ করে।

শুকনো রান:

git branch -a | grep -o "release-.*2018" | xargs -I {} echo {}

শুকনো রান যদি এমন শাখা দেখায় যা দূরবর্তী / উত্স নয়। গিগ প্রুন কমান্ডের নীচে চালান এবং আবার পরীক্ষা করে দেখুন।

git remote prune origin

উপরের ফলাফলটিতে আপনি খুশি হয়ে গেলে মুছুন:

git branch -a | grep -o "release-.*2018" | xargs -I {} git push origin --delete {}

আপনি দেখুন: error: unable to delete 'release-...2018': remote ref does not exist। তারপরে পূর্বের প্রুন কমান্ডটি চালান এবং আবার চেষ্টা করুন।


-4

সতর্কতা: এটি সমস্ত দূরবর্তী শাখা মুছে ফেলবে। সতর্কতার সাথে ব্যবহার করুন.

আমি মনে করি দূরবর্তী শাখাগুলি মুছতে আমার উপায় সবচেয়ে ভাল way

git branch -r | grep -v master | sed 's/origin\//:/'| xargs git push

সতর্কতা: এটি সমস্ত দূরবর্তী শাখা মুছে ফেলবে। সতর্কতার সাথে ব্যবহার করুন.


4
একটি সুস্পষ্ট ট্রল হিসাবে ডাউনভোটেড। আমার অধিকার থাকলে মুছে ফেলত।
জ্যাক এ স্মিথ

আপনি ট্রোলিং কোথায় পেলেন?
Dmytro Gorpynenko

2
এটি সঠিক নয়, আপনি xargs জন্য কিছু গুরুত্বপূর্ণ যুক্তি অনুপস্থিত, এবং এটি প্রশ্নের উত্তর দেয় না।
রব

@ জ্যাকএ.স্মিথ জ্যাক, আমি অনুমান করেছি যে আপনি ভেবেছিলেন যে এই কোডটি রিমোট মাস্টারকে সরিয়ে ফেলবে - যা গ্রেপ-ভি মাস্টার হিসাবে মাস্টার বাদে সব কিছু সন্ধান করে না
ভাদিম সামোখিন

@ রব এখানে ভুল কি? চূড়ান্ত সম্পাদিত বিবৃতিটি গিট পুশের মতো স্মিথ হবে: কিছু_ ব্রাঞ্চ: অন্য_ ব্রাঞ্চ, যা একেবারে সঠিক।
ভাদিম সামোখিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.