গিতে রিমোট শাখার নামকরণ


407

যদি আমার কাছে কেবলমাত্র git://অ্যাক্সেস রয়েছে এমন কোনও ভাণ্ডার থাকে (এবং সাধারণত এটি কেবল ধাক্কা + টান), স্থানীয়ভাবে আমি যেভাবে করব সেভাবে os ভান্ডারটিতে শাখাগুলি পুনর্নাম করার কোনও উপায় আছে কি git branch -m?


48
লিঙ্কযুক্ত "সদৃশ" প্রশ্নটি "স্থানীয় এবং দূরবর্তী উভয়" একটি শাখার নাম বদলে দিতে বলে। এই প্রশ্নটি তবে কেবল শাখাগুলি কীভাবে পুনরায় নামকরণ করবেন তা জিজ্ঞাসা করে, যা সরলীকরণের অনুমতি দেয়। চেকআউট এবং / অথবা স্থানীয় শাখা তৈরি করার প্রয়োজন ছাড়াই আমি সার্ভারে একটি শাখার নতুন নামকরণের জন্য এটি করি git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
স্কুবার্থ

1
@ এসচুবার্থ: আপনি একবারে উভয় আদেশ দিতে পারেন give এবং এটি সত্যই এই প্রশ্নের উত্তর হওয়া উচিত।
জোচিম ব্রেটনার

2
@ জোয়াচিমব্রেটনার আপনি ঠিক বলেছেন, আমি এই স্ক্রিপ্টটিতে ইতিমধ্যে সেই অপটিমাইজেশনটি করেছি ।
স্কুবার্থ

1
@ এসচুবার্থ, আপনার মন্তব্যটি উত্তর হিসাবে পোস্ট করা উচিত, যেহেতু আমি নীচের অন্যান্যদের চেয়ে এটি পছন্দ করি।
ফাতেমন

উত্তর:


480

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

$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name

তারপরে, পুরাতন শাখার নাম দেখতে, সংগ্রহস্থলের প্রতিটি ক্লায়েন্টকে করতে হবে:

$ git fetch origin
$ git remote prune origin

দ্রষ্টব্য: যদি আপনার পুরাতন শাখাটি আপনার প্রধান শাখা হয় তবে আপনার প্রধান শাখার সেটিংস পরিবর্তন করা উচিত। অন্যথায়, আপনি চালানোর সময় $ git push origin :old-branch-name, আপনি ত্রুটিটি পাবেন "বর্তমান শাখার মোছন নিষিদ্ধ"


8
ঠিক আছে, যদি পুরনো এবং নতুন নাম একই থাকে তবে এর অর্থ হল আপনার শাখাটির নতুন নামকরণের দরকার নেই, সুতরাং কমান্ডটি প্রথম স্থানে চালিত করার কোনও কারণ নেই ;-)
সিলেভেন ডিফ্রেসনে

9
অবশ্যই। আমি কেবল বোঝাতে চাইছি যে আপনি যদি এটি একটি স্বয়ংক্রিয় উপায়ে কল করছেন (অন্য কোনও স্ক্রিপ্টের ফাংশন হিসাবে) আপনার এটিকে ভুল কাজ নাও করতে পারে যদি আপনি এড়াতে পারেন।
রহস্যময় ড্যান

9
ড্যানের উপায়: কমান্ডগুলি পুনরায় অর্ডার করুন যাতে তারা সর্বদা ঠিক কাজ করে। আর্থ ইঞ্জিনের উপায়: সর্বদা চেক করতে ভুলবেন না, বা আপনি ডেটা হারাবেন। আমি জানি আমি কোনটি বেছে নেব
দোরাদাস

2
ব্যবহারকারীরা কেবল চালাতে পারবেন: git fetch origin --prune(কার্যকরভাবে নতুন শাখাগুলি আনতে এবং দূরবর্তীটিতে রেফারেন্সগুলি আর ছাড়িয়ে নিতে)।
ডলফিনড্রিম

2
গিটের নতুন সংস্করণগুলিতে -dবা --deleteপরিবর্তে ব্যবহার করতে পারে :
জিতরেক্স

285

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

git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

আমি এই স্ক্রিপ্টটি লিখেছি ( গিট-নামকরণ-রিমোট-শাখা ) যা উপরেরটি সহজেই করার জন্য একটি সহজ শর্টকাট সরবরাহ করে।

বাশ ফাংশন হিসাবে:

git-rename-remote-branch(){
  if [ $# -ne 3 ]; then
    echo "Rationale : Rename a branch on the server without checking it out."
    echo "Usage     : $(basename $0) <remote> <old name> <new name>"
    echo "Example   : $(basename $0) origin master release"
    exit 1 
  fi

  git push $1 $1/$2:refs/heads/$3 :$2
}

@ কেএসআরবি'র মন্তব্যকে সংহত করার জন্য : এটি মূলত যা করে তা হ'ল প্রথম একক আদেশে দুটি ধাক্কাgit push <remote> <remote>/<old_name>:refs/heads/<new_name> পুরানো দূরবর্তী ট্র্যাকিং শাখার উপর ভিত্তি করে একটি নতুন দূরবর্তী শাখা এবং তারপরে git push <remote> :<old_name>পুরানো দূরবর্তী শাখাটি মুছে ফেলা।


10
যারা এই আদেশটির একটি উপনাম চান তাদের জন্য: পুনঃনামকরণ = "! চ () {গিট পুশ অরিজিনের উত্স / $ 1: রেফস / হেডস / $ 2: $ 1;"; চ "এটিকে> গিটের পুনর্নাম <<<_name> <হিসাবে ব্যবহার করা যেতে পারে new_name>
জোনাথন

33
এই কমান্ডটির মূল অর্থ কী তা সম্পর্কে git push <remote>/<old_name>:refs/heads/<new_name> git push [space]:<old_name>
কৌতূহলীদের জন্য

3
আপনার ব্যবহারের দরকার কেন refs/heads/name? আপনি কি nameপ্রথম কমান্ড তৈরি করে সরাসরি সরাসরি ব্যবহার করতে পারবেন না git push <remote> <remote>/<old_name>:<new_name>?
ড্র নোকস

6
না, কারণ দূরবর্তী শাখাটি <new_name>এখনও বিদ্যমান নেই। যদি শাখাটি বিদ্যমান না থাকে, গিটের জন্য আপনাকে পুরো নামটি ব্যবহার করা দরকার অন্যথায় <new_name>কোনও ট্যাগের নামও উল্লেখ করা যেতে পারে।
স্কুবার্থ

3
আমরা আমাদের বিল্ড সিস্টেমে এই পদ্ধতির ব্যবহার করি। refs/heads/<new_name> ইতিমধ্যে যদি উপস্থিত থাকে তবে আমরা কেবলমাত্র ক্যাভেটের মুখোমুখি হই । মুছাটি এখনও সফল হয়, ফলস্বরূপ কেবল মুছে <remote>/<old_name>ফেলা হয়। কিছু হাত আগে পরীক্ষা করা সহজেই এড়াতে পারে।
অপিওরন

172

আপনি যে শাখার নাম পরিবর্তন করতে চান তাতে প্রথমে চেকআউট করুন:

git branch -m old_branch new_branch
git push -u origin new_branch

থেকে একটি পুরানো শাখা অপসারণ remote:

git push origin :old_branch

12
আপনি যখন নাম পরিবর্তিত শাখা (নতুন_ ব্রাঞ্চ) রিমোট (উত্স) তে চাপান তখন নতুন শাখাটি ট্র্যাক করার জন্য আপনাকে এর উজানে সেট করা উচিত (উদাহরণস্বরূপ git push -u origin new_branch) অন্যথায় নাম পরিবর্তন করা শাখা (নতুন_ ব্রাঞ্চ) মূল / ওল্ড ব্রাঞ্চটিকে ট্র্যাক করতে থাকবে। এবং একবার আপনি রিমোট ওল্ড_ব্রাঞ্চ মুছে ফেললে, নতুন_ ব্রাঞ্চ এখনও সেই শাখাটি চলে গেলেও, মূল / ওল্ড ব্রাঞ্চটিকে ট্র্যাক করবে।
ডলফিনড্রিম

@ ডলফিনড্রিম আপনার দরকারী প্রবাহের পরিবর্তনটি অন্তর্ভুক্ত করার জন্য আমি উত্তরটি সম্পাদনা করেছি।
mVChr

10

অবশ্যই। কেবল স্থানীয়ভাবে শাখাটির নাম পরিবর্তন করুন, নতুন শাখাটি টিপুন এবং পুরানো একটি মুছুন।

কেবল আসল সমস্যাটি হ'ল সংগ্রহস্থলের অন্যান্য ব্যবহারকারীর স্থানীয় ট্র্যাকিং শাখার নাম পরিবর্তন করা হবে না।


1
সুতরাং মাস্টার মুছতে চেষ্টা করার সময়, আমি $ গিট ক্লোন ../src $ সিডি src $ গিট শাখা নোটমাস্টার $ গিট চেকআউট নোটমাস্টার $ গিট শাখা-ডি মাস্টার $ গিট পুশ ../src: মাস্টার তবে এটি অভিযোগ করে: গন্তব্য রেফস্পেক না রিমোটের একটি বিদ্যমান রেফের সাথে মেলে না রেফ / দিয়ে শুরু হয় এবং আমরা উত্স রেফের উপর ভিত্তি করে একটি উপসর্গ অনুমান করতে অক্ষম। ত্রুটি: '../alpha/' তে কিছু রেফ চাপতে ব্যর্থ হয়েছে রিমোটটির সত্যই মাস্টার নামে একটি শাখা রয়েছে
কেডিটি

2

টি এল; ডিআর

একটি প্রত্যন্ত শাখার "পুনর্নামকরণ" আসলে একটি 2 ধাপ প্রক্রিয়া (প্রয়োজনীয় অর্ডার করা হয় না):

  • পুরানো দূরবর্তী শাখা মুছে ফেলা ( git push [space]:<old_name>যেমন ksrb ব্যাখ্যা করেছে) );
  • একটি নতুন দূরবর্তী শাখায় ধাক্কা (নীচে উত্তর কমান্ডের কয়েকটি মধ্যে পার্থক্য)।

একবার মুছে

আমি টর্টোজাইজিট ব্যবহার করি এবং কমান্ড লাইনের মাধ্যমে যখন আমি প্রথম শাখাটি মুছে ফেলার চেষ্টা করেছি তখন আমি এটি পেয়েছি:

$ git push origin :in
  • মারাত্মক: 'উত্স' একটি গিট সংগ্রহস্থল হিসাবে উপস্থিত হয় না

  • মারাত্মক: দূরবর্তী সংগ্রহস্থল থেকে পড়া যায়নি।

দয়া করে নিশ্চিত হয়ে নিন যে আপনার কাছে সঠিক অ্যাক্সেসের অধিকার রয়েছে এবং ভান্ডার রয়েছে।

এই সম্ভবত হবার কথা ছিলো প্যাজেন্ট হচ্ছে না প্রাইভেট কী (যা লোড TortoiseGit লোড মধ্যে স্বয়ংক্রিয়ভাবে প্যাজেন্ট )। তদুপরি, আমি লক্ষ্য করেছি যে টর্টোজাইজিট কমান্ডগুলির মধ্যে originরেফ নেই (উদাঃ git.exe push --progress "my_project" interesting_local:interesting)।

আমি বিটবকেটও ব্যবহার করছি এবং অন্যরকম ওয়েব-ভিত্তিক অনলাইন গিট ম্যানেজার হিসাবে (গিটহাব, গিটল্যাব), আমি সরাসরি তাদের ইন্টারফেসের মাধ্যমে (শাখা পৃষ্ঠা) মুছে ফেলতে সক্ষম হয়েছি:

শাখা বিটবুকিট মুছুন

যাইহোক, টর্টোইজগিতে আপনি ব্রাউজ রেফারেন্সের মাধ্যমে দূরবর্তী শাখাগুলিও মুছতে পারেন :

রেফারেন্স মেনু ব্রাউজ করুন

দূরবর্তী শাখায় ডান-ক্লিক করে (রিমোটগুলি তালিকা) রিমোট শাখা মুছুন বিকল্পটি প্রদর্শিত হবে:

কচ্ছপযুক্ত রিমোট শাখা মুছুন

ঠেলাঠেলি

পুরানো রিমোট শাখাটি মোছার পরে আমি কেবল নতুন নাম টাইপ করে টর্টোজাইজিটের মাধ্যমে একটি নতুন দূরবর্তী শাখায় সরাসরি ঠেলে দিয়েছি দূরবর্তী: ক্ষেত্র পুশ উইন্ডো এবং এই শাখা স্বয়ংক্রিয়ভাবে তৈরি করা এবং দৃশ্যমান ছিল Bitbucket

তবে, আপনি যদি এখনও এটি ম্যানুয়ালি করতে পছন্দ করেন তবে এই থ্রেডে এখনও উল্লেখ করা হয়নি এমন একটি পয়েন্টটি -u= --set-upstream

git pushদস্তাবেজগুলি থেকে , -uকেবলমাত্র একটি উপনাম --set-upstream, সুতরাং সিলভাইন ( -set-upstream new-branch) এবং শশাঙ্ক ( -u origin new_branch) এর উত্তরের আদেশগুলি সমান, কারণ দূরবর্তী রেফorigin অন্য কোনও রেফ আগে সংজ্ঞায়িত না হলে ডিফল্ট ছিল:

  • git push origin -u new_branch = git push -u new_branch থেকে ডক্স বিবরণ :

    যদি কনফিগারেশনটি অনুপস্থিত থাকে তবে এটি ডিফল্ট হয় origin

শেষ পর্যন্ত, আমি এখানে অন্য উত্তরগুলির দ্বারা প্রস্তাবিত কোনও আদেশ ম্যানুয়ালি টাইপ বা ব্যবহার করি নি, তাই সম্ভবত এটি একইরকম পরিস্থিতিতে অন্যের পক্ষে দরকারী be


সমস্যাটি হল আপনার রিমোটটি কল করা হয় না origin। আপনি যত আপনি এটা কমান্ড চালানোর থেকে পেতে আপনার রিমোটের নাম আছে git remote। গিটটি এর দ্বারা কাজ করে sshযা বোঝায় যে আপনি সর্বজনীন + ব্যক্তিগত কী ব্যবহার করছেন। আমি ধরে নিয়েছি যে Autoload Putty keysটর্টোজাইজিট আপনার দূরবর্তী রেফারেন্স সহ কিছু করার জন্য কেবল প্রয়োজনীয় কীগুলি স্বয়ংক্রিয়ভাবে চালিত করছে। শেষ কথাটি হ'ল git push -uদূরবর্তী শাখায় ঠেলাঠেলি করার জন্য কোনও উপনাম নয়, এটি স্থানীয়ভাবে তৈরি এমন একটি দূরবর্তী শাখায় ঠেলাঠেলি করার জন্য একটি উলামের নাম এবং এর প্রত্যন্ত রেফারেন্সটি এখনও এই শাখাটি পায় নি
যুয়ানেকেবেলব

1
@ জুয়ানক্যাব -uএকটি উপনাম --set-upstreamএবং "যদি কনফিগারেশনটি অনুপস্থিত থাকে তবে এটি ডিফল্ট হয়origin "। সিলভাইন এবং শশাঙ্ক এটি একটি নতুন নির্মিত প্রত্যন্ত শাখায় প্রবেশের জন্য ব্যবহার করে । কী সমস্যা হতে পারে হয়েছে কারণে প্যাজেন্ট হচ্ছে না এটা লোড যখন আমি চেষ্টা git push origin :inশেল উপর। সুতরাং আমি আপনার উপনীতটি বুঝতে পারি না, আমি কেবলমাত্র অন্য উত্তরে আমার এবং অ-সম্বোধিত বিশদটি নির্দেশ করেছি, সেগুলি ব্যাখ্যা করেছি এবং সেগুলি সমাধান করেছি।
সিপিএইচপিথন

আপনি ভুল জিনিস উল্লেখ করছেন এবং এই উত্তরটির বেশিরভাগই প্রশ্নের সাথে সম্পর্কিত নয়। যদি আপনি আপনার জন্য কী কাজ করে তা নির্দেশ করে থাকেন তবে আমি আপনাকে উত্সাহ দিচ্ছি যে এটি কী কাজ করেছে তার উত্তর সীমাবদ্ধ করতে এবং যদি আপনি সত্যই কোনও ব্যাখ্যা দিতে চান তবে দয়া করে নিজেকে আরও অবহিত করুন। বিটিডাব্লু: এটির -uজন্য একটি নাম --set-upstreamতবে এটি আপনি যেমন বলেছিলেন তেমন কোনও প্রত্যন্ত শাখায় প্রবেশের জন্য এটি একটি উপনাম নয়। কোনও দূরবর্তী শাখায় প্রবেশের জন্য আপনার অনন্যরূপে প্রয়োজন git push <remote>এবং এটি এখনও রিমোটে না থাকলে আপনি যুক্ত করেন git push -u <remote>। সুতরাং, -uরিমোটে শাখার একটি রেফারেন্স তৈরি করতে ব্যবহৃত হয়।
juanecabellob

1
@juancab সম্ভবত কি আপনি ভুল বলিয়া গণ্য বেশিরভাগই ছিল ওরফে বাচনভঙ্গীর উপরে নির্ভর বা শব্দের পছন্দ। আমি আমার উত্তরটিকে পুনর্গঠন করেছি এবং একটি প্রত্যন্ত শাখার নাম বদলে দেখতে পেয়েছি এমন সমাধান (গুলি) এর সম্পূর্ণ ব্যাখ্যা দেওয়ার জন্য এটি পুনরায় সংশোধন করেছি
সিপিএইচপিথন

আমি এটিকে আরও পুনরায় বলি। এটি এখন আরও অর্থবোধ করে, তবে এটি এখনও অনেক দীর্ঘ। আমি সমস্যার সাথে আরও সুনির্দিষ্ট হয়ে উঠব, অর্থাত্ টরটোইজিট ব্যবহারকারীদের জন্য প্রস্তাবিত সমাধানগুলি কাজ করবে না। আপনি একটি গল্প বলছেন এবং এটি বিভ্রান্তিকর এবং ব্যবহারকারীদের পড়া এড়াতে বাধ্য করে। আমি একটি উত্তর দিয়ে আপনার উত্তর সম্পাদনা করব।
জুয়ানেকেবেলোব

1

আমি জানি না তবে @ সিলওয়াইন ডফ্রেসনের উত্তর আমার পক্ষে কার্যকর হয় না।

git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name

আমাকে উজানে আনসেট করতে হবে এবং তারপরে আমি আবার স্ট্রিম সেট করতে পারি। নিম্নলিখিতটি আমি এটি কীভাবে করেছি।

git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name

0

এটি সঠিক বা ভুল কিনা তা আমি জানি না, তবে আমি শাখার "পুরাতন নাম" টি শাখার "নতুন নাম" এর দিকে ঠেলে দিয়েছিলাম, তারপরে নিম্নলিখিত দুটি লাইন দিয়ে পুরানো শাখাটি পুরোপুরি মুছে ফেলেছি:

git push origin old_branch:new_branch
git push origin :old_branch

আমি যতদূর বলতে পারি, অন্যান্য উত্তরগুলি ঠিক এটিই করে। আপনার উত্তরটি আরও সংক্ষিপ্ত।
ক্লিয়ারার

-1

আপনি পুরানো নাম শাখার উপর ভিত্তি করে একটি নতুন শাখা তৈরি করতে পারেন। ঠিক এইভাবে, তারপরে পুরানো শাখাটি মুছুন, ওভার !!!এখানে চিত্র বর্ণনা লিখুন


এটি গিটহাব, গিট নয়। ;)
বাউনার

-4

ইতিমধ্যে প্রদত্ত উত্তরগুলিতে যুক্ত করা, এখানে একটি সংস্করণ যা নতুন শাখাটি ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করে (যাতে আপনি এটি নিরাপদে কোনও স্ক্রিপ্টে ব্যবহার করতে পারেন)

if git ls-remote --heads "$remote" \
    | cut -f2 \
    | sed 's:refs/heads/::' \
    | grep -q ^"$newname"$; then
    echo "Error: $newname already exists"
    exit 1
fi
git push "$oldname" "$remote/$oldname:refs/heads/$newname" ":$oldname"

(চেকটি এই উত্তর থেকে )


আমি git show-ref --quiet --verify -- refs/heads/$new_nameপরিবর্তে ব্যবহার করতে হবে ls-remote | cut | sed | grep
অ্যান্ডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.