স্থানীয় গিট শাখাগুলি দূরবর্তী রেপোতে মোছার পরে মুছুন


162

আমি শাখার ক্ষেত্রে সর্বদা সিঙ্কে আমার স্থানীয় এবং দূরবর্তী সংগ্রহস্থল রাখতে চাই।

গিটহাব-এ একটি পুল অনুরোধের পর্যালোচনা করার পরে, আমি আমার শাখাটি এখানে (রিমোট) মার্জ করে এবং সরিয়ে ফেলি। আমি কীভাবে এই তথ্যটি আমার স্থানীয় সংগ্রহস্থলে আনব এবং গিটকে আমার শাখার স্থানীয় সংস্করণটি সরিয়ে ফেলতে পারি?


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

কিছু নিয়ে আসতে নিম্নলিখিত কমান্ডগুলি ব্যবহার করার চেষ্টা করুন git ls-remoteএবং git show-ref

এছাড়াও, আপনি চেক আউট করতে চান git symbolic-refএবং git update-ref

আপনার সহায়তার জন্য ধন্যবাদ, আমি উত্তরটি অন্য কোথাও খুঁজে পেয়েছি। আমার প্রতিক্রিয়া দেখুন।
sf89

উত্তর:


180

দ্রুত উপায়

git branch --merged | grep -v "\*" | xargs -n 1 git branch -d

নোট: আপনি চালু না থাকলে master, এর শাখাটি মোছার সম্ভাবনা রয়েছে। "আরও ভাল উপায়" জন্য পড়া চালিয়ে যান।

আমরা মাস্টার রাখছি তা নিশ্চিত করুন

আপনি এটি নিশ্চিত করতে পারেন যে master, বা অন্য কোনও শাখা, grepআরও বেশি করে আইং দিয়ে সরানো হবে না । সেক্ষেত্রে আপনি যাবেন:

git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d

তাই আপনি যদি আমরা রাখতে চেয়েছিলেন master, developএবং stagingউদাহরণস্বরূপ, আমরা যেতে হবে:

git branch --merged | grep -v "\*" | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d

এটি একটি উপনাম করুন

যেহেতু এটি খানিকটা দীর্ঘ, আপনি নিজের .zshrcবা কোনও কোনও উপনাম যুক্ত করতে চাইতে পারেন .bashrc। খনি বলা হয় gbpurge(জন্য git branches purge):

alias gbpurge='git branch --merged | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d'

তারপরে আপনার .bashrcবা .zshrc:

. ~/.bashrc

অথবা

. ~/.zshrc

আপনি কমান্ডগুলি একটি উপাধিতে রেখে একটি একক কমান্ড তৈরি করতে পারেন। তবে যেহেতু branchএকটি চীনামাটির বাসন এবং নদীর গভীরতানির্ণা কমান্ড নয় , তাই গীটের ভবিষ্যতের সংস্করণগুলিতে যে কোনও ইউআই পরিবর্তন হতে পারে যা এটি ভেঙে যেতে পারে watch

1
পারফেক্ট! নোট করুন যে গিথুব ওয়ার্কফ্লো অনুসরণ করে স্থানীয় শাখাটি masterমুছে ফেলা হবে।
রুবেন্স মারিউজো

নাহ খুব নিশ্চিত যে এটি সেখানেই রয়েছে (আমি এটি প্রতিদিন ব্যবহার করছি এবং এটি এরকম মনে হয় না)।
sf89

4
এফওয়াইআই যদি আপনি একাধিক শাখা রাখতে চান তবে আপনি একটি সিঙ্গেল গ্রেপ ব্যবহার করতে পারেন: grep -Ev '(\*|master|important-branch)'
অ্যান্ড্রু বার্নস

4
যদি আপনি এটি ~/.gitconfigপরিবর্তে রাখতে চান তবে [alias]বিভাগটিতে নিম্নলিখিতটি যুক্ত করুন : gbpurge = !"git branch --merged | grep -Ev '\\*|master|develop|staging' | xargs -n 1 git branch -d"(গ্রেপ এক্সপ্রেশনটিতে () ব্যবহারের দরকার নেই)।
dskrvk

82

আমি গিটহাবের সাথে একই প্রবাহটি ব্যবহার করেছি, এবং পূর্ববর্তী উত্তরগুলি আমাকে সন্তুষ্টকারী হিসাবে খুঁজে পেল না, git branch --mergedযা শাখাগুলিকে একত্রিত করা হয়েছে তালিকা হিসাবে , তবে সেগুলির প্রত্যেকটিই আমার ক্ষেত্রে দূর থেকে সরানো হয়নি। সুতরাং, এটি আমার পক্ষে কাজ করেছে:

git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d

কোথায়:

  • git fetch --all -p: স্থানীয় শাখার স্থিতি আপডেট করুন
  • git branch -vv: স্থানীয় শাখার স্থিতি তালিকাবদ্ধ করুন
  • grep ": gone]": ফিল্টার মুছে ফেলা
  • awk '{ print $1 }': তাদের নাম তোলা
  • xargs -n 1 git branch -d: মুছে ফেলুন কমান্ডে নাম পাস করুন

দ্রষ্টব্য: আপনি যদি পছন্দ করেন তবে আপনি -d এর পরিবর্তে -D ব্যবহার করতে পারেন যা মুছতে বাধ্য করে।

উদাহরণ স্বরূপ:

someUsr@someHost:~/repo$ git branch -a
basic-testing
integration-for-tests
* master
origin
playground-for-tests
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

someUsr@someHost:~/repo$ git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
Fetching origin
Deleted branch integration-for-tests (was fbc609a).
Deleted branch playground-for-tests (was 584b900).

someUsr@someHost:~/repo$ git branch -a
basic-testing
* master
origin
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

রেফারেন্স:

http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches


3
আমি স্বাধীনতার বিষয়টি নিশ্চিত করেছিলাম যে আমি সর্বদা মাস্টারের বিরুদ্ধে এটি করব, অতএব: git checkout master; git pull origin master; git fetch --all -p; git branch -vv | grep gone | awk '{ print $1 }' | xargs -n 1 git branch -d দুর্দান্ত স্ক্রিপ্ট এবং ব্যাখ্যা, এর জন্য আপনাকে ধন্যবাদ :)
মিগুয়েলগ্রাজ

নোট যা branch -vvশাখা থেকে শেষ প্রতিশ্রুতি বার্তা দেখায়। আপনি যদি সেই বার্তায় "চলে" গেছেন grep goneতবে সেই শাখাটিও আঘাত হানে। সুতরাং, grep ": gone]"সম্ভবত ব্যবহার করা একটু নিরাপদ।
চকিনসুফ

1
এটিই প্রশ্নের আসল উত্তর। ধন্যবাদ.
আন্দ্রেয় গ্ল্যাডকিই

1
আরও ভাল:awk '$3 $4 ~ /:gone]$/ { print $1 }'
জাকুব বোচেনস্কি

3
এটির -Dপরিবর্তে প্রয়োজন ছাড়াও -dসঠিক উত্তর!
Cas

72

চেষ্টা করে দেখুন:

গিট টান --প্রিন

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

আপডেট করা হয়েছে:

উপরের বিবৃতিটি সঠিক নয়।

প্রকৃতপক্ষে, চলমান কেবল রিমোট ট্র্যাকিং শাখাগুলি যেমন সরিয়ে git pull --pruneফেলবে

রিমোটের / উৎপত্তি / fff
রিমোটের / উৎপত্তি, / dev
রিমোটের / উৎপত্তি / মাস্টার

তারপরে, আপনি git branch -rআপনার মেশিনে থাকা রিমোট-ট্র্যাকিং শাখাগুলি পরীক্ষা করতে দৌড়াতে পারেন । ধরুন বাম শাখাগুলি হ'ল:

মূল, / dev
মূল / মাস্টার

যার অর্থ শাখাটি origin/fffমোছা হয়েছে।

সুতরাং, দৌড়ানোর পরে git pull --prune, কেবল চালান:

git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)

আপনি সমস্ত স্থানীয় শাখা খুঁজে পেতে পারেন যা:

  1. আর কোনও আপত্তিজনক দূরবর্তী শাখা নেই;
  2. নিরাপদে অপসারণ করা যেতে পারে।

তারপরে, <the command above> | xargs git branch -dতাদের সমস্ত মুছতে পারেন।


42
এই উত্তরটি বেশ সঠিক নয়। --pruneপতাকাটি কেবল স্থানীয় শাখা নয়, দূরবর্তী ট্র্যাকিং শাখাগুলি মুছে ফেলবে।

3
এখানে @ ক্যাপকেকে সম্মত, আমি এখানে যা খুঁজছি তা এটি অর্জন করে না।
sf89

6
আপভোটে যাচ্ছি না, তবে স্থানীয় শাখাগুলি মুছে ফেলার পরে এবং গিটহাব থেকে মুছে ফেলার পরে আমার এটির প্রয়োজন ছিল তবে সেগুলি এখনও আমার গিট রিমোট-ভি কমান্ডের রিমোট হিসাবে বিদ্যমান।
স্পেশাল ২২ শে

8
আপনিও করতে পারেন git fetch --prune, এটি আমার পছন্দের উপায়
e_m0ney

1
স্ট্যাক ওভারফ্লো সম্পর্কে পরামর্শের পরে আরও একটি গিট ত্রুটি পাওয়া গেছে ... এর git pull --pruneফলে "আপনি রিমোট থেকে '-প্রিন' থেকে টানতে বলেছিলেন, তবে কোনও শাখা নির্দিষ্ট করেননি Because কারণ এটি আপনার বর্তমান শাখার জন্য ডিফল্ট কনফিগার করা রিমোট নয়, আপনি কমান্ড লাইনে অবশ্যই একটি শাখা নির্দিষ্ট করতে হবে ""
jww

23

এটি গ্রহণযোগ্য সমাধান সহ মাস্টার এবং বিকাশ শাখাগুলি মোছা এড়ানোর জন্য কাজ করা উচিত :

git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d

16

পাওয়ারশেল ব্যবহার করা লোকেদের জন্য, এটি উপরের উত্তরের সমতুল্য :

git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
  1. যে সমস্ত শাখা গেছে হিসাবে চিহ্নিত হয়েছে সেগুলি ফিল্টার করুন
  2. git branch -Dপাওয়া প্রতিটি শাখা কল

6

এর কিছুই আমার পক্ষে কাজ করছিল না। আপনি আমার অন্যান্য উত্তরটি এখানে দেখতে পাবেন: https://stackoverflow.com/a/34969726/550454

তবে মূলত, আমার এখন এটি আমার ~/.gitconfig:

[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d

5

খুব সহজ সমাধান: আপনার স্থানীয় রেপো সরান এবং রিমোটটি নতুনভাবে ক্লোন করুন। খুব মার্জিত বলে মনে হচ্ছে না, তবে এটি সহজ এবং আপনি ম্যান পৃষ্ঠাগুলি না পড়ে কী করছেন ঠিক তা বুঝতে পারবেন :-)।


1
এত ডাউনভোটস কেন? আমার অর্থ স্পষ্টত দক্ষ নয়, বিশেষত বৃহত্তর রেপোসের সাথে, তবে এটি ওপি যা বলেছিল তা করে। এটি না করার জন্য আরও কিছু কারণ আছে?
3ocene

6
কারণ আপনি আপনার সমস্ত স্থানীয় শাখাগুলি, স্ট্যাশগুলি, চাপ ছাড়ানো প্রতিশ্রুতিগুলি হারাবেন ... এটি ডিনামাইট দিয়ে মাছ ধরার মতো।
সেভেনসিট

1
আপনি যখন যে ল্যাপটপটিতে কাজ করছেন কোনওরকমভাবে দুর্নীতিগ্রস্থ, হারিয়ে যাওয়া বা চুরি হয়ে যাওয়ার পরে একই ঘটনা ঘটে, তাই আমি স্থানীয়ভাবে গুরুত্বপূর্ণ কিছু না রাখার ঝোঁক রাখি। আমার কাছে কেবল একটি শাখা তৈরি করা এবং এটি ছোট ধরণের বৈশিষ্ট্যগুলির জন্য চাপ দেওয়া এবং এটি আর কার্যকর না হওয়ার পরে মুছে ফেলা ভাল বলে মনে হয়।

1

আমি সমস্ত স্থানীয় শাখাগুলির তালিকার জন্য এই ওয়ান-লাইনটি লিখেছি যার সংশ্লিষ্ট দূরবর্তী শাখা নেই:

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -

এটি সম্পন্ন হওয়ার পরে, এই স্থানীয় শাখাগুলি মুছে ফেলা সহজ xargs:

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -|xargs -r git branch -d

masterএটি আমাকেও তালিকাভুক্ত করছে, এটি প্রত্যাশার মতো কাজ করে না; সাবধানতা অবলম্বন করুন
এনরিকো

1

আমি একীভূত স্থানীয় শাখাগুলি সরাতে এটিই করি:

git branch -d $(git branch --merged)

এবং আপনি যদি অযোগ্য ট্র্যাকিংগুলিও সরাতে চান:

git pull --prune

1

আপনি কেবলমাত্র আপনার শাখাটিকে মাস্টার হিসাবে মিশ্রিত করেছেন এবং একীভূত করেছেন এমন ইভেন্টে, তারপরে গিট ব্যাশে নিম্নলিখিতটি করুন:

git branch -d branch_name_to_delete

আপনি যদি বর্তমানে সেই শাখায় থাকেন তবে এটি আপনাকে মাস্টারে ফিরিয়ে দেবে। এই মুহুর্তে সাথে একটি টানুন

git pull

-2

ভোট দেওয়া উত্তরটিতে মাস্টার মুছার সম্ভাবনা রয়েছে। নীচের ব্যবহারিক উদাহরণ বিবেচনা করুন।

আমার দুটি বৈশিষ্ট্যযুক্ত শাখা ছিল hemen_README এবং hemen_BASEBOX যা বিকাশে একীভূত হয়েছিল এবং তারপরে বিকাশকে মাস্টার হিসাবে একীভূত করা হয়েছিল। Hemen_README এবং heman_BASEBOX বৈশিষ্ট্যযুক্ত শাখাগুলি দূরবর্তীভাবে মুছে ফেলা হয়েছে তবে স্থানীয়ভাবে এখনও প্রদর্শিত হচ্ছে। এছাড়াও আমি স্থানীয়ভাবে মাস্টারে নেই, তবে বিকাশে আছি।

এই ক্ষেত্রে

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                      671ad6c Merged in hemen_README (pull request #1)
        hemen_BASEBOX                a535c0f added global exec paths to puppet manifest
        hemen_README                 ba87489 Updated Readme with considerable details
        master                       8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop       671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/hemen_BASEBOX a535c0f added global exec paths to puppet manifest
        remotes/origin/hemen_README  ba87489 Updated Readme with considerable details
        remotes/origin/master        2f093ce Merged in develop (pull request #3)

সুতরাং আমি উপরের আংশিক কমান্ড চালানো হলে

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch --merged | grep -v "\*"
        hemen_BASEBOX
        hemen_README
        master

লক্ষ্য করুন যে এটি মাস্টারকেও দেখায় যা শেষ পর্যন্ত মুছে ফেলা হবে।

যে কোনও ক্ষেত্রে আমি এটি করতে সক্ষম হয়েছি। আমি কীভাবে এটি অর্জন করেছি সে সম্পর্কে আমি আপনার সাথে আমার সেশন লগটি ভাগ করছি।

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin --dry-run
    Pruning origin
    URL: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git
     * [would prune] origin/hemen_BASEBOX
     * [would prune] origin/hemen_README
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin 
    Pruning origin
    URL: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git
     * [pruned] origin/hemen_BASEBOX
     * [pruned] origin/hemen_README

আমি কেবল পরীক্ষা করেছি যে কেটে কেটে নেওয়া হবে এবং তারপরে এটি ছাঁটাই করা হবে। নীচে শাখা কমান্ডের দিকে তাকিয়ে আমরা রিমোটগুলির যত্ন নিয়েছি

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                671ad6c Merged in hemen_README (pull request #1)
        hemen_BASEBOX          a535c0f added global exec paths to puppet manifest
        hemen_README           ba87489 Updated Readme with considerable details
        master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/master  2f093ce Merged in develop (pull request #3)

এখন এগিয়ে যান এবং স্থানীয় শাখা মুছুন

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_BASEBOX 
    Deleted branch hemen_BASEBOX (was a535c0f).
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_README
    Deleted branch hemen_README (was ba87489).

শাখাগুলি এখন পছন্দসই হিসাবে রয়েছে।

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                671ad6c Merged in hemen_README (pull request #1)
        master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/master  2f093ce Merged in develop (pull request #3)

অবশ্যই এটিতে মাস্টার মুছে ফেলার সম্ভাবনা রয়েছে। প্রশ্নটি মনোযোগ সহকারে পড়ুন। আমি যেমন বলেছি, আমার স্থানীয় জিনিসগুলিকে পরিষ্কার করার জন্য আমার একটি উপায় প্রয়োজন needed তার মানে রিমোটে থাকা সমস্ত শাখা মুছে ফেলা। মাস্টার যদি আর না থাকে তবে এটি আপনার স্থানীয় মেশিনেও অদৃশ্য হয়ে যাবে।
sf89
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.