পুরানো দূরবর্তী গিট শাখা পরিষ্কার করা


694

আমি দুটি পৃথক কম্পিউটার (এ এবং বি) থেকে কাজ করি এবং ড্রপবক্স ডিরেক্টরিতে একটি সাধারণ গিট দূরবর্তী সঞ্চয় করি।

ধরা যাক আমার দুটি শাখা আছে, মাস্টার এবং ডেভেল। উভয়ই তাদের দূরবর্তী অংশের উত্স / মাস্টার এবং উত্স / ডেভেল ট্র্যাক করছে।

এখন কম্পিউটার এ থাকাকালীন আমি স্থানীয় এবং দূরবর্তী অঞ্চলে শাখাটি ডেভেল মুছি।

git push origin :heads/devel
git branch -d devel

git branch -aকম্পিউটার এ চলমান , আমি নীচের শাখাগুলির তালিকা পেয়েছি।

  • মনিব
  • মূল / head
  • মূল / মাস্টার

git fetchকম্পিউটার বিতে চলমান , আমি এর সাহায্যে স্থানীয় ডেভেল শাখাটি git branch -d develসরিয়ে ফেলতে পারি, তবে আমি দূরবর্তী ডিভেল শাখাটি সরাতে পারি না।

git push origin :heads/devel নিম্নলিখিত ত্রুটি বার্তা প্রদান করে।

ত্রুটি: অযোগ্য গন্তব্যের দিকে ধাক্কা দিতে অক্ষম: হেডস / প্রক্সি 3 ডি
গন্তব্য রেফসপেকটি রিমোটের সাথে কোনও বিদ্যমান রেফের সাথে মেলে না এবং রেফ / দিয়ে শুরু হয় না, এবং উত্স রেফের উপর ভিত্তি করে আমরা উপসর্গটি অনুমান করতে অক্ষম।
মারাত্মক: দূরবর্তী প্রান্তটি অপ্রত্যাশিতভাবে স্তব্ধ হয়ে গিয়েছিল

git branch -a এখনও দূরবর্তী শাখাগুলিতে উত্স / ডেভেল তালিকাবদ্ধ করে।

কম্পিউটার বি থেকে দূরবর্তী শাখাগুলি কীভাবে পরিষ্কার করতে পারি?


4
যিনি চেষ্টা করেছিলেন তাকে আমি জানিয়েছি, ড্রপবক্স ফোল্ডারে থাকা গিট রিপোজিটরিগুলি কিছুটা নাজুক (তবে অতিরিক্ত বিশদ ছাড়াই)।
থরবজর্ন রাভন অ্যান্ডারসন

5
@ থরবজর্নআরভানএন্ডারসন সম্ভবত কারণ আপনি যখনই প্রতিশ্রুতিবদ্ধ এটি সম্পূর্ণ সিঙ্ক হয়ে যায় তা নিশ্চিত হওয়ার জন্য আপনাকে অপেক্ষা করতে হবে, আপনি নিশ্চিত হওয়া উচিত যে এটি অন্য মেশিনে ব্যবহার করা নিরাপদ (এবং তারপরেও অন্য একটি সিঙ্ক প্রয়োজন)।
আতাউলম

উত্তর:


1240

প্রথমত, এর ফলাফল কী git branch -a মেশিন বি ?

দ্বিতীয়ত, যদি আপনি ইতিমধ্যে মুছে দিয়েছেন heads/develউপরorigin , যাতে এর কেন আপনি তা মেশিন B. থেকে মুছে ফেলতে পারবেন না

চেষ্টা

git branch -r -d origin/devel

অথবা

git remote prune origin

অথবা

git fetch origin --prune

এবং --dry-runআপনার শেষে যোগ করতে নির্দ্বিধায়git বক্তব্যটির এটিকে চালিত না করে চালানোর ফলাফলটি দেখতে পারেন।

এর জন্য দস্তাবেজ git remote pruneএবং git branch


50
git remote prune originআমার জন্য কাজ করেছেন => * [pruned] origin/my-old-branch
হরি করম সিং

126
git remote prune origin --dry-runডাব্লু / ও আসলে মুছে ফেলা হবে তা আপনাকে দেখায়।
ওল্ফ্রাম আর্নল্ড

30
git fetch origin --pruneমুছে ফেলা শাখাগুলি অপসারণ করার জন্য নিখুঁত ছিল
সাবস্টিয়ান বারবিয়েরি

10
আপনার কাছে যদি কোনও স্থানীয় শাখা রয়েছে যেটি দূরবর্তী স্থানে চলেছে তার উপর নজর রাখে, এটি কিছুই মুছে ফেলবে না। তাদের জন্য, এটি git branch -vvঅনুসরণ করে প্রদর্শিত হয় git branch -D branchnameএবং শেষ পর্যন্ত ছাঁটাই সবচেয়ে ভাল উপায়।
রোমান স্টারকভ

7
নিম্নলিখিত অপশনটি সেট করে আপনি টান / আনতে স্বয়ংক্রিয়ভাবে git config remote.origin.prune true
ছাঁটাইটি

100

চালানোর জন্য বিবেচনা করুন:

git fetch --prune

মুছে ফেলা দূরবর্তী শাখা ট্র্যাক করে থাকা স্থানীয় শাখাগুলি সরানোর জন্য প্রতিটি রেপোতে নিয়মিতভাবে (দূরবর্তী জিআইটি রেপোতে আর বিদ্যমান নেই)।

এটি আরও সহজ দ্বারা সহজ করা যেতে পারে

git config remote.origin.prune true

এটি এমন একটি per-repoসেটিংস যা কোনও ভবিষ্যতকে git fetch or git pullস্বয়ংক্রিয়ভাবে ছাঁটাই করতে সক্ষম করে

আপনার ব্যবহারকারীর জন্য এটি সেট আপ করতে, আপনি বৈশ্বিক .gitconfig সম্পাদনা করতে এবং যুক্ত করতে পারেন

[fetch]
    prune = true

তবে এটি সুপারিশ করা হয় যে এটি নিম্নলিখিত কমান্ডটি ব্যবহার করে করা হয়েছে:

git config --global fetch.prune true

বা এটি সিস্টেম ব্যাপী প্রয়োগ করতে (কেবল ব্যবহারকারীর জন্য নয়)

git config --system fetch.prune true

14

এখানে বাশ স্ক্রিপ্ট যা এটি আপনার জন্য করতে পারে। এটি http://snippets.freerobi.com/post/491644841/remove- নিমজ্জিত- শাখা- ইন- git স্ক্রিপ্টের পরিবর্তিত সংস্করণ । আমার পরিবর্তন এটিকে বিভিন্ন দূরবর্তী অবস্থানগুলি সমর্থন করতে সক্ষম করে।

#!/bin/bash

current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$current_branch" != "master" ]; then
  echo "WARNING: You are on branch $current_branch, NOT master."
fi
echo -e "Fetching merged branches...\n"

git remote update --prune
remote_branches=$(git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$")
local_branches=$(git branch --merged | grep -v 'master$' | grep -v "$current_branch$")
if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
  echo "No existing branches have been merged into $current_branch."
else
  echo "This will remove the following branches:"
  if [ -n "$remote_branches" ]; then
echo "$remote_branches"
  fi
  if [ -n "$local_branches" ]; then
echo "$local_branches"
  fi
  read -p "Continue? (y/n): " -n 1 choice
  echo
  if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
    remotes=`echo "$remote_branches" | sed 's/\(.*\)\/\(.*\)/\1/g' | sort -u`
# Remove remote branches
for remote in $remotes
do
        branches=`echo "$remote_branches" | grep "$remote/" | sed 's/\(.*\)\/\(.*\)/:\2 /g' | tr -d '\n'`
        git push $remote $branches 
done

# Remove local branches
git branch -d `git branch --merged | grep -v 'master$' | grep -v "$current_branch$" | sed 's/origin\///g' | tr -d '\n'`
  else
echo "No branches removed."
  fi
fi

1
এটি "উত্স / বৈশিষ্ট্য / মাইব্র্যাঞ্চ" নামে একটি শাখার উপর ভেঙে গেছে, আমি কেন তা নিশ্চিত নই।
স্ট্যাভ্রোস করোকিঠাকিস

সমস্যা দুটি sedএস এ। এর sed 's/\(.*\)\/\(.*\)/\1/g'দ্বারা প্রতিস্থাপন করুনsed 's/\([^/]*\)\/\(.*\)/\1/g'
বেনোট ল্যাটিনিয়র

14

এই কমান্ডটি "শুকনো রান" originবাদে সমস্ত দূরবর্তী ( ) মার্জ করা শাখাগুলি মুছে ফেলবে master। আপনি এটি পরিবর্তন করতে পারেন, বা, মাস্টার পরে অতিরিক্ত শাখা যুক্ত করতে পারেন:grep -v for-example-your-branch-here |

git branch -r --merged | 
  grep origin | 
  grep -v '>' | 
  grep -v master | 
  xargs -L1 | 
  awk '{sub(/origin\//,"");print}'| 
  xargs git push origin --delete --dry-run

যদি এটি দেখতে ভাল লাগে তবে এটি অপসারণ করুন --dry-run। অতিরিক্তভাবে, আপনি প্রথমে এটি কাঁটাচামড়াতে পরীক্ষা করতে পছন্দ করতে পারেন।


খুশী হলাম। 1 ম Xargs + awk: git ব্রাঞ্চ -আর - নিমজ্জিত | এর পরিবর্তে পার্ল ব্যবহার করে আমার টুইটক গ্রেপ উত্স | grep -v '>' | grep -v মাস্টার | perl -lpe '($ জাঙ্ক, $ _) = বিভক্ত (/ \ //, $ _, 2)' | xargs গিট পুশ অরিজিন
অ্যান্ড্রু

6

আপনি যদি git branch -rআগ্রহী নন এবং আপনি কেবল স্থানীয় থেকে সেগুলি সরাতে চান এমন দূরবর্তী ট্র্যাকিং শাখাগুলি যদি দেখায় তবে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

git branch -r | grep -Ev 'HEAD|master|develop'  | xargs -r git branch -rd

একটি নিরাপদ সংস্করণ হ'ল কেবল একত্রীকরণগুলি মুছে ফেলা হবে:

git branch -r --merged | grep -Ev 'HEAD|master|develop'  | xargs -r git branch -rd

এটি বড় প্রকল্পগুলির জন্য কার্যকর হতে পারে, যেখানে আপনার অন্যান্য সতীর্থদের বৈশিষ্ট্যযুক্ত শাখার প্রয়োজন নেই তবে প্রাথমিক ক্লোনটির উপরে প্রচুর দূরবর্তী ট্র্যাকিং শাখা রয়েছে branches

তবে, এই পদক্ষেপটি একাই যথেষ্ট নয়, কারণ এই মোছা দূরবর্তী-ট্র্যাকিং শাখাগুলি পরবর্তী সময়ে ফিরে আসবে git fetch

এই দূরবর্তী ট্র্যাকিং শাখাগুলি আনা বন্ধ করতে আপনাকে .git / কনফিগারেশনে আনার জন্য রেফগুলি স্পষ্টভাবে উল্লেখ করতে হবে :

[remote "origin"]
  # fetch = +refs/heads/*:refs/remotes/origin/*    ### don't fetch everything
  fetch = +refs/heads/master:refs/remotes/origin/master
  fetch = +refs/heads/develop:refs/remotes/origin/develop
  fetch = +refs/heads/release/*:refs/remotes/origin/release/*

উপরের উদাহরণে আমরা কেবল আনব master, developএবং শাখাগুলি মুক্তি দিই , আপনার প্রয়োজন মতো খাপ খাইয়ে নিতে দ্বিধা বোধ করি।


1
ধন্যবাদ, প্রথম কমান্ডটি আমার পক্ষে কাজ করেছিল। আপনি কেবলমাত্র একটি শাখা আনতে git fetch origin branchnameবা একটি উপনাম তৈরি করতে পারেন ft = "!f() { git fetch origin $(git rev-parse --abbrev-ref HEAD);}; f"কেবলমাত্র বর্তমান শাখা (আমার ব্যক্তিগত প্রিয়) আনার মতো । চিয়ার্স।
জিওভানিমোরেনো 21 '17

হয়তো ওটি তবে -rপতাকাটির অর্থ কী? আমি দেখতে পাচ্ছি xargsএকটি -Rযুক্তি আছে কিন্তু কিছুই পাইনি -r। আমি বলতে চাইছি তাত্ত্বিকভাবে যদি আমি সঠিকভাবে মনে করি তবে কীভাবে xargsকাজ হয়, এমনকি এটি ছাড়াও -rকাজ করা উচিত।
অ্যাল্ডো 'xoen' গিয়ামেলুচা

আমি এই উত্তর পছন্দ। কয়েকটি নোট (প্রকৃত সত্যটি উল্লেখ করে)। শেষ পাইপ এবং শেষ কমান্ডটি সরিয়ে কোন শাখাগুলি মুছে ফেলা হবে তার "পূর্বরূপ" পাওয়া সম্ভব | xargs git branch -d। এছাড়াও, -rবিকল্পটি ( --remotes) থেকে সরিয়ে git branch -dআমরা কেবল স্থানীয় শাখাগুলি পরিষ্কার করি (এটি বিবেচনা করে যথেষ্ট হতে পারে যে ডিফল্টরূপে git branchদূরবর্তী শাখাগুলি যেভাবে দেখাবে না)।
অ্যালডো 'xoen' গিয়ামেলুকা

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

@aldo প্রায় xargs -r, যথা --no-run-if-empty, এটি একটি গনুহ এক্সটেনশন মানে, এখানে একটা চমৎকার ব্যাখ্যা
ryenus

4

মুছে ফেলা সর্বদা একটি চ্যালেঞ্জিং কাজ এবং বিপজ্জনক হতে পারে !!! অতএব, কি হবে তা দেখার জন্য প্রথমে নীচের কমান্ডটি কার্যকর করুন:

git push --all --prune --dry-run

উপরের মতো করে করে, git করে নীচের কমান্ডটি কার্যকর করা হলে কী ঘটবে তার একটি তালিকা আপনাকে সরবরাহ করবে।

তারপরে আপনার স্থানীয় রেপোতে নেই এমন দূরবর্তী রেপো থেকে সমস্ত শাখা সরানোর জন্য নিম্নলিখিত কমান্ডটি চালান:

git push --all --prune

10
এই কমান্ডটি বিপজ্জনক বলে মনে হচ্ছে ... এটি আমি যা চাইছিলাম তা মুছতে সক্ষম হয়েছিল (এবং উপরের উত্তরগুলির মধ্যে কমপক্ষে চারটি উত্তর দিয়ে না করতে পেরে)। তবে এটি আরও চারটি দেব-শাখা মুছে ফেলেছে। গিট একেবারে
চুষে

2
এই শাখাগুলি অবশ্যই আপনার স্থানীয় হয় না। তবে সব হারিয়ে যায় না। গিট কমিট, গিট রিফ্লগ এবং তারপরে গিট রিসেট --হর <চেকসাম>। আপনি এটির সাথে আক্ষরিক যে কোনও প্রতিশ্রুতি (ওরফে সেভ) এবং অন্যদের কাছে করতে পারেন। শাখা কেবল একটি লেবেল, লেবেলটি মোছা মুছে ফেলা সংরক্ষণ করে না ... এটি চিরকালের জন্য একটি চেকসাম থাকবে। আমি যদি সাহায্য করতে পারি তবে আমাকে জানান
টিমোথি এলজে স্টুয়ার্ট

3
অবশ্যই, আপনি এগুলি খুব দ্রুত পুনরুদ্ধার করতে চাইবেন কারণ গিটের আবর্জনা সংগ্রহকারী শাখাগুলির দ্বারা উল্লিখিত অঙ্গীকারগুলি সরিয়ে ফেলবে।
অ্যান্ড্রু

1
এটা তোলে ভালো যোগ করার জন্য -nএই কমান্ড (শুষ্ক রান) যাতে আপনি পরিবর্তনগুলি পূর্বরূপ দেখতে পারেন এবং তারপর যদি সবকিছু ঠিক কল এটা ছাড়া আবার -n
mati865

1
@ গুইউইনম্যানের সাথে সম্মত হোন - এটি খুব বিপজ্জনক, বিশেষত কমপক্ষে শুকনো রান চালানোর জন্য নির্দিষ্ট কলআউট ব্যতীত।
বিবেক এম চাওলা

2

সোর্সট্রি (v2.3.1) দিয়ে এটি কীভাবে করা যায় তা এখানে রয়েছে:
1. আনতে ক্লিক করুন
2 "ট্র্যাকিং শাখাগুলি ছাঁটাই করুন ..." পরীক্ষা করুন
OK
. ঠিক আছে 4 টিপুন 4.

এখানে চিত্র বর্ণনা লিখুন


1

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

যাইহোক, প্রথম ধাপটি আমি অন্যান্য উত্তরগুলি থেকে পেয়েছি:

git fetch --prune

একটি শুকনো রান git remote prune origin মনে হয়েছিল এটি আমার ক্ষেত্রে একই কাজ করবে, তাই আমি এটিকে সহজ রাখতে সংক্ষিপ্ততম সংস্করণ দিয়ে চলেছি।

এখন, একটি git branch -vএমন শাখাগুলি চিহ্নিত করতে হবে যার রিমোটগুলি মুছে ফেলা হয়েছে [gone]। অতএব, আমাকে যা করতে হবে তা হ'ল:

git branch -v|grep \\[gone\\]|awk '{print $1}'|xargs -I{} git branch -D {}

এতটা সহজ, এটি উপরের দৃশ্যের জন্য আমার যা কিছু চাই তা মুছে দেয়।

কম সাধারণ xargsবাক্য গঠন যাতে লিনাক্সের পাশাপাশি ম্যাক এবং বিএসডি তেও কাজ করে। সাবধান, এই আদেশটি কোনও শুকনো রান নয় তাই এটি চিহ্নিত হিসাবে চিহ্নিত সমস্ত শাখাটিকে জোর করে মুছে ফেলবে [gone]। স্পষ্টতই, এই গিটটি কিছুই চিরতরে চলে যায় না, আপনি যদি শাখাগুলি মুছে ফেলা দেখতে পান যে আপনি মনে রেখেছিলেন যে আপনি চেয়েছিলেন আপনি সর্বদা সেগুলি মুছে ফেলতে পারবেন (উপরের কমান্ডটি তাদের হ্যাশটিকে মুছে ফেলার জন্য তালিকাভুক্ত করবে, তাই সহজ) git checkout -b <branch> <hash>


0
# First use prune --dry-run to filter+delete the local branches
git remote prune origin --dry-run \
  | grep origin/ \
  | sed 's,.*origin/,,g' \
  | xargs git branch -D

# Second delete the remote refs without --dry-run
git remote prune origin

স্থানীয়- এবং দূরবর্তী-রেফগুলি থেকে একই শাখাগুলি ছাঁটাই করুন (থেকে আমার উদাহরণে origin)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.