git রিমোট রিপোজিটরিতে নেই এমন স্থানীয় জিট ট্যাগগুলি সরান




git-tag (10)

স্থানীয় এবং দূরবর্তী ট্যাগগুলির মধ্যে পার্থক্য দেখান:

diff <(git tag | sort) <( git ls-remote --tags origin | cut -f2 | grep -v '\^' | sed 's#refs/tags/##' | sort)
  • git tag স্থানীয় ট্যাগ তালিকা দেয়
  • git ls-remote --tags সম্পূর্ণ পাথের তালিকা দেয়
  • cut -f2 | grep -v '\^' | sed 's#refs/tags/##' cut -f2 | grep -v '\^' | sed 's#refs/tags/##' দূরবর্তী ট্যাগ পাথগুলির তালিকা থেকে কেবলমাত্র ট্যাগ নামটি বের করে দেয়
  • অবশেষে আমরা দুটি তালিকা প্রতিটি সাজান এবং তাদের diff

"<" দিয়ে শুরু হওয়া লাইনগুলি আপনার স্থানীয় ট্যাগগুলি যা দূরবর্তী রেপোতে আর নেই। যদি তারা কয়েকটি হয়, তবে আপনি যদি একাধিক হন তবে আপনি নিজে নিজে একটিকে একত্রিত করতে পারেন, আপনি আরো স্বয়ংক্রিয়ভাবে এটি করতে স্বয়ংক্রিয়ভাবে grep-ing এবং পাইপিং করেন।

আমরা আমাদের স্থাপনার প্রক্রিয়া অংশ হিসাবে গিট ট্যাগ ব্যবহার। সময়ে সময়ে, আমরা আমাদের দূরবর্তী সংগ্রহস্থল থেকে তাদের অপসারণ করে এই ট্যাগগুলি পরিষ্কার করতে চাই।

এই বেশ সহজ. এক ব্যবহারকারী স্থানীয় ট্যাগ এবং কমান্ডগুলির একটি সেটের মধ্যে রিমোট ট্যাগ মুছে ফেলে। আমরা একটি ছোট শেল স্ক্রিপ্ট আছে যা উভয় পদক্ষেপকে একত্রিত করে।

দ্বিতীয় (তৃতীয়, চতুর্থ, ...) ব্যবহারকারীর এখন স্থানীয় ট্যাগ রয়েছে যা আর দূরবর্তীতে প্রতিফলিত হয় না।

আমি git remote prune origin অনুরূপ একটি কমান্ড খুঁজছি যা স্থানীয়ভাবে ট্র্যাকিং শাখাগুলিকে মুছে ফেলবে যার জন্য রিমোট শাখা মোছা হয়েছে।

অন্যথায়, রিমোট ট্যাগগুলি তালিকাবদ্ধ করার জন্য একটি সহজ কমান্ডটি git tag -l মাধ্যমে ফেরত আসা স্থানীয় ট্যাগগুলির সাথে তুলনা করার জন্য ব্যবহার করা যেতে পারে।


Answer #1

গিট v1.7.8 থেকে v1.8.5.6 থেকে, আপনি এটি ব্যবহার করতে পারেন:

git fetch <remote> --prune --tags

হালনাগাদ

এটি e66ef7ae6f31f2 commit করার কারণে গিটের নতুন সংস্করণে (v1.9.0 দিয়ে শুরু) কাজ করে না। যদিও এটি কিছু লোকের জন্য কাজ করেছে তবে আমি এটি মুছে ফেলতে চাই না।

"চাদ জুলিয়ানো" দ্বারা প্রস্তাবিত, v1.7.8 থেকে সমস্ত গিট সংস্করণ সহ, আপনি নিম্নোক্ত কমান্ডটি ব্যবহার করতে পারেন:

git fetch --prune <remote> +refs/tags/*:refs/tags/*

ওয়াইল্ডকার্ড সম্প্রসারণ এড়াতে আপনাকে ট্যাগগুলির অংশটি উদ্ধৃতি সহ (উইন্ডোজ উদাহরণস্বরূপ) সংযুক্ত করতে হবে:

git fetch --prune <remote> "+refs/tags/*:refs/tags/*"

Answer #2

V1.7.8 থেকে গিটের সমস্ত সংস্করণগুলি রেফসপেকের সাথে git fetch ফ্যাক্স বোঝে, যখন v1.9.0 - --tags বিকল্পটি --tags বিকল্পকে ওভাররাইড করে। সাধারণ উদ্দেশ্যে সমাধান করার জন্য এটি চেষ্টা করুন:

$ git --version
git version 2.1.3

$ git fetch --prune origin "+refs/tags/*:refs/tags/*"
From ssh://xxx
 x [deleted]         (none)     -> rel_test

Git v1.9.0 এ "--prune" আচরণের "- ট্যাগস" কীভাবে পরিবর্তিত হয়েছে তা আরও পড়ার জন্য, দেখুন: e66ef7ae6f31f2


Answer #3

ভাল প্রশ্ন. :) আমি একটি সম্পূর্ণ উত্তর নেই ...

যে বলেন, আপনি git ls-remote মাধ্যমে দূরবর্তী ট্যাগ একটি তালিকা পেতে পারেন। origin দ্বারা origin ট্যাগগুলি তালিকাভুক্ত করতে, আপনি চালাতে চান:

git ls-remote --tags origin

এটি হ্যাশ এবং বন্ধুত্বপূর্ণ ট্যাগ নামগুলির একটি তালিকা প্রদান করে, যেমন:

94bf6de8315d9a7b22385e86e1f5add9183bcb3c        refs/tags/v0.1.3
cc047da6604bdd9a0e5ecbba3375ba6f09eed09d        refs/tags/v0.1.4
...
2f2e45bedf67dedb8d1dc0d02612345ee5c893f2        refs/tags/v0.5.4

আপনি স্থানীয়ভাবে ট্যাগগুলির সাথে এই তালিকার দ্বারা তৈরি ট্যাগগুলি তুলনা করার জন্য অবশ্যই অবশ্যই একটি ব্যাশ স্ক্রিপ্ট যুক্ত করতে পারেন। git show-ref --tags , যা git ls-remote হিসাবে একই ফর্মের ট্যাগ নামগুলি জেনারেট করে)।

একপাশে, git show-ref একটি বিকল্প রয়েছে যা আপনি চান যা বিপরীত। নিম্নোক্ত কমান্ড দূরবর্তী শাখায় থাকা সমস্ত ট্যাগ তালিকাবদ্ধ করবে যা আপনার স্থানীয়ভাবে নেই:

git ls-remote --tags origin | git show-ref --tags --exclude-existing

Answer #4

Git নেটিভ স্থানীয় ট্যাগের পরিচ্ছন্নতা সমর্থন করে:

git fetch --tags --prune

এই কমান্ডটি সর্বশেষ ট্যাগগুলিতে টানবে এবং সমস্ত মুছে ফেলা ট্যাগ মুছে ফেলবে।


Answer #5

GitHub এ pivotal_git_scripts জেম ফর্ক মাত্র একটি গিট সিঙ্ক স্থানীয়-ট্যাগ কমান্ড যোগ:

https://github.com/kigster/git_scripts

মোম ইনস্টল করুন, তারপরে রিমোটরিতে বিদ্যমান স্থানীয় ট্যাগ মুছে ফেলতে আপনার রিপোজিটোরিটিতে "গিট সিঙ্ক-স্থানীয়-ট্যাগগুলি" চালান।

বিকল্পভাবে আপনি নীচের এই স্ক্রিপ্টটি ইনস্টল করতে এবং এটি "git-sync-local-tags" কল করতে পারেন:

#!/usr/bin/env ruby

# Delete tags from the local Git repository, which are not found on 
# a remote origin
#
# Usage: git sync-local-tags [-n]
#        if -n is passed, just print the tag to be deleted, but do not 
#        actually delete it.
#
# Author: Konstantin Gredeskoul (http://tektastic.com)
#
#######################################################################

class TagSynchronizer
  def self.local_tags
    `git show-ref --tags | awk '{print $2}'`.split(/\n/)
  end

  def self.remote_tags
    `git ls-remote --tags origin | awk '{print $2}'`.split(/\n/)
  end

  def self.orphaned_tags
    self.local_tags - self.remote_tags
  end

  def self.remove_unused_tags(print_only = false)
    self.orphaned_tags.each do |ref|
      tag = ref.gsub /refs\/tags\//, ''
      puts "deleting local tag #{tag}"
      `git tag -d #{tag}` unless print_only
    end
  end
end

unless File.exists?(".git")
  puts "This doesn't look like a git repository."
  exit 1
end

print_only = ARGV.include?("-n")
TagSynchronizer.remove_unused_tags(print_only)

Answer #6

এই মহান প্রশ্ন, আমি একই জিনিস বিস্মিত হতে চাই।

আমি একটি স্ক্রিপ্ট লিখতে চাই না তাই একটি ভিন্ন সমাধান চাওয়া। কীটি স্থানীয়ভাবে ট্যাগটি মুছে ফেলতে পারে তা আবিষ্কার করছে, তারপরে রিমোট সার্ভার থেকে Git fetch ব্যবহার করে "এটি ফিরিয়ে আনুন"। যদি ট্যাগ দূরবর্তী স্থানে উপস্থিত না থাকে তবে এটি মুছে ফেলা হবে।

সুতরাং আপনি যাতে দুটি লাইন টাইপ করতে হবে:

git tag -l | xargs git tag -d
git fetch --tags

এইগুলো:

  1. স্থানীয় repo থেকে সব ট্যাগ মুছুন। FWIW, xargs "tag -l" এর জন্য কমান্ড লাইনে "tag -l" দ্বারা প্রতিটি ট্যাগ আউটপুট রাখে। এই ছাড়া, git কিছু মুছে ফেলবে না কারণ এটি stdin (silly git) পড়ে না।

  2. দূরবর্তী repo থেকে সব সক্রিয় ট্যাগ আনুন।

এটি এমনকি উইন্ডোজ একটি চিকিত্সা কাজ করে।


Answer #7

Git এর সাম্প্রতিক সংস্করণগুলির মত মনে হচ্ছে (আমি গিট v2.20 এ) কেবল সহজেই বলার জন্য

git fetch --prune --prune-tags

অনেক ক্লিনার!

https://git-scm.com/docs/git-fetch#_pruning

আপনি যখন fetching ট্যাগগুলিকে সর্বদা ছাপানোর জন্য জিটি কনফিগার করতে পারেন:

git config fetch.pruneTags true

আপনি যদি একটি নির্দিষ্ট দূরবর্তী থেকে remote.<remote>.pruneTags যখন ট্যাগ remote.<remote>.pruneTags করতে চান, আপনি remote.<remote>.pruneTags ব্যবহার করতে পারেন remote.<remote>.pruneTags বিকল্প। উদাহরণস্বরূপ, উত্স থেকে fetching যখন ট্যাগ সবসময় ছিনান কিন্তু অন্য remotes না,

git config remote.origin.pruneTags true

Answer #8

কিভাবে এই সম্পর্কে - সব স্থানীয় ট্যাগ ড্রপ এবং তারপর পুনরায় ফিচার? আপনার repo বিবেচনা submodules থাকতে পারে:

git submodule foreach --recursive  'git tag | xargs git tag -d'
(alternatively, "for i in `find .git  -type d -name '*tags*'`; do rm -f $i/*;  done")
git fetch -t
git submodule foreach --recursive git fetch -t

Answer #9

TortoiseGit এখন ট্যাগ তুলনা করতে পারেন।

বাম লগ দূরবর্তী, ডান স্থানীয় হয়।

সিঙ্ক ডায়ালগের তুলনা ট্যাগ বৈশিষ্ট্য ব্যবহার করে:

এছাড়াও TortoiseGit সমস্যা দেখুন 2973





git-tag