আমি কীভাবে গিট শাখা সংরক্ষণাগারভুক্ত করতে পারি?


305

আমার গিট সংগ্রহস্থলে আমার কিছু পুরানো শাখা রয়েছে যা এখন সক্রিয় বিকাশের অধীনে নেই। আমি শাখাগুলি সংরক্ষণাগারভুক্ত করতে চাই যাতে চলমান অবস্থায় তারা ডিফল্টরূপে প্রদর্শিত না হয় git branch -l -r। আমি সেগুলি মুছতে চাই না, কারণ আমি ইতিহাসটি রাখতে চাই। কিভাবে আমি এটি করতে পারব?

আমি জানি যে রেফ / মাথাগুলির বাইরে একটি রেফ তৈরি করা সম্ভব। উদাহরণস্বরূপ refs/archive/old_branch,। এটি করার কোনও ফল আছে কি?


গিট-আরএম রিপোজিটরি থেকে রিসোর্সগুলি মুছবে না, এটি কেবল সূচকগুলি থেকে তাদের মুছে ফেলবে কার্নেল.org/pub/software/scm/git/docs/ git- rm.html আপনি সহজেই এই সংস্থানগুলি পুনরুদ্ধার করতে পারেনgit checkout [rev] file
দানা দ্য সনে

1
আমি যে জানি না। আমি Attic/<branchname>সংরক্ষণাগার শাখাগুলিতে লাইটওয়েট ট্যাগ ব্যবহার করি , যদিও।
জাকুব নারেবস্কি

ট্যাগগুলি দ্রুত এবং নিরাপদ এবং বুদ্ধিমান পছন্দ।
kch

উত্তর:


401

আমি বিশ্বাস করি এটি করার সঠিক উপায়টি শাখাটিকে ট্যাগ করা। আপনি যদি শাখাটিকে ট্যাগ করার পরে মুছে ফেলেন তবে কার্যকরভাবে আপনি শাখাটি চারপাশে রেখেছেন তবে এটি আপনার শাখার তালিকায় বিশৃঙ্খলা সৃষ্টি করবে না।

আপনার যদি শাখায় ফিরে যেতে হয় তবে কেবল ট্যাগটি দেখুন। এটি কার্যকরভাবে ট্যাগ থেকে শাখাটি পুনরুদ্ধার করবে।

শাখাটি সংরক্ষণাগারভুক্ত করতে এবং মুছতে:

git tag archive/<branchname> <branchname>
git branch -d <branchname>

কিছুক্ষণ পরে শাখাটি পুনরুদ্ধার করতে:

git checkout -b <branchname> archive/<branchname>

শাখার ইতিহাস ঠিক সেভাবে সংরক্ষণ করা হবে যখন আপনি এটি ট্যাগ করেছিলেন।


11
আমি একজন গিট নবাগত, কিন্তু এটি চেষ্টা করে, আমি মনে করি শাখাটি পুনরুদ্ধার করার জন্য সঠিক কমান্ডটি হ'ল:git checkout -b <branchname> archive/<branchname>
স্টিভ

6
এই ক্ষেত্রে কোনও অবজেক্ট-ট্যাগ ব্যবহার না করার কোনও কারণ আছে কি? কারা শাখাটি সংরক্ষণাগারভুক্ত হয়েছে এবং কখন আকর্ষণীয় হতে পারে তা দেখতে সক্ষম হওয়া।
গ্রেগরি জোসেফ

7
@ গ্রাগোরিজোসেফ: এটি একটি তথাকথিত "এনোটেটেড ট্যাগ"। এবং হ্যাঁ, এটি ব্যবহার করে অনেক বোঝা যায়, আমি বলব।
onnodb

22
ছোট্ট দ্রষ্টব্য, আপনি সম্ভবত branch -Dযেহেতু এটি চাইছেন এটি পুরোপুরি একত্রীকরণ না হওয়ার কারণ আপনি যদি এটি এইভাবে সংরক্ষণাগারটি
রাখেন

5
খুব সুন্দর. ব্যাখ্যা সহ একটি সম্পূর্ণ টিউটোরিয়াল এখানে
গুয়ালনি

123

জেরেমির উত্তর নীতিগতভাবে সঠিক, তবে আইএমএইচও তিনি যে আদেশগুলি নির্দিষ্ট করেছেন তা বেশ সঠিক নয়।

এখানে শাখাটি চেকআউট না করে কোনও ট্যাগগুলিতে কোনও শাখা সংরক্ষণাগারভুক্ত করবেন (এবং, সুতরাং, আপনি you শাখাটি মোছার আগে অন্য কোনও শাখায় চেকআউট না করে):

> git tag archive/<branchname> <branchname>
> git branch -D <branchname>

এবং এখানে কিভাবে একটি শাখা পুনরুদ্ধার করবেন:

> git checkout -b <branchname> archive/<branchname>

18
আমার ধারণা আপনার কাছে এখনও পর্যাপ্ত পয়েন্ট নেই তবে আপনি যদি বিদ্যমান উত্তরটি সম্পাদনা করতে চান তবে ভাল হবে - +1 যাইহোক :)
jkp

5
@jkp অন্যান্য ব্যবহারকারীর কোড এবং কমান্ডগুলি সম্পাদনা করার বিষয়টি সাধারণত নষ্ট হয় কারণ গিট কমান্ডের সূক্ষ্ম পরিবর্তনগুলি বিভিন্নভাবে মারাত্মকভাবে বিভিন্ন কাজ করতে পারে এবং মূল লেখক কেন তারা কিছু লিখেছেন তা আপনি বুঝতে পারেন না। আপনার নিজের উত্তর দেওয়া বা একটি মন্তব্য করা ভাল।
ড্যান বেচার্ড

বা তাত্পর্যপূর্ণভাবে ভিন্ন ভিন্ন জিনিসের চেয়েও খারাপ, কমান্ড বা কোডের একটি সূক্ষ্ম পরিবর্তন সূক্ষ্মভাবে বিভিন্ন ফলাফলের দিকে নিয়ে যেতে পারে, যা খুঁজে পাওয়া সত্যিই কঠিন হতে পারে, আমি একটি মন্তব্য হিসাবে রেখে যেতে পরামর্শ দেব যাতে উত্তরের পোস্টার নিজের সম্পাদনা করতে বা প্রতিক্রিয়া জানাতে পারে একটি পাল্টা দাবী সহ সম্ভাব্য বিভিন্ন ফলাফল (যা এই জাতীয় পাল্টা দাবি বরং সাধারণ) উল্লেখ করে
নিকোলাস পিপিটোন

22

হ্যাঁ, আপনি কিছু অ-মানক উপসর্গ ব্যবহার করে একটি রেফ তৈরি করতে পারেন git update-ref। যেমন

  • শাখা সংরক্ষণাগার: git update-ref refs/archive/old-topic topic && git branch -D topic
  • শাখাটি পুনরুদ্ধার করুন (যদি প্রয়োজন হয়): git branch topic refs/archive/old-topic

অ-মানক উপসর্গ সহ (এখানে refs/archive) স্বাভাবিকভাবে প্রদর্শিত হবে না git branch, git logনাও git tag। তবুও, আপনি তাদের তালিকাভুক্ত করতে পারেন git for-each-ref

আমি নিম্নলিখিত এলিয়াস ব্যবহার করছি:

[alias]
    add-archive = "!git update-ref refs/archive/$(date '+%Y%m%d-%s')"
    list-archive = for-each-ref --sort=-authordate --format='%(refname) %(objectname:short) %(contents:subject)' refs/archive/
    rem = !git add-archive
    lsrem = !git list-archive

এছাড়াও, আপনি চাইতে পারেন কনফিগার রিমোটের মত push = +refs/archive/*:refs/archive/*ধাক্কা স্বয়ংক্রিয়ভাবে সংরক্ষন শাখা (বা git push origin refs/archive/*:refs/archive/*এক-শটের জন্য)।

আরেকটি উপায় হ'ল শাখা মোছার আগে কোথাও SHA1 লিখে রাখা, তবে এর সীমাবদ্ধতা রয়েছে। কোনও রেফ ছাড়াই কমিটসগুলি 3 মাস পরে (বা রিফ্লগ ছাড়াই কয়েক সপ্তাহ) জিসি'ড করা হবে , ম্যানুয়ালটি ছেড়ে দিন git gc --prune। রেফ দ্বারা চিহ্নিত নির্দেশাবলী জিসি থেকে নিরাপদ।

সম্পাদনা করুন: @ap দ্বারা একই ধারণার একটি পার্ল বাস্তবায়ন পাওয়া গেছে :git-attic

সম্পাদনা করুন Edit 2: একটি ব্লগ পোস্ট খুঁজে পেয়েছে যেখানে Gitster নিজে একই কৌশল ব্যবহার করে।


3
দুর্দান্ত, এই থ্রেডের প্রত্যেককে বাদ দিয়ে আপনি আসলে প্রশ্নের উত্তর দিয়েছেন।
tzrlk

20

রিমোটের পরিবর্তনগুলি প্রতিবিম্বিত করতে স্টিভের উত্তরকে প্রসারিত করেছিলাম

 git tag archive/<branchname> <branchname>
 git branch -D <branchname>
 git branch -d -r origin/<branchname>
 git push --tags
 git push origin :<branchname>

রিমোট থেকে পুনরুদ্ধার করতে, এই প্রশ্নটি দেখুন


18

আপনি অন্য ভাণ্ডারে শাখা সংরক্ষণাগারভুক্ত করতে পারেন। বেশ মার্জিত নয়, তবে আমি বলব এটি একটি কার্যকর বিকল্প।

git push git://yourthing.com/myproject-archive-branches.git yourbranch
git branch -d yourbranch

4
আপনি git-bundleপৃথক সংগ্রহস্থলের পরিবর্তে তৈরি করতে পারেন ।
জাকুব নারেবস্কি

9

এটির জন্য একটি নাম এখানে রয়েছে:

arc    = "! f() { git tag archive/$1 $1 && git branch -D $1;}; f"

এটি এর মতো যুক্ত করুন:

git config --global alias.arc '! f() { git tag archive/$1 $1 && git branch -D $1;}; f'

মনে রাখবেন git archiveইতিমধ্যে কমান্ড রয়েছে সুতরাং আপনি archiveকোনও উপাধির নাম হিসাবে ব্যবহার করতে পারবেন না ।

এছাড়াও 'সংরক্ষণাগারভুক্ত' শাখার তালিকা দেখতে আপনি নামটি সংজ্ঞায়িত করতে পারেন:

arcl   = "! f() { git tag | grep '^archive/';}; f"

উপনাম যুক্ত সম্পর্কে


3
গিটের নতুন সংস্করণগুলির সাথে ( এখানে প্রস্তাবিত হিসাবে ), এই উপনামটি সম্পূর্ণতা দেয়:!git tag archive/$1 $1 && git branch -D
অভাব রয়েছে

5

সংরক্ষণাগারযুক্ত শাখাগুলি আড়াল করতে আমি নিম্নলিখিত উপাত্তগুলি ব্যবহার করছি:

[alias]
    br = branch --no-merge master # show only branches not merged into master
    bra = branch                  # show all branches

সুতরাং git brসক্রিয়ভাবে বিকাশিত শাখা git braদেখাতে এবং "সংরক্ষণাগারভুক্ত" শাখাসহ সমস্ত শাখা দেখানো ।


5
কোনও শাখা মাস্টারের সাথে একীভূত হয়েছে কিনা তার সংরক্ষণাগার অবস্থার সাথে কোনও সম্পর্ক নেই। উদাহরণস্বরূপ, আমার দেব দলে আমাদের কয়েকটি শাখা রয়েছে যা বিশেষত স্টাফ পরীক্ষার জন্য তৈরি করা হয়েছিল। আমরা সেই শাখাগুলি আমাদের সংরক্ষণাগারে রাখতে চাই, তবে আমরা অবশ্যই এগুলিকে মাস্টার হিসাবে মার্জ করতে চাই না।
বার্ট

4

আমি শাখা সংরক্ষণাগার না। অন্য উপায় রাখুন, শাখাগুলি তাদের সংরক্ষণাগারভুক্ত হয়। আপনি যা চান তা হ'ল প্রত্নতাত্ত্বিকদের প্রাসঙ্গিক তথ্য নির্ভরযোগ্য উপায়ে পাওয়া যাবে। তারা নির্ভর করে যে তারা প্রতিদিনের উন্নয়নে সহায়তা করে এবং কাজ শেষ করার প্রক্রিয়াতে কোনও অতিরিক্ত পদক্ষেপ যোগ করে না। অর্থাৎ, আমি বিশ্বাস করি না যে লোকেরা কোনও শাখার সাথে কাজ শেষ করার পরে ট্যাগ যুক্ত করা মনে রাখবে।

এখানে দুটি সহজ পদক্ষেপ যা প্রত্নতত্ত্ব এবং বিকাশকে ব্যাপকভাবে সহায়তা করবে ।

  1. একটি সাধারণ নামকরণ কনভেনশনটি ব্যবহার করে ইস্যু ট্র্যাকারের একটি সম্পর্কিত ইস্যুর সাথে প্রতিটি টাস্ক ব্রাঞ্চকে লিঙ্ক করুন
  2. git merge --no-ffটাস্ক শাখাগুলি মার্জ করার জন্য সর্বদা ব্যবহার করুন ; আপনি যে একীভূত প্রতিশ্রুতিবদ্ধ এবং ইতিহাস বুদ্বুদ চান, এমনকি শুধুমাত্র একটি প্রতিশ্রুতি জন্য।

এটাই. কেন? কারণ একটি কোড প্রত্নতত্ত্ববিদ হিসাবে, খুব কমই আমি কোনও শাখায় কী কাজ করা হয়েছিল তা জানতে চেয়ে শুরু করি না। আরও প্রায়শই এটি কেন সমস্ত চিৎকারে নয়টি হেল কোডটি এইভাবে লেখা হয় ?!আমার কোডটি পরিবর্তন করতে হবে তবে এর কিছু অদ্ভুত বৈশিষ্ট্য রয়েছে এবং গুরুত্বপূর্ণ কিছু ভঙ্গ করতে এড়াতে আমার এগুলি ধাঁধা দিতে হবে।

পরবর্তী পদক্ষেপটি git blameসম্পর্কিত কমিটগুলি অনুসন্ধান করা এবং তারপরে আশা করি লগ বার্তাটি ব্যাখ্যাযোগ্য n যদি আমাকে আরও গভীর খনন করা দরকার হয় তবে আমি কোনও শাখায় কাজটি করা হয়েছে কিনা তা খুঁজে বের করে পুরো শাখাটি (ইস্যু ট্র্যাকারটিতে এর ভাষ্য সহ) পড়ব।

git blameকমিট এক্সওয়াইজেডের পয়েন্টগুলি বলি । আমি একটি গিট ইতিহাস ব্রাউজার খুলেছি (গিটক, গিটএক্স git log --decorate --graph, ইত্যাদি ...), এক্সওয়াইজেড খুঁজে পেতে এবং দেখুন ...

AA - BB - CC - DD - EE - FF - GG - II ...
     \                       /
      QQ - UU - XYZ - JJ - MM

আমার শাখা আছে! আমি জানি কিউকিউ, ইউইউ, এক্সওয়াইজেড, জেজে এবং এমএম সমস্ত একই শাখার অংশ এবং বিশদের জন্য আমার তাদের লগ বার্তাগুলি দেখে নেওয়া উচিত। আমি জানি জিজি হ'ল মার্জ কমিট হবে এবং সেই শাখার নাম থাকবে যা আশাবাদী ট্র্যাকারের কোনও সমস্যার সাথে জড়িত।

যদি কোনও কারণে, আমি একটি পুরাতন শাখা খুঁজতে চাই যা আমি চালাতে পারি git logএবং মার্জ কমিটে শাখার নাম অনুসন্ধান করতে পারি । এটি খুব বড় সংগ্রহস্থলীতেও যথেষ্ট দ্রুত।

আমি যখন বলি যে শাখাগুলি তাদের সংরক্ষণাগার করে।

প্রতিটি শাখা ট্যাগিং কাজ সম্পন্ন করার জন্য অপ্রয়োজনীয় কাজ যুক্ত করে (একটি সমালোচনা প্রক্রিয়া যা নির্মমভাবে প্রবাহিত করা উচিত), শত তালিকায় কেবলমাত্র খুব কার্যকরীভাবে কার্যকর ট্যাগগুলির সাথে তালিকার মাড়ি (পারফরম্যান্সের কথা বলছে না, তবে মানুষের পাঠযোগ্যতার) রয়েছে) এমনকি প্রত্নতাত্ত্বিক জন্য খুব দরকারী।


2
তবে বিশৃঙ্খলার কী হবে? সম্ভবত যদি 10 ঘন গজ ময়লার নীচে পুরানো শাখাগুলি আড়াল করার কোনও উপায় ছিল।
বিভিজে

1
এটি দরকারী, তবে এটি নিমজ্জিত শাখাগুলির ক্ষেত্রে প্রযোজ্য নয়। কখনও কখনও একটি শাখায় একটি পরীক্ষা করা হয়েছিল এবং আপনি যদি বিষয়বস্তু পরে কিছুটা কার্যকর হয়ে যায় সে ক্ষেত্রে আপনি রাখতে চান।
নীল মেহেহে

1
@ বিভিজে আমার ধারণা এই উত্তরটি আপনাকে সর্বদা মার্জ হওয়া শাখাগুলি মুছে ফেলার পরামর্শ দিচ্ছে, কারণ আপনি সর্বদা মার্জ কমিটের মাধ্যমে তাদের কাছে ফিরে যেতে পারেন। আমি এটার সাথে একমত.
নীল মেহেহে

@ নীলমায়হে হ্যাঁ, আমার প্রায় 10 টি ডুবে থাকা শাখা নিজেই খোলা আছে। প্রত্যেকটি একটি উন্মুক্ত কার্যের সাথে যুক্ত যাতে আমি মনে করি এটি আমি কী করছিলাম। আমি হয় তাদের সাথে কিছু করব, বা তারা এত পুরানো হয়ে যাবে যে তারা আর প্রাসঙ্গিক নয় এবং আমি সেগুলি মুছে ফেলব। আমি "আমার পরে এটি প্রয়োজন হতে পারে" শাখাগুলিতে ডুবে যাওয়া একটি প্রকল্পে কাজ করেছি যাতে আমরা কী করছিলাম তা খুব কমই দেখতে পেলাম। কিছু ডেভসকে নিজের পরে পরিষ্কার না করানো সত্যই এটি একটি অজুহাত ছিল। কিছুটা দূরে থাকা ভাল, তবে এটি নিয়ন্ত্রণ থেকে বেরিয়ে আসতে দেবেন না।
শোওয়ার্ন

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

2

আমার পদ্ধতির সমস্ত শাখাগুলির নতুন নামকরণ যা আমি "ট্র্যাশ_" উপসর্গের সাথে যত্ন করি না, তারপরে ব্যবহার করুন:

git branch | grep -v trash

(একটি শেল কী বাঁধাই সহ)

সক্রিয় শাখার রঙ ধরে রাখার জন্য, একটির প্রয়োজন হবে:

git branch --color=always | grep --color=never --invert-match trash

2
যদি শাখাগুলির নাম পরিবর্তন করা হয়, আপনি এগুলি পাশাপাশি একটি নেমস্পেসে রাখতে পারেন "সংরক্ষণাগার /"
কি্নিল

1

আপনি এমন স্ক্রিপ্ট ব্যবহার করতে পারেন যা আপনার জন্য শাখা সংরক্ষণাগারভুক্ত করবে

archbranch

এটি আপনার জন্য উপসর্গ সংরক্ষণাগার দিয়ে একটি ট্যাগ তৈরি করে / এবং তারপরে শাখাটি মুছে দেয়। আপনি কোডটি ব্যবহারের আগে তবে চেক করুন।


ব্যবহার - $/your/location/of/script/archbranch [branchname] [defaultbranch]

আপনি যদি স্ক্রিপ্টটি লোকেশন না লিখে চালনা করতে চান তবে এটি আপনার পথে যুক্ত করুন

তারপরে আপনি এটিকে কল করতে পারেন

$ archbranch [branchname] [defaultbranch]

[defaultbranch]শাখা এটি যখন সংরক্ষণ সম্পন্ন করা হয় যেতে হবে। রঙিন কোডিংয়ের সাথে কিছু সমস্যা আছে তবে অন্যান্য এটির কাজ করা উচিত। আমি এটি দীর্ঘদিন ধরে প্রকল্পগুলিতে ব্যবহার করে আসছি তবে এটি এখনও বিকাশের অধীনে রয়েছে।


1
স্ট্যাক ওভারফ্লো সহায়তা প্রতি আপনার পণ্যটির সাথে আপনার অনুমোদিততা প্রকাশ করতে হবে।
লিটলববি টেবিলস - এউ প্রত্যাহার করুন

ওহ, দুঃখিত, জানা ছিল না। আমি চিত্রনাট্যের লেখক।
বনেজাকা

0

আমি কখনও কখনও নীচের হিসাবে শাখা সংরক্ষণাগার:

  1. প্যাচ ফাইলগুলি তৈরি করুন, উদাহরণস্বরূপ format-patch <branchName> <firstHash>^..<lastHash>(ব্যবহার করে ফার্স্টহ্যাশ এবং লাস্টহ্যাশ পান git log <branchName>
  2. উত্পন্ন প্যাচ ফাইলগুলি একটি ফাইল সার্ভারে ডিরেক্টরিতে সরান।
  3. শাখা মুছুন, যেমন, git branch -D <branchName>

প্যাচটি "প্রয়োগ করুন" যখন আপনাকে আবার শাখা ব্যবহার করতে হবে; তবে, প্যাচ ফাইলগুলি প্রয়োগ করা (দেখুন git am) লক্ষ্য শাখার অবস্থার উপর নির্ভর করে চ্যালেঞ্জ হতে পারে। অধিকতর, এই পদ্ধতির শাখার প্রতিশ্রুতিগুলি আবর্জনা সংগ্রহের অনুমতি দেওয়া এবং আপনার রেপোতে স্থান সংরক্ষণের সুবিধা রয়েছে।

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