আমি কীভাবে গিট শাখায় একটি ট্যাগকে একটি পৃথক প্রতিশ্রুতিতে স্থানান্তর করতে পারি?


858

আমি মাস্টার শাখায় একটি ট্যাগ তৈরি করেছি যার নাম রয়েছে v0.1:

git tag -a v0.1

তবে আমি বুঝতে পেরেছিলাম যে ০.০ রিলিজের জন্য মাস্টারের সাথে একত্রীকরণের জন্য আমার এখনও কিছু পরিবর্তন দরকার ছিল, তাই আমি এটি করেছি। তবে এখন আমার v0.1ট্যাগ আটকে আছে (এটি পোস্টের পরে নোট সাদৃশ্যটি জানাতে) ভুল প্রতিশ্রুতিবদ্ধ। আমি চাই যে এটি মাস্টার সম্পর্কে সাম্প্রতিক প্রতিশ্রুতিতে আটকে থাকবে তবে পরিবর্তে এটি মাস্টার সম্পর্কে দ্বিতীয় সাম্প্রতিক প্রতিশ্রুতিতে আটকে আছে।

আমি কীভাবে এটিকে মাস্টার সম্পর্কে সাম্প্রতিক প্রতিশ্রুতিতে স্থানান্তর করতে পারি?

উত্তর:


1197

-fবিকল্পগুলি ব্যবহার করুন git tag:

-f
--force

    Replace an existing tag with the given name (instead of failing)

আপনি সম্ভবত কোনও অ-টীকায়িতের পরিবর্তে কোনও টিকাশযুক্ত ট্যাগটি জোর করে তৈরি করতে -fএর সাথে ব্যবহার করতে চান -a

উদাহরণ

  1. আপনি ধাক্কা দেওয়ার আগে কোনও রিমোটের ট্যাগটি মুছুন

    git push origin :refs/tags/<tagname>
    
  2. সর্বাধিক সামান্য প্রতিশ্রুতি রেফারেন্স করতে ট্যাগটি প্রতিস্থাপন করুন

    git tag -fa <tagname>
    
  3. ট্যাগটি দূরবর্তী উত্সে চাপুন

    git push origin master --tags
    

90
এটা কোনো রিমোটের ট্যাগটি মুছে দিতে একটি ভাল ধারণা হতে পারে আগে আপনি খুব ধাক্কা দিন, এই করে: git push origin :refs/tag/<tagname>এবং তারপর কি git tag -fa <tagname>এবং তারপর git push origin master --tags। অন্যথায় আপনি রিমোটের রেফ তালিকায় অদ্ভুত স্টাফ দিয়ে list এবং with} অক্ষর যুক্ত করতে পারেন। এটি নির্দেশ করার জন্য কোডবেসেক.কম এ ড্যানকে ধন্যবাদ জানাই।
ইডিপ

47
@ এডিপ: গৌণ সংশোধন - পরিবর্তে :refs/tag/<tagname>এটি হওয়া উচিত :refs/tags/<tagname>
বেন হকিং

8
আপনি কেবলমাত্র আপনার মেশিনের কোডটি ঠেলে না দিলে এটি কাজ করে। যদি আপনার কাছে থাকে তবে সর্বোত্তম উত্তরটি হ'ল 'বিশ্বে প্রচুর সংখ্যা রয়েছে' কারণ এটি কোনও ঝামেলার উপযুক্ত নয়।
ক্রিস হুয়াং-লিভার

33
আপনি যদি ইতিমধ্যে আপনার ট্যাগটিকে ধাক্কা দিয়ে থাকেন তবে আপনি জোর করে ধাক্কা দিয়ে দূরবর্তী ট্যাগটি আপডেট করতে পারেনgit push -f origin <tagname>
rc_luke

11
এখানে এবং ডক্সে যা উল্লেখ করা হয়নি তা হ'ল এটি কোনও নতুন বার্তা না দেওয়া থাকলে ট্যাগ মেসেজটি সরিয়ে দেয়।
টোনকি

259

আরও স্পষ্টভাবে, আপনাকে ট্যাগ সংযোজন করতে বাধ্য করতে হবে, তারপরে বিকল্প --tags এবং -f দিয়ে চাপ দিন:

git tag -f -a <tagname>
git push -f --tags

171

আপনার রিমোটটি কল করা হয় originএবং আপনি masterশাখায় কাজ করছেন কিনা তা সংক্ষেপে :

git tag -d <tagname>
git push origin :refs/tags/<tagname>
git tag <tagname> <commitId>
git push origin <tagname>
  • লাইন 1 স্থানীয় এনভির মধ্যে ট্যাগ সরান।
  • লাইন 2 দূরবর্তী এনভির মধ্যে ট্যাগটি সরান।
  • লাইন 3 বিভিন্ন কমিটে ট্যাগ যুক্ত করে
  • লাইন 4 রিমোটে পরিবর্তনটি চাপ দেয়

git push origin --tagsআপনার স্থানীয় পরিবর্তনগুলি থেকে ট্যাগগুলি সহ সমস্ত পরিবর্তনকে ঠেলাতে আপনি লাইন 4 কেও বিনিময় করতে পারেন ।

@ স্টুয়ার্ট-গলোডেটজ, @ গ্রেগ-হিউগিল, @eedep, @ বেন-হকারিং উত্তরগুলি, তাদের উত্তরের নীচে মন্তব্য এবং আমার উত্তরের নীচে নেটস মন্তব্যগুলি ব্যাস করা।


87

এটি দিয়ে মুছুন git tag -d <tagname>এবং তারপরে এটি সঠিক প্রতিশ্রুতিতে পুনরায় তৈরি করুন।


3
@ এডিপ: আমি মনে করি গ্রেগের প্রতিক্রিয়া এখানে ন্যায্য হওয়ার জন্য আসলে ভাল।
স্টুয়ার্ট গোলোডেটজ

সহজবোধ্য রাখো. এটি মুছুন, আপনি আবার যা করেছিলেন তা করুন।
ooolala

1
এটি সরলতার জন্য গ্রহণযোগ্য উত্তর হওয়া উচিত। অতিরিক্তভাবে -f শক্তি ব্যবহার করে না।
চিনিচিনচিন

47

গিট ব্যবহার করার সময় আমি কয়েকটি জিনিস এড়াতে চেষ্টা করি।

  1. ইন্টার্নালগুলির জ্ঞান ব্যবহার করে, যেমন রেফ / ট্যাগগুলি। আমি সম্পূর্ণরূপে নথিভুক্ত গিট কমান্ডগুলি ব্যবহার করার চেষ্টা করি এবং .git ডিরেক্টরিটির অভ্যন্তরীণ বিষয়বস্তুর জ্ঞানের প্রয়োজন হয় এমন জিনিসগুলি ব্যবহার করা এড়াতে চাই। (এর অর্থ, আমি গিটকে একজন গিট ব্যবহারকারী হিসাবে বিবেচনা করি, গিট বিকাশকারী হিসাবে নয়))

  2. যখন প্রয়োজন হয় না বল প্রয়োগ।

  3. অতিরিক্ত জিনিস। (আমি যেখানে চাই সেখানে একটি ট্যাগ পেতে একটি শাখা এবং / অথবা প্রচুর ট্যাগ পুশ করা হচ্ছে))

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

একটি সফ্টওয়্যার ফিক্সের চূড়ান্ত কোনও সমস্যা হয় এবং আপডেট / পুনরায় প্রকাশ করা দরকার হলে আমি এটি ব্যবহার করি।

git tag -d fix123                # delete the old local tag
git push github :fix123          # delete the old remote tag (use for each affected remote)
git tag fix123 790a621265        # create a new local tag
git push github fix123           # push new tag to remote    (use for each affected remote)

githubএকটি নমুনা দূরবর্তী নাম, fix123একটি নমুনা ট্যাগ নাম এবং 790a621265একটি নমুনা প্রতিশ্রুতি।


26

আমি এই কমান্ডের আরও একটি ফর্ম এখানে রেখে যাব যা আমার প্রয়োজন অনুসারে চলে।
একটি ট্যাগ ছিল v0.0.1.2যা আমি সরাতে চেয়েছিলাম।

$ git tag -f v0.0.1.2 63eff6a

Updated tag 'v0.0.1.2' (was 8078562)

এবং তারপর:

$ git push --tags --force

ভাল, আপনাকে ধন্যবাদ, 2 সাধারণ এবং সাধারণ কমান্ড
সেরজিও

10

অন্য একটি উপায়:

রিমোট রেপোতে ট্যাগ সরান needed (প্রয়োজনে অন্য কোনও সাথে হেড প্রতিস্থাপন করুন))

$ git push --force origin HEAD:refs/tags/v0.0.1.2

পরিবর্তনগুলি ফিরিয়ে আনুন।

$ git fetch --tags

এটি অন্যান্য উত্তরের চেয়ে "লেনদেনিক"।
জাস্টিন এম কেজ

9

একটি ট্যাগকে একটি ভিন্ন প্রতিশ্রুতিতে স্থানান্তরিত করার জন্য উপনাম।

আপনার নমুনা সালে পদক্ষেপ হ্যাশ e2ea1639 সঙ্গে কমিট করুন: git tagm v0.1 e2ea1639

ধাক্কা ট্যাগ জন্য, ব্যবহার করুন git tagmp v0.1 e2ea1639

উভয় উপন্যাসই আপনাকে আসল তারিখ এবং বার্তা রাখে। আপনি যদি ব্যবহার করেন তবে git tag -dআপনার মূল বার্তাটি হারাতে পারেন।

এগুলি আপনার .gitconfigফাইলে সংরক্ষণ করুন

# Return date of tag. (To use in another alias)
tag-date = "!git show $1 | awk '{ if ($1 == \"Date:\") { print substr($0, index($0,$3)) }}' | tail -2 | head -1 #"

# Show tag message
tag-message = "!git show $1 | awk -v capture=0 '{ if(capture) message=message\"\\n\"$0}; BEGIN {message=\"\"}; { if ($1 == \"Date:\" && length(message)==0 ) {capture=1}; if ($1 == \"commit\" ) {capture=0}  }; END { print message }' | sed '$ d' | cat -s #"

### Move tag. Use: git tagm <tagname> <newcommit> 
tagm = "!GIT_TAG_MESSAGE=$(git tag-message $1) && GIT_COMMITTER_DATE=$(git tag-date $1) && git tag-message $1 && git tag -d $1 && git tag -a $1 $2 -m \"$GIT_TAG_MESSAGE\" #"

### Move pushed tag. Use: git tagmp <tagname> <newcommit> 
tagmp = "!git tagm $1 $2 && git push --delete origin $1 && git push origin $1 #"

1

আপনি যদি কেবল কোনও লক্ষ্যযুক্ত প্রতিশ্রুতি পরিবর্তন করে তবে টীকাগুলির বার্তা এবং অন্যান্য মেটাডেটা ব্যবহার সংরক্ষণ করে কোনও টীকাগুলি ট্যাগ সরিয়ে নিতে চান:

moveTag() {
  local tagName=$1
  # Support passing branch/tag names (not just full commit hashes)
  local newTarget=$(git rev-parse $2^{commit})

  git cat-file -p refs/tags/$tagName | 
    sed "1 s/^object .*$/object $newTarget/g" | 
    git hash-object -w --stdin -t tag | 
    xargs -I {} git update-ref refs/tags/$tagName {}
}

ব্যবহার: মুভিট্যাগ <ট্যাগ- টু -মোভ> <টারেট>

উপরের ফাংশনটি terarapap / git-move-annotated-tag.sh রেফারেন্স করে বিকাশ করা হয়েছিল ।


1
মনে হয় এটির আর দরকার নেই: git tag -f -a my_tagইতিমধ্যে পূর্ববর্তী বার্তার বার্তা সংরক্ষণ করা হয়েছে (গিট সংস্করণ ২.১০.০ সহ)।
ম্যাথিজস কুইজমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.