গিট ট্যাগটি পুনরুদ্ধার করার পরে "ট্যাগ ইতিমধ্যে দূরবর্তীটিতে বিদ্যমান" ত্রুটি


142

নীচের পদক্ষেপগুলি চালানোর পরে আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

To git@provider.com:username/repo-name.git
 ! [rejected]        dev -> dev (already exists)
error: failed to push some refs to 'git@provider.com:username/repo-name.git'
hint: Updates were rejected because the tag already exists in the remote.
  1. সংগ্রহস্থল তৈরি করেছেন
  2. লোকাল মেশিনে রেপো ক্লোন করেছেন।
  3. README ফাইলটি পরিবর্তন করেছে, পরিবর্তনগুলি সম্পাদন করেছে এবং প্রতিশ্রুতিবদ্ধতার দিকে ঠেলে দিয়েছে।
  4. ট্যাগ তৈরি করা হয়েছে dev:git tag dev
  5. পুশ করা ট্যাগ: git push --tags
  6. README ফাইলটি পরিবর্তন করেছে, পরিবর্তনগুলি সম্পাদন করেছে এবং প্রতিশ্রুতিবদ্ধতার দিকে ঠেলে দিয়েছে।
  7. মুছে ফেলা ট্যাগ dev, আবার এটি তৈরি এবং ট্যাগ পুশ:

    git tag -d dev
    git tag dev
    git push --tags
    

এটি কেন ঘটছে?

আমি ম্যাক এ আছি আমার বন্ধুরা যে লিনাক্স (উবুন্টু) ব্যবহার করে তাদের এই সমস্যা নেই। আমি জানি যে আমি git push --tags -fট্যাগ আপডেটটি জোর করার জন্য ব্যবহার করতে পারি তবে এটি বিপজ্জনক (উদাহরণস্বরূপ, শুধুমাত্র ট্যাগে ভুল দ্বারা করা প্রতিশ্রুতি পুনরায় লিখন, শাখায় নয়)।


1
কমিটগুলি "ট্যাগগুলিতে" বা "শাখাগুলিতে" করা হয় না (যদিও এটি নিশ্চিতভাবে মনে হয় যে এটি পরে আছে)। বস্তুত, ট্যাগ এবং শাখা নাম কেবল নির্দেশ (এক, একক) কমিট। নীচে উত্তর দেখুন।
torek

8
এই আমার জন্য কাজ git pull --tagsতারপরgit push origin --tags
sawe

উত্তর:


175

সম্পাদনা করুন, 24 নভেম্বর 2016: এই উত্তরটি দৃশ্যত জনপ্রিয়, তাই আমি এখানে একটি নোট যুক্ত করছি। আপনি যদি কোনও সেন্ট্রাল সার্ভারে কোনও ট্যাগ প্রতিস্থাপন করেন , যার কাছে পুরাতন ট্যাগ রয়েছে central সেই কেন্দ্রীয়-সার্ভারের সংগ্রহস্থলের যে কোনও ক্লোন ইতিমধ্যে ট্যাগ রয়েছে its তার পুরানো ট্যাগটি ধরে রাখতে পারে । সুতরাং এটি আপনাকে কীভাবে করতে হবে তা বলার সময়, আপনি এটি করতে চান তা নিশ্চিত হন। আপনার ইতিমধ্যে "ভুল" ট্যাগ থাকা প্রত্যেককেই তাদের "ভুল ট্যাগ" মুছতে এবং নতুন "রাইট ট্যাগ" দিয়ে প্রতিস্থাপন করতে হবে।

গিট ২.১০ / ২.১১-এ পরীক্ষা করে দেখা যায় যে পুরানো ট্যাগ ধরে রাখা ক্লায়েন্টদের চলার জন্য ডিফল্ট আচরণ git fetch, এবং আপডেট হওয়া ক্লায়েন্টদের জন্য ডিফল্ট আচরণ git fetch --tags

(মূল উত্তর অনুসরণ করে।)


আপনি যখন ট্যাগ পুশ git push --tagsকরতে বলেন, ফর্মের একটি আপডেটের অনুরোধকে রিমোটে প্রেরণ করে (প্রয়োজনীয় যেকোন কমিট এবং অন্যান্য প্রয়োজনীয় জিনিস এবং পুশ সেটিংস থেকে অন্য কোনও রেফ আপডেট) সহ প্রেরণ করে । (ভাল, এটি প্রেরণে অনেকগুলি রয়েছে: প্রতিটি ট্যাগের মধ্যে একটি onenew-sha1 refs/tags/name

আপডেট অনুরোধটি একটি old-sha1(বা আবার, প্রতিটি ট্যাগের জন্য একটি ) যুক্ত করার জন্য রিমোট দ্বারা সংশোধন করা হয়েছে , তারপরে প্রাক-প্রাপ্ত এবং / অথবা আপডেট হুকগুলিতে সরবরাহ করা হবে (রিমোটে যে কোনও হুক বিদ্যমান রয়েছে)। ট্যাগগুলি তৈরি / মোছা / আপডেট করার অনুমতি দেয় বা প্রত্যাখ্যান করবে কিনা সেগুলি এই হুকগুলি সিদ্ধান্ত নিতে পারে।

old-sha1মান সব শূন্য "নাল" রয়েছে SHA-1 টি ট্যাগ তৈরি করা হচ্ছে যদি হয়। new-sha1নাল রয়েছে SHA-1 যদি ট্যাগটি মোছা হচ্ছে হয়। অন্যথায় SHA-1 মান দুটিই আসল, বৈধ মান।

এমনকি কোনও হুক না থাকলেও এখানে "বিল্ট-ইন হুক" রয়েছে যা চালানো হয়: আপনি "ফোর্স" পতাকা ব্যবহার না করে রিমোট কোনও ট্যাগ সরিয়ে নিতে অস্বীকার করবে (যদিও "বিল্ট-ইন হুক" উভয়ের সাথে সর্বদা ঠিক থাকে না "যুক্ত" এবং "মুছুন")। আপনি যে প্রত্যাখ্যান বার্তাটি দেখছেন তা এই অন্তর্নির্মিত হুক থেকে আসছে। (প্রসঙ্গক্রমে, এই একই বিল্ট-ইন হুক শাখা আপডেটগুলিও প্রত্যাখ্যান করে যা দ্রুত অগ্রসর হয় না)) 1

তবে what's কী চলছে তা বোঝার জন্য এখানে একটি কী — git pushপদক্ষেপটির কোনও ধারণাই নেই যে রিমোটের সেই ট্যাগটি এখন রয়েছে কিনা, এবং যদি তাই হয় তবে তার কী কী SHA-1 মান রয়েছে। এটি কেবল "SHA-1 মান সহ আপনার ট্যাগগুলির সম্পূর্ণ তালিকা এখানে আছে" বলে। রিমোট মানগুলির সাথে তুলনা করে এবং যদি সংযোজন এবং / অথবা পরিবর্তনগুলি থাকে তবে সেগুলিতে হুক চালায়। (যে ট্যাগগুলি একই রকম, এটি কিছুই করে না tag ট্যাগগুলির জন্য যা আপনার কাছে নেই সেগুলিও কিছুই করে না!)

আপনি যদি স্থানীয়ভাবে ট্যাগটি মুছে ফেলেন তবে pushআপনার ধাক্কা কেবল ট্যাগটি স্থানান্তর করে না। রিমোট ধরে নেয় কোনও পরিবর্তন করা উচিত নয়।

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

সুতরাং, আপনার কাছে দুটি বিকল্প রয়েছে:

  • একটি জোর-ধাক্কা, বা
  • রিমোটের ট্যাগ মুছুন।

আধুনিক হয় মাধ্যমে সম্ভাব্য git push2 যদিও ট্যাগ স্থানীয়ভাবে মোছা এবং pushing কোনো প্রভাব নেই। রিমোটটির নামটি ধরে নেওয়া originএবং আপনি যে ট্যাগটি মুছতে চান তা হ'ল dev:

git push origin :refs/tags/dev

এটি দূরবর্তীটিকে ট্যাগটি মুছতে বলে। devআপনার স্থানীয় সংগ্রহস্থলে ট্যাগ উপস্থিতি বা অনুপস্থিতি অপ্রাসঙ্গিক; রেফস্পেক pushসহ এই ধরণের হ'ল খাঁটি-মুছুন push:remoteref

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

বল-ধাক্কা সহজ। আপনি যদি ট্যাগ ব্যতীত অন্য কিছু আপডেট না করার বিষয়ে নিশ্চিত হতে চান git pushতবে কেবলমাত্র সেই একটি রেসপেককে পুশ করতে বলুন:

git push --force origin refs/tags/dev:refs/tags/dev

(দ্রষ্টব্য: আপনি --tagsযদি কেবল একটি ট্যাগ রেফ-স্পিকে স্পষ্টভাবে চাপ দিচ্ছেন তবে আপনার প্রয়োজন নেই )।


1 অবশ্যই, এই অন্তর্নির্মিত হুকের কারণটি হ'ল একই দূরবর্তী-রেপোর অন্যান্য ব্যবহারকারীরা যে আচরণটি প্রত্যাশা করছেন তা কার্যকর করতে সহায়তা করে: যে শাখাগুলি পুনরায় হয় না এবং ট্যাগগুলি সরানো হয় না। যদি আপনি জোর করে ধাক্কা দেন, আপনি অন্য ব্যবহারকারীদের জানিয়ে দিন যে আপনি এটি করছেন তা যাতে তারা এটির জন্য সংশোধন করতে পারে। নোট করুন যে "ট্যাগগুলি মোটেও সরবে না" নতুনভাবে গিট 1.8.2 দ্বারা প্রয়োগ করা হয়েছে; পূর্ববর্তী সংস্করণগুলি কমিট গ্রাফটিতে ট্যাগটিকে "এগিয়ে যাওয়ার" অনুমতি দেয়, অনেকটা শাখার নামের মতো। দেখুন Git 1.8.2 রিলিজ নোট

2 আপনি যদি রিমোটটিতে লগইন করতে পারেন তবে এটি তুচ্ছ। কেবল সেখানে গিট সংগ্রহস্থলে যান এবং চালান git tag -d dev। মনে রাখবেন যে কোনও উপায়ে the রিমোটের ট্যাগটি মুছে ফেলা, বা git pushএটি মুছতে ব্যবহার করে — এমন একটি সময়কালের সময় হয় যখন যে কেউ রিমোটটিতে অ্যাক্সেস করে তা দেখতে পাবে যে devট্যাগটি অনুপস্থিত। ( তাদের যদি ইতিমধ্যে এটি থাকে তবে তাদের নিজস্ব পুরানো ট্যাগটি অবিরত থাকবে এবং আপনি নতুনটি চাপ দেওয়ার আগে তারা তাদের পুরাতন ট্যাগটিকে আবার ব্যাক আপ করতে পারেন))


এটি কি কেবল গিটের নতুন সংস্করণে ঘটছে? আমার আছে 1.7.9.5এবং আমার এই সমস্যাটি নেই ...
আয়নিক বিজাউ

2
প্রব্লেবি — গিটের git push --tagsপুরানো সংস্করণগুলিতে ছাড়াই স্বয়ংক্রিয়ভাবে ট্যাগটি পরিবর্তন করার আমার একটি অস্পষ্ট স্মৃতি রয়েছে --force। যদিও আমি এটি ১.৮.৪ এর নীচে পরীক্ষা করেছি এবং আপনার দরকার নেই --force, বা দুটি পর্যায়ে আপডেট কৌশল।
torek

2
@ জন ツ: আপডেট: প্রকাশের নোট অনুসারে এটি 1.8.2 এর হিসাবে নতুন আচরণ । আমি এটিকে পাদটীকা 1 এও সম্পাদনা করব।
torek

আমি জানিনা কীভাবে আমি এই পরিস্থিতিতে পড়েছি, তবে এটি একটি ট্যাগ মুছে ফেলা হয়েছে এবং একটি ট্রাইসে পুনরায় তৈরি করা হয়েছে।
রিগসফলি

4
আপনি জেডি না থাকলে আপনি কীভাবে ফোর্স-পুশ করবেন?
ফোনিক্স

54

ম্যাক সোর্স ট্রি এ কেবল সমস্ত ট্যাগ পুশ চেকবাক্সকে অনির্বাচিত করুন:

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


3
হাহাহাহা এতো সাধারণ মানুষ, আমি গৃহীত উত্তরটি পড়ছিলাম এবং আমি ভেবেছিলাম যে আমি
এটিকে জালিয়ে ফেলব

10
এটি কেবল সমস্যাটি সমাধান না করে এটি কাটিয়ে উঠার জন্য। এটি দূরবর্তী এবং স্থানীয়তে ট্যাগ নামের মিস ম্যাচের সমাধান করে না।
amalBit

1
উইন্ডোজ সংস্করণ হিসাবে কাজ করে! দীর্ঘ স্বীকৃত উত্তরটি পড়তে আমাদের বাঁচানোর জন্য ধন্যবাদ যা কমান্ড প্রম্পটে কী চলছে তা বিবেচনা করে না এমন সোর্সট্রি ব্যবহারকারীদের বাদ দেয় :)
স্কুল

19

আপনি সোর্স ট্রি ব্যবহার করছেন এটি বেশ সহজ

এখানে চিত্র বর্ণনা লিখুন মূলত আপনার কেবল বিরোধী ট্যাগটি সরিয়ে পুনরায় যুক্ত করতে হবে:

  1. ট্যাবতে যান সংগ্রহস্থল -> ট্যাগ -> ট্যাগ সরান
  2. বিরোধী ট্যাগ নাম নির্বাচন করুন
  3. সমস্ত রিমোট থেকে ট্যাগ সরান পরীক্ষা করুন
  4. অপসারণ টিপুন
  5. যথাযথ প্রতিশ্রুতি হিসাবে একই নামের সাথে নতুন ট্যাগ তৈরি করুন
  6. আপনার পরিবর্তনগুলি রিমোটে চাপ দেওয়ার সময় সমস্ত ট্যাগ পুশ করে দেখুন কিনা তা নিশ্চিত করুন

16

আপনি যদি কোনও ট্যাগ আপডেট করতে চান তবে এটি বলা যাক1.0.0

  1. git checkout 1.0.0
  2. আপনার পরিবর্তন করুন
  3. git ci -am 'modify some content'
  4. git tag -f 1.0.0
  5. গিথুবে রিমোট ট্যাগ মুছুন: git push origin --delete 1.0.0
  6. git push origin 1.0.0

সম্পন্ন


12

দেখে মনে হচ্ছে যে আমি এই ইস্যুতে দেরি করেছি এবং / অথবা এর উত্তর ইতিমধ্যে দেওয়া হয়ে গেছে তবে কী করা যায় তা হ'ল: (আমার ক্ষেত্রে, স্থানীয়ভাবে আমার কেবল একটি ট্যাগ ছিল .. আমি পুরানো ট্যাগটি মুছলাম এবং এটিকে দিয়ে আবার ফিরে এসেছি) :

git tag -d v1.0
git tag -a v1.0 -m "My commit message"

তারপর:

git push --tags -f

এটি রিমোটে সমস্ত ট্যাগ আপডেট করবে ।

মারত্মক হতে পারতো! নিজের ঝুঁকিতে ব্যবহার করুন।


1
এটি আমার জন্য এটি করেছে! ট্যাগগুলি কেবলমাত্র স্থানীয়ভাবে ছিল এবং দূরবর্তী
অঞ্চলে ছিল

4

আপনি যে কারণে প্রত্যাখ্যান হচ্ছেন তা হ'ল আপনার ট্যাগটি দূরবর্তী সংস্করণের সাথে সিঙ্ক হারিয়েছে। শাখাগুলির সাথে এটি একই আচরণ।

দূরবর্তী থেকে ট্যাগের সাথে সিঙ্ক করুন git pull --rebase <repo_url> +refs/tags/<TAG>আপনি সিঙ্কের মাধ্যমে এবং পরে, আপনার বিরোধগুলি পরিচালনা করতে হবে । আপনার যদি ডিফ্টল ইনস্টল থাকে (উদাঃ মেল্ড) git mergetool meldএটি রিমোট সিঙ্ক করতে এবং আপনার পরিবর্তনগুলি বজায় রাখতে ব্যবহার করুন।

আপনি --rebase পতাকাটি টানার কারণ হ'ল আপনি নিজের কাজটি রিমোটের উপরে রাখতে চান যাতে আপনি অন্যান্য বিবাদগুলি এড়াতে পারেন।

এছাড়াও, আমি যা বুঝতে পারি না তা হল আপনি devট্যাগটি মুছবেন এবং পুনরায় তৈরি করবেন কেন ??? ট্যাগগুলি সফ্টওয়্যার সংস্করণ বা মাইলফলক নির্দিষ্ট করার জন্য ব্যবহৃত হয়। Git ট্যাগের উদাহরণ v0.1dev, v0.0.1alpha, v2.3-cr(CR - প্রার্থী রিলিজ) ইত্যাদি ..


আপনি এটির সমাধানের আরেকটি উপায় হ'ল একটি সমস্যা git reflogএবং সেই মুহুর্তে যা আপনি devট্যাগটি রিমোটের দিকে ঠেলেছেন। কমিট আইডিটি অনুলিপি করুন এবং git reset --mixed <commmit_id_from_reflog>আপনি জানেন যে আপনি নিজের ট্যাগটি চাপানোর মুহুর্তে আপনার ট্যাগটি রিমোটের সাথে সিঙ্ক হয়েছে এবং কোনও বিরোধ নেই।


উদাহরণস্বরূপ, আপনি যদি বর্তমানে এমন একটি প্রতিশ্রুতি ট্যাগ করতে চান যা বর্তমানে নির্মিত হচ্ছে। তাহলে কি আপনাকে কোনও নির্দিষ্ট কমিট থেকে পুরানো প্রোডাকশন ট্যাগটি মুছতে হবে এবং নতুন উত্পাদন প্রকাশের পরে কমিটের জন্য নতুন ট্যাগ তৈরি করতে হবে এবং চাপ দিতে হবে?
ভিল মিক্ক-ওজা


0

কিছু ভাল উত্তর এখানে। বিশেষত একটি @ টোরেক দ্বারা । আমি ভেবেছিলাম যে ভিড়ের জন্য তাদের একটু ব্যাখ্যা দিয়ে আমি এই কাজটি যুক্ত করব।

সংক্ষিপ্তসার হিসাবে, কী ঘটে তা হ'ল আপনি যখন স্থানীয়ভাবে কোনও ট্যাগটি সরান, এটি ট্যাগটি একটি নন-নুল কমিট মান থেকে আলাদা মানকে পরিবর্তন করে। যাইহোক, গিটটি (ডিফল্ট আচরণ হিসাবে) নন-নুল রিমোট ট্যাগগুলি পরিবর্তন করতে দেয় না, আপনি পরিবর্তনটি ঠেলাতে পারবেন না।

চারপাশের কাজটি হ'ল ট্যাগটি মুছে ফেলা (এবং সমস্ত রিমোটগুলি মুছে ফেলার টিক)। তারপরে একই ট্যাগ তৈরি করুন এবং ধাক্কা দিন।

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