কোনও প্রদত্ত কোডবেসকে স্বতন্ত্রভাবে পরিবর্তন চিহ্নিত করতে * সাধারণত * গিট শে এর কত অংশ বিবেচনা করা হয়?


212

যদি আপনি নির্মাণ করতে যাচ্ছেন, বলুন, একটি ডিরেক্টরি কাঠামো যেখানে গিটার সংগ্রহস্থলে প্রতিশ্রুতিবদ্ধ হওয়ার জন্য ডিরেক্টরিটির নামকরণ করা হয়েছে এবং আপনি এটি চান যাতে আপনার চোখের রক্তক্ষরণ না হয়, তবে এটি যথেষ্ট সংক্ষিপ্ত হতে পারে যে এটির সংঘর্ষের সুযোগ নগণ্য হবে, এসএএচএ স্ট্রিংয়ের সাধারণত কতটা প্রয়োজন?

আসুন আমি এই পরিবর্তনটি স্বতন্ত্রভাবে সনাক্ত করতে চাই তা বলুন: https://github.com/wycats/handlebars.js/commit/e62999f9ece7d9218b9768a908f8df9c11d7e920

আমি প্রথম চারটি অক্ষরের চেয়ে কম ব্যবহার করতে পারি: https://github.com/wycats/handlebars.js/commit/e629

তবে আমি মনে করি এটি ঝুঁকিপূর্ণ হবে। তবে একটি কোডবেসকে সুম করা যা কয়েক বছর ধরে, 30k পরিবর্তন হতে পারে, আমি 8 টি অক্ষর ব্যবহার করলে সংঘর্ষের সম্ভাবনা কত? 12? এমন একটি সংখ্যা রয়েছে যা সাধারণত এই ধরণের জিনিসটির জন্য গ্রহণযোগ্য বলে মনে করা হয়?


সম্পর্কিত: stackoverflow.com/questions/32405922/...
jub0bs

উত্তর:


230

প্রো গিট বইয়ের 7 তম অধ্যায়ে এই প্রশ্নের উত্তরটি দেওয়া হয়েছে :

সাধারণত আট থেকে দশটি অক্ষর কোনও প্রকল্পের মধ্যে স্বতন্ত্র হওয়ার জন্য যথেষ্ট। লিনাক্স কার্নেলের বৃহত্তম গিট প্রকল্পগুলির মধ্যে একটি অনন্য থাকার জন্য সম্ভাব্য 40 টির মধ্যে 12 টি অক্ষরের প্রয়োজন শুরু হয়েছে।

একটি সংক্ষিপ্ত SHA এর জন্য 7 ডিজিটগুলি গিট ডিফল্ট, তাই বেশিরভাগ প্রকল্পের জন্য এটি ঠিক fine কার্নেল দলটি কয়েক বার তাদের সংখ্যা বাড়িয়েছে, যেমনটি উল্লেখ করা হয়েছে, কারণ তাদের কয়েক লক্ষ কমিট রয়েছে। সুতরাং আপনার 30k ডলার কমিট করার জন্য, 8 বা 10 সংখ্যা পুরোপুরি ঠিক থাকতে হবে।


38
এছাড়াও মনে রাখবেন যে gitএটি যখন আসে তখন মোটামুটি স্মার্ট। আপনি সংক্ষিপ্ত বিবরণটি সংক্ষিপ্ত করতে পারেন, 4 বলুন এবং git
যতগুলি

31
তবে আরও খেয়াল করুন, এটি অবশ্যই গিটটি SHA প্রিন্ট করার মুহুর্তের জন্যই প্রযোজ্য। আপনি যদি সংক্ষেপিত এসএএএগুলি "সংরক্ষণ করুন" (লগ, ইমেল, আইএম, ইত্যাদিতে বলুন) এবং কমিটের বিষয়ে উল্লেখ করার জন্য পরে সেগুলি ব্যবহার করেন তবে সেগুলি আর অনন্য হতে পারে না! স্বাভাবিক দৈর্ঘ্যের জন্য unlikely-১২ অক্ষরের মতো অসম্ভব সম্ভাবনা থাকলেও আপনি যদি ৪ বা ৫ এর নিচে চলে যান এবং আপনি কয়েক দশ হাজার নতুন অবজেক্ট (বা অঙ্গীকারের ভিত্তিতে প্রতিশ্রুতিবদ্ধ) পান তবে এটি আপনাকে কামড়ানোর জন্য ফিরে আসতে পারে।
নেভিক রেহেনেল

140

দ্রষ্টব্য: আপনি git rev-parse --shortসবচেয়ে স্বল্পতম এবং তবুও অনন্য SHA1 জানতে চাইতে পারেন ।
" নিয়মিত হ্যাশ থেকে গিট শর্ট হ্যাশ পান " দেখুন

git rev-parse --short=4 921103db8259eb9de72f42db8b939895f5651489
92110

যেমন আপনি আমার উদাহরণে দেখতে পারেন SHA1 এর দৈর্ঘ্য 5 টি এমনকি আমি 4 এর দৈর্ঘ্য নির্দিষ্ট করে থাকলেও।


বড় রেপোসের জন্য , ২০১০ সাল থেকে enough যথেষ্ট নয়, এবং লিনাস টরভাল্ডস নিজেই dce9648 প্রতিশ্রুতিবদ্ধ (গিট 1.7.4.4, অক্টোবর 2010):

7 এর ডিফল্টটি গিট বিকাশের মোটামুটি প্রথম থেকেই আসে, যখন সাতটি হেক্স সংখ্যা অনেক বেশি ছিল (এটি প্রায় 250+ মিলিয়ন হ্যাশ মানকে অন্তর্ভুক্ত করে)।
তারপরে আমি ভেবেছিলাম যে 65 কে রিভিশনগুলি অনেক বেশি ছিল (এটি আমরা বিকে তে আঘাত করতে যাচ্ছিলাম), এবং প্রতিটি সংশোধন প্রায় 5-10 নতুন অবজেক্ট বা তাই হতে পারে, তাই মিলিয়ন অবজেক্ট একটি বিশাল সংখ্যা ছিল।

(বিকে = বিটকিপার)

আজকাল, কার্নেলটি এমনকি সবচেয়ে বড় গিট প্রকল্প নয়, এমনকি কার্নেলের প্রায় ২২০ কে পুনর্বিবেচনা রয়েছে ( বিকে গাছের তুলনায় আরও বড় আকারের) এবং আমরা দুই মিলিয়ন অবজেক্টের কাছে পৌঁছে যাচ্ছি।
এই মুহুর্তে, সাতটি হেক্স অঙ্কগুলি এখনও তাদের বেশিরভাগের জন্যই অনন্য, তবে আমরা যখন বস্তুর সংখ্যা এবং হ্যাশের আকারের মধ্যে মাত্রার দুটি পার্থক্যের মাত্র দুটি আদেশের কথা বলছি তখন কাটা হ্যাশ মানগুলির সংঘর্ষ হবে
এটি এখন অবাস্তব কাছেও বেশি নয় - এটি সর্বদা ঘটে।

আমরা উভয় ডিফল্ট abbrev যে অবাস্তব ছোট ছিল বৃদ্ধি, should এবং মানুষ Git কনফিগ ফাইলে প্রতি প্রকল্পের তাদের নিজস্ব ডিফল্ট সেট জন্য একটি উপায় যোগ

core.abbrev

দৈর্ঘ্যের অবজেক্টের নাম সংক্ষেপিত হয় সেট করুন।
যদি অনির্দিষ্ট করা হয়, অনেক কমান্ড সংক্ষিপ্ত 7 টি হেক্সডিজিটকে সংক্ষিপ্ত করে, যা সংক্ষিপ্ত অবজেক্ট নামগুলির পক্ষে পর্যাপ্ত দীর্ঘ সময়ের জন্য অনন্য থাকতে পারে না।

environment.c:

int minimum_abbrev = 4, default_abbrev = 7;

দ্রষ্টব্য: মার্কো.এম দ্বারা নীচে মন্তব্য করা হয়েছে , কমিট a71f09f তে একই গিট 1.7.4.4 এ core.abbrevLengthনতুন নামকরণ করা core.abbrevহয়েছে

পুনরায় নামকরণ core.abbrevlengthকরুনcore.abbrev

এটি --abbrev=$nসর্বোপরি কমান্ড লাইন বিকল্পের সাথে সম্পর্কিত।


আরও সাম্প্রতিককালে, লিনাস যোগ e6c587c কমিট (গীত 2.11 জন্য, Q4 ই 2016):
(উল্লেখিত হিসাবে Matthieu মধ্যে Moy এর উত্তর )

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

বর্তমানে লিনাক্স কার্নেল প্রকল্পের জন্য 11 থেকে 12 হেক্সডিজিট প্রয়োজন, অন্যদিকে গিটের কাছে 10 টি হেক্সডিজিট প্রয়োজন যা তাদের কাছে থাকা বস্তুগুলি স্বতন্ত্ররূপে সনাক্ত করতে পারে, যখন অনেকগুলি ছোট প্রকল্প এখনও মূল 7-হেক্সডিজিট ডিফল্টের সাথে সূক্ষ্ম হতে পারে। এক-আকারের সমস্ত প্রকল্পে খাপ খায় না।

একটি প্রক্রিয়া প্রবর্তন করুন, যেখানে আমরা ডিফল্ট সেটিংসের সাথে কোনও অবজেক্টের নাম সংক্ষিপ্ত করতে এবং সংগ্রহস্থলের জন্য একটি বুদ্ধিমান ডিফল্ট নিয়ে আসা প্রথম অনুরোধের ভিত্তিতে সংগ্রহস্থলের অবজেক্টগুলির সংখ্যা অনুমান করি। প্রত্যাশার উপর ভিত্তি করে আমরা 2^(2N)প্রথম এন বিটগুলিতে সংক্ষিপ্ত অবজেক্টের নাম ব্যবহার করার সময় অবজেক্টগুলির সাথে একটি সংগ্রহস্থলগুলিতে সংঘর্ষের মুখোমুখি হতে দেখি, সংগ্রহস্থলের অবজেক্টের সংখ্যা কভার করার জন্য পর্যাপ্ত সংখ্যক হেক্সডিজিট ব্যবহার করুন।
আমরা সংক্ষিপ্ত নামের সাথে যুক্ত প্রতিটি হেক্সডিজিট (4-বিট) আমাদের সংগ্রহস্থলটিতে চারটি বার (2-বিট) অনেকগুলি বস্তু রাখতে সক্ষম করে।

দেখুন e6c587c কমিট দ্বারা (01 অক্টোবর 2016) লিনাস টোরভাল্ডস ( torvalds)
দেখুন কমিট 7b5b772 , কমিট 65acfea (01 অক্টোবর 2016) দ্বারা junio সি Hamano ( gitster)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে bb188d0 কমিট , 03 অক্টোবর 2016)

এই নতুন সম্পত্তিটির (SHA1 সংক্ষিপ্ত মানের জন্য যুক্তিযুক্ত ডিফল্ট অনুমান করা) গিটার কীভাবে মুক্তির জন্য তার নিজস্ব সংস্করণ নম্বর গণনা করবে তার সরাসরি প্রভাব রয়েছে ।


3
এই উত্তরটি একক ভাণ্ডারে দীর্ঘতম "সংক্ষিপ্ত" হ্যাশ কী তা যাচাই করার একটি উপায় সরবরাহ করে: স্ট্যাকওভারফ্লো.com
কাইল স্ট্র্যান্ড

1
লক্ষ্য করুন core.abbrevLengthথেকে নাম পরিবর্তন করা হয়েছে core.abbrev
marco.m

@ মার্কো.এম ধন্যবাদ আমি সেই অনুযায়ী উত্তর সংশোধন করেছি। এবং আমি গিট কমিটের সাথে লিঙ্ক করেছি যা সেই নতুন নামটির রেকর্ড করে core.abbrev
ভনসি

আমি কেবল এটিতে যুক্ত করব যে আপনি git rev-parse --short=10 --verify HEAD10 টি অক্ষর উত্পন্ন করতে চালাতে পারেন । আমরা ব্যবহার করেছি git log -1 --format=%h, তবে এটি কেবল 7 টি অক্ষর তৈরি করেছে এবং আমরা একটি সংঘর্ষ পেয়েছি।
গ্রেইয়াই

ব্যাখ্যার জন্য ধন্যবাদ, দস্তাবেজগুলি ( git-scm.com/docs/git-rev-parse ) বাসি।
আন্ড্রে ওয়ার্ল্যাং

36

এটি জন্মদিনের সমস্যা হিসাবে পরিচিত।

সম্ভাব্যতার জন্য 1/2 এর চেয়ে কম সংঘর্ষ হওয়ার সম্ভাবনা হিসাবে প্রায় সংখ্যক হতে পারে

পি ~ = (এন 2 ) / (2 মি)

যেখানে এন হ'ল আইটেমের সংখ্যা এবং এম প্রতিটি আইটেমের সম্ভাবনার সংখ্যা।

হেক্স স্ট্রিংয়ের সম্ভাবনার সংখ্যা 16 সি যেখানে সি অক্ষরের সংখ্যা।

সুতরাং 8 টি অক্ষর এবং 30 কে কমিট করে

30 কে 2 = 2 15

পি ~ = (ঢ 2 ) / (2m) ~ = ((2 15 ) 2 ) / (2 * 16 8 ) = 2 30 /2 33 = ⅛

এটি 12 টি অক্ষরে বৃদ্ধি করা

পি ~ = (ঢ 2 ) / (2m) ~ = ((2 15 ) 2 ) / (2 * 16 12 ) = 2 30 /2 49 = 2 -19


ঠিক আমি যে প্রশ্নটি সমাধান করার চেষ্টা করছিলাম, ধন্যবাদ! @ মেসার উত্তরে লিঙ্কযুক্ত সম্ভাব্যতা সারণীটিও সহায়ক।
কাইল চাদা

চমৎকার, আমাদের এর চেয়ে বেশি আর কিছু দরকার নেই, কেবল এটি কী তা নয় তা কীভাবে আসে তাও ব্যাখ্যা করুন ...
workplaylifecycle

13

এই প্রশ্নের উত্তর দেওয়া হয়েছে, তবে যার পিছনে গণিতের সন্ধান করছেন - যাকে জন্মদিনের সমস্যা ( উইকিপিডিয়া ) বলা হয়।

এটি বছরের একই দিনে জন্মগতভাবে এন গ্রুপের 2 জন ব্যক্তি বা 2 (বা আরও বেশি) লোকের থাকার সম্ভাবনা সম্পর্কে। যা 2 (বা আরও বেশি) গিটের সম্ভাব্যতার সাথে সমান, এটি এন দৈনিক এক্স এর দৈর্ঘ্যের একই হ্যাশ উপসর্গযুক্ত মোটামুটি করে rep

সম্ভাবনা টেবিল তাকান । উদাহরণস্বরূপ হ্যাশ হেক্স স্ট্রিংয়ের দৈর্ঘ্য 8 এর জন্য সংঘর্ষের সম্ভাবনা 1% এ পৌঁছেছে যখন সংগ্রহস্থলটিতে প্রায় 9300 আইটেম থাকে (গিট কমিট)। 110 000 কমিট করার জন্য সম্ভাব্যতা 75%। তবে আপনার যদি 12 এর দৈর্ঘ্যের হ্যাক হেক্স স্ট্রিং থাকে তবে 100 000 কমিটের মধ্যে সংঘর্ষের সম্ভাবনা 0.1% এর নীচে।


2

গিট সংস্করণ ২.১১ (বা সম্ভবত ২.১২?) একটি বৈশিষ্ট্য ধারণ করবে যা সংক্ষিপ্ত শনাক্তকারীগুলিতে ব্যবহৃত উদাহরণগুলির (উদাহরণস্বরূপ git log --oneline) প্রকল্পের আকারের সাথে মানিয়ে নেয়। আপনি একবার গিতের এইরকম সংস্করণ ব্যবহার করলে, আপনার প্রশ্নের উত্তর "গিট আপনাকে যে দৈর্ঘ্য দেয় তা চয়ন করুন git log --oneline, এটি যথেষ্ট নিরাপদ" হতে পারে।

আরও তথ্যের জন্য, "কোর.অব্রেভ" এর জন্য ডিফল্ট পরিবর্তন করা দেখুন ? গিট রেভ নিউজ সংস্করণ 20 এ আলোচনা করুন এবং bb188d00f7 কমিট করুন

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