গিট ট্যাগের তারিখ পরিবর্তন করুন (বা এর উপর ভিত্তি করে গিটহাব প্রকাশ)


98

আমি প্রধান শাখায় বিভিন্ন কমিটিতে ট্যাগ যুক্ত করে গিটহাবের আমার প্রকল্পগুলিতে রিলিজ যুক্ত করছি ।

আমার একটি প্রকল্পে আমি কালক্রমিক ক্রমে কমিটগুলিতে ট্যাগগুলি যুক্ত করি নি। (আমি সুস্পষ্ট কমিট খুঁজে পেয়েছি এবং সেগুলি ট্যাগ করেছি এবং তারপরে আমি কম স্পষ্ট, পুরানো কমিটগুলি খুঁজে পেয়েছি এবং তাদের ট্যাগ করেছি))

এখন GitHub দেখানো হয় বর্তমান যেমন v1.0.1, v0.7.0 এটি পূর্ববর্তী সঙ্গে, এবং v1.1.2 পূর্ববর্তী যে

এটি ট্যাগ তৈরি হওয়ার তারিখটি প্রকাশের তারিখ হিসাবে ট্যাগ হিসাবে তৈরি হওয়ার পরিবর্তে তারিখটিকে প্রকাশের তারিখ হিসাবে ব্যবহার করে বলে মনে হয়। আমি কীভাবে আমার ট্যাগগুলি সম্পাদনা করতে পারি যাতে তাদের তারিখগুলি যেভাবে প্রতিশ্রুতিবদ্ধ হয় তা একই রকম হয়?

গিটক এবং গিটহাবের মধ্যে প্রকাশ এবং তারিখগুলির ম্যাপিং

উত্তর:


121

সতর্কতা: এটি টীকাগুলি ট্যাগগুলির জন্য ট্যাগ বার্তাগুলি সংরক্ষণ করবে না

সারসংক্ষেপ

প্রতিটি ট্যাগের জন্য যা পরিবর্তন করা প্রয়োজন:

  1. ট্যাগটি উপস্থাপন করে প্রতিশ্রুতিবদ্ধ সময়ে ফিরে যান
  2. ট্যাগটি মুছুন (স্থানীয়ভাবে এবং দূরবর্তীভাবে)
    • এটি আপনার "রিলিজ" গিটহাবকে এমন একটি খসড়াতে পরিণত করবে যা আপনি পরে মুছতে পারেন।
  3. কমিটের তারিখটিতে তার তারিখ নির্ধারণ করে এমন একটি যাদু আহরণ ব্যবহার করে একই নামযুক্ত ট্যাগটি পুনরায় যুক্ত করুন।
  4. গিটহাবের কাছে ফিক্সড তারিখ সহ নতুন ট্যাগগুলি পুশ করুন।
  5. গিটহাব এ যান, যেকোন এখন-খসড়া প্রকাশ মুছুন এবং নতুন ট্যাগগুলি থেকে নতুন রিলিজ তৈরি করুন

কোডে:

# Fixing tag named '1.0.1'
git checkout 1.0.1               # Go to the associated commit
git tag -d 1.0.1                 # Locally delete the tag
git push origin :refs/tags/1.0.1 # Push this deletion up to GitHub

# Create the tag, with a date derived from the current head
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a 1.0.1 -m"v1.0.1"

git push --tags                  # Send the fixed tags to GitHub

বিশদ

গিটে ট্যাগ করার পদ্ধতি অনুসারে :

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

git checkout SHA1_OF_PAST_COMMIT
git tag -m"Retroactively tagging version 1.5" v1.5

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

# This moves you to the point in history where the commit exists
git checkout SHA1_OF_PAST_COMMIT

# This command gives you the datetime of the commit you're standing on
git show --format=%aD  | head -1

# And this temporarily sets git tag's clock back to the date you copy/pasted in from above
GIT_COMMITTER_DATE="Thu Nov 11 12:21:57 2010 -0800" git tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"

# Combining the two...
GIT_COMMITTER_DATE="$(git show --format=%aD  | head -1)" git tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"

তবে, আপনি যদি ইতিমধ্যে ট্যাগটি যোগ করেছেন, আপনি git tag -f existingtagউপরেরটি ব্যবহার করতে পারবেন না অন্যথায় গিটটি যখন আপনি মার্জ করার চেষ্টা করবেন তখন অভিযোগ করবে:

Rammy:docubot phrogz$ git push --tags
To git@github.com:Phrogz/docubot.git
 ! [rejected]        1.0.1 -> 1.0.1 (already exists)
error: failed to push some refs to 'git@github.com:Phrogz/docubot.git'
hint: Updates were rejected because the tag already exists in the remote.

পরিবর্তে, আপনাকে অবশ্যই স্থানীয়ভাবে ট্যাগটি সরিয়ে ফেলতে হবে:

git tag -d 1.0.1

রিমোটলি মুছে ফেলুন এটি পুশ করুন :

git push origin :refs/tags/1.0.1

গিটহাব-এ, পুনরায় লোড করুন - রিলিজটি এখন একটি "খসড়া" হিসাবে চিহ্নিত হয়েছে - এবং খসড়াটি সরান।

এখন, উপরের নির্দেশাবলীর উপর ভিত্তি করে ব্যাকটেড ট্যাগ যুক্ত করুন এবং পরিশেষে ফলাফলটি ট্যাগটি গিটহাবের দিকে চাপ দিন:

git push --tags

এবং তারপরে গিয়ে গিটহাব প্রকাশের তথ্য আবার যুক্ত করুন।


4
এখানে একটি বাশ স্ক্রিপ্ট যা গিট git tag -l | while read -r tag; do `git checkout $tag && git tag -d $tag && git push origin :refs/tags/$tag && GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a $tag -m"$tag"`; done; git push --tags
রেপোতে

4
ব্যবহার git tag -af-dgit push --tags -f
অবিচলিত

ধন্যবাদ @vmrob, যে কাজ করেছে (যদিও আমাকে আমার গিটহাব পাসওয়ার্ডটি বেশ কয়েকবার প্রবেশ করতে হয়েছিল)।
কর্নেল আতঙ্ক

4
@ মিঃ_আর_আমস_ডি এই পরামর্শকে এক ধাক্কায় সীমাবদ্ধ করার জন্য ভাল পরামর্শ এবং একটি ভাল উপায়। এই বিষয়টি মাথায় রেখে, আমি মনে করি ফলাফল ( git tag -l | while read -r tag ; do COMMIT_HASH=$(git rev-list -1 $tag) && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$tag" $COMMIT_HASH ; done && git push --tags --force
অপরিশোধিত

4
এটি পাওয়ারশেলের জন্য গিট শেলের কাজ করে, তবে আপনাকে পরিবেশটি ভিন্নভাবে পরিবর্তনশীল সেট করতে হবে এবং দুটি লাইনে এটি করতে হবে: $env:GIT_COMMITTER_DATE="Thu Nov 11 12:21:57 2010 -0800"এবংgit tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"
রোনক্লি

18

অন্য উত্তরের কয়েকটি মন্তব্যের ভিত্তিতে এখানে একটি ওয়ান-লাইনার দেওয়া হয়েছে:

git tag -l | while read -r tag ; do COMMIT_HASH=$(git rev-list -1 $tag) && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$tag" $COMMIT_HASH ; done && git push --tags --force

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

এটি ভেঙে ফেলার জন্য ...

# Loop over tags
git tag -l | while read -r tag
do

    # get the commit hash of the current tag
    COMMIT_HASH=$(git rev-list -1 $tag)

    # get the commit date of the tag and create a new tag using
    # the tag's name and message. By specifying the environment
    # environment variable GIT_COMMITTER_DATE before this is
    # run, we override the default tag date. Note that if you
    # specify the variable on a different line, it will apply to
    # the current environment. This isn't desired as probably
    # don't want your future tags to also have that past date.
    # Of course, when you close your shell, the variable will no
    # longer persist.
    GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$tag" $COMMIT_HASH


done

# Force push tags and overwrite ones on the server with the same name
git push --tags --force

একক ধাক্কা ব্যবহারের পরামর্শের জন্য @ মিঃ_আর_মরস_ডিকে ধন্যবাদ।


3

অন্যান্য উত্তরের উপর বিল্ডিং, এখানে একটি উপায় যা ট্যাগ বার্তার প্রথম লাইনটি সংরক্ষণ করবে

git tag -l | while read -r tag ; do COMMIT_HASH=$(git rev-list -1 $tag) COMMIT_MSG=$(git tag -l --format='%(contents)' $tag | head -n1) && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$COMMIT_MSG" $COMMIT_HASH ; done
git tag -l -n1           #check by listing all tags with first line of message
git push --tags --force  #push edited tags up to remote

বার্তা সংরক্ষণের জন্য বিট দায়ী:

COMMIT_MSG=$(git tag -l --format='%(contents)' $tag | head -n1)

head -n1পুরানো প্রতিশ্রুতি বার্তা প্রথম লাইন গ্রহণ করা হবে। পরিবর্তে দুটি বা তিনটি লাইন পেতে আপনি এটিকে -n2বা অন্যান্যতে সংশোধন করতে পারেন -n3

আপনি যদি কেবল একটি ট্যাগের জন্য তারিখ / সময় পরিবর্তন করতে চান তবে আপনার ব্যাশ শেলটিতে এটি করার জন্য আপনি ওয়ান-লাইনারটি ভেঙে ফেলতে পারেন:

tag=v0.1.0
COMMIT_HASH=$(git rev-list -1 $tag)
COMMIT_MSG=$(git tag -l --format='%(contents)' $tag | head -n1)
COMMIT_DATE=$(git show $COMMIT_HASH --format=%aD | head -1)
GIT_COMMITTER_DATE=$COMMIT_DATE git tag -s -a -f $tag -m"$COMMIT_MSG" $COMMIT_HASH

তথ্যসূত্র:


এটি দুর্দান্ত, ধন্যবাদ। একটি একক ট্যাগ পরিবর্তন করার কমান্ডগুলিতে, যদিও, একটি -sপতাকা রয়েছে যা ওয়ান-লাইনারে উপস্থিত নেই, তাই আমি পাচ্ছিলাম error: gpg failed to sign the dataকারণ আমার কাছে গিটের জন্য সাইন আপ নেই। এই ত্রুটিটি আমাকে কিছুটা দূরে ফেলেছিল।
wch
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.