গিটের অর্ধ-গোপন খালি গাছের বস্তু কি নির্ভরযোগ্য এবং কেন এটির জন্য কোনও প্রতীকী নাম নেই?


125

গিটের একটি সুপরিচিত, বা কমপক্ষে বাছাই করা খালি গাছ রয়েছে যার SHA1:

4b825dc642cb6eb9a060e54bf8d69288fbee4904

(আপনি এটিকে যে কোনও রেপোতে, এমনকি সদ্য নির্মিত একটি, git cat-file -tএবং এর সাথে দেখতে পাবেন git cat-file -p)।

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

git diff-treeকোনটি নমুনা হুকটি করে তার পক্ষে যুক্তি হিসাবে এটি আরও কার্যকর ।

আমি যা ভাবছি তা হ'ল

  1. এটি কতটা নির্ভরযোগ্য — অর্থাত্, ভবিষ্যতের কিছু সংস্করণে গিটের অবজেক্টটি কী নম্বরযুক্ত হবে না 4b825dc642cb6eb9a060e54bf8d69288fbee4904?
  2. খালি গাছের কোনও প্রতীকী নাম কেন নেই (বা আছে কি?)।

(প্রতীকী নাম তৈরির একটি দ্রুত এবং নোংরা উপায়টি হল SHA1 ,োকানো, উদাহরণস্বরূপ .git/NulltreeUnfortunately দুর্ভাগ্যক্রমে আপনাকে প্রতিটি রেপোর জন্য এটি করতে হবে sc স্ক্রিপ্টগুলিতে যাদু সংখ্যাটি রাখাই আরও ভাল মনে হয় I যাদু সংখ্যায়।)


3
কেবল হ্যাশটি মনে রাখার জন্য ;-) SHA1 ("ট্রি 0 \ 0") ব্যবহার করুন = 4b825dc642cb6eb9a060e54bf8d69288fbee4904 (\ 0 NUL চরিত্র)
টমাস

4
git hash-object -t tree /dev/null@ থমাস : পদ্ধতিটির (নীচে ভনসির উত্তর থেকে) হার্ড-কোডিং SHA-1 না করার সুবিধা রয়েছে, উদাহরণস্বরূপ, গিটারের কিছু ভবিষ্যতের সংস্করণ যদি SHA-2 এ যায়। (কখন হতে পারে আমি ভবিষ্যদ্বাণী করার চেষ্টা করতে যাচ্ছি না: :-)
মার্চুরিয়ালকে

কারণ হিসাবে আপনি ঠিক আছেন তবে এটি "অকেজো জ্ঞান" এর একটি ভাল অংশ এবং এটি অন্য কারও পক্ষে কোনও ক্ষেত্রে সহায়ক হতে পারে ?!
টমাস

2
@ থমাস: দেখে মনে হচ্ছে হ্যাশ অ্যালগরিদম পরিবর্তনটি প্রত্যাশার চেয়ে শীঘ্রই ঘটতে পারে । :-)
টোরিক

"গীত কিছু ভবিষ্যৎ সংস্করণ" কথা বলছেন, আমি মনে করি আপনি আমার 2012 উত্তর আমার সর্বশেষ (ডিসেম্বর 2017) সম্পাদনা আগ্রহী হতে হবে: stackoverflow.com/revisions/9766506/7
VonC

উত্তর:


104

এই থ্রেডে উল্লেখ করা হয়েছে:

আপনি যদি খালি গাছের শ 1 টি মনে না রাখেন তবে আপনি সর্বদা এটির মাধ্যমে এটি পেতে পারেন:

git hash-object -t tree /dev/null

বা, যেমন সিরো সান্তিলি মন্তব্যগুলিতে প্রস্তাব করেছেন :

printf '' | git hash-object --stdin -t tree

বা, এখানে যেমন দেখা গেছে , কলিন শিম্মফিলিং থেকে :

git hash-object -t tree --stdin < /dev/null

সুতরাং আমি অনুমান করি যে এই কমান্ডের ফলাফলটি আপনার খালি শ 1 গাছ হিসাবে (একটি "সুপরিচিত মান" এর উপর নির্ভর না করে) হিসাবে একটি ভেরিয়েবল সংজ্ঞায়িত করা নিরাপদ।

দ্রষ্টব্য: গিট 2.25.1 (ফেব্রুয়ারি 2020) 9c8a294 কমিটে প্রস্তাব করেছে :

empty_tree=$(git mktree </dev/null)
# Windows:
git mktree <NUL

এবং যোগ করেছে:

Noteতিহাসিক দ্রষ্টব্য হিসাবে, বর্তমানে পরিচিত ফাংশনটি repo_read_object_file()খালি গাছটি 346245a1bb ("হার্ড-কোড ফাঁকা গাছের বস্তু", ২০০৮-০২-১৩, গিট ভি ১.৫.৫-আরসি0 - মার্জ ) শেখানো হয়েছিল , এবং ফাংশনটি এখন পরিচিত যেমন c4d9986f5foid_object_info() এ ফাঁকা গাছ শেখানো হয়েছিল (" : স্টোরের পরীক্ষাও খুব", 2011-02-07, গিট ভি 1.7.4.1)। sha1_object_infocached_object


দ্রষ্টব্য, আপনি দেখবেন যে SHA1 কিছু গিটহাব রেপোতে পপ আপ করবে যখন লেখক তার প্রথম প্রতিশ্রুতি খালি রাখতে চান (" আমি কীভাবে আমার গিট সংগ্রহস্থল শুরু করব " ব্লগ পোস্ট দেখুন ):

$ GIT_AUTHOR_DATE="Thu, 01 Jan 1970 00:00:00 +0000" GIT_COMMITTER_DATE="Thu, 01 Jan 1970 00:00:00 +0000" git commit --allow-empty -m 'Initial commit'

তোমাকে দিবে:

খালি গাছ SHA1

(SHA1 গাছটি দেখুন?)

এমনকি খালি কমিটের উপরে আপনি আপনার বিদ্যমান ইতিহাসটি পুনরায় চালু করতে পারেন (" গিটটি দেখুন: প্রথম হিসাবে একটি প্রতিশ্রুতি কীভাবে সন্নিবেশ করা যায়, অন্য সমস্ত স্থানান্তরিত করবেন? ")

উভয় ক্ষেত্রেই আপনি সেই খালি গাছের সঠিক SHA1 মানের উপর নির্ভর করবেন না।
আপনি কেবল প্রথম শূন্য প্রতিশ্রুতি দিয়ে আপনার রেপো সূচনা করে একটি সেরা অনুশীলন অনুসরণ করেন ।


এটা করতে:

git init my_new_repo
cd my_new_repo
git config user.name username
git config user.email email@com

git commit --allow-empty -m "initial empty commit"

এটি আপনার রেপো, ব্যবহারকারীর নাম, ইমেল, তৈরির তারিখের সাথে সম্পর্কিত একটি SHA1 এর সাথে একটি প্রতিশ্রুতি উত্পন্ন করবে (অর্থ প্রতিশ্রুতির SHA1 নিজেই আলাদা হবে)।
কিন্তু সেই প্রতিশ্রুতি দ্বারা উল্লিখিত 4b825dc642cb6eb9a060e54bf8d69288fbee4904গাছটি হ'ল, খালি গাছ SHA1।

git log --pretty=raw

commit 9ed4ff9ac204f20f826ddacc3f85ef7186d6cc14
tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904      <====
author VonC <vonc@laposte.net> 1381232247 +0200
committer VonC <vonc@laposte.net> 1381232247 +0200

    initial empty commit

কেবল একটি প্রতিশ্রুতিবদ্ধ গাছ দেখানোর জন্য (কমিট ট্রি SHA1 প্রদর্শন করুন):

git show --pretty=format:%T 9ed4ff9ac204f20f826ddacc3f85ef7186d6cc14
4b825dc642cb6eb9a060e54bf8d69288fbee4904

যদি সেই প্রতিশ্রুতিবদ্ধ হয়, একটি খালি গাছ উল্লেখ করে, সত্যিই এটি আপনার প্রথম প্রতিশ্রুতি থাকে তবে আপনি খালি গাছটি SHA1 এর সাথে দেখাতে পারেন:

git log --pretty=format:%h --reverse | head -1 | xargs git show --pretty=format:%T
4b825dc642cb6eb9a060e54bf8d69288fbee4904

(এবং এটি এমনকি উইন্ডোতে উইন্ডো কমান্ডের সাথে গনু-র সাথেও কাজ করে )


নীচে মন্তব্য হিসাবে , ব্যবহার করে git diff <commit> HEAD, এটি আপনার সমস্ত ফাইলকে বর্তমান শাখার হেডে প্রদর্শন করবে:

git diff --name-only 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD

দ্রষ্টব্য: খালি গাছের মানটি আনুষ্ঠানিকভাবে সংজ্ঞায়িত করা আছে cache.h

#define EMPTY_TREE_SHA1_HEX \
    "4b825dc642cb6eb9a060e54bf8d69288fbee4904"

গিট 2.16 (কিউ 1 2018) থেকে, এটি এমন স্ট্রাকচারে ব্যবহৃত হয় যা কমিট eb0ccfd তে দেখা যায় (কেবল) SHA1 এর সাথে আর আবদ্ধ নয় :

হ্যাশ বিমূর্ততা ব্যবহার করতে খালি গাছ এবং ব্লব লুকআপগুলিতে স্যুইচ করুন

ব্যবহারের ক্ষেত্রে বর্তমান হ্যাশ অ্যালগরিদমকে উপস্থাপন করে এমন বিমূর্ততা ব্যবহার empty_tree_oidএবং empty_blob_oidব্যবহার করতে স্যুইচ করুন current_hash

" গিট আরও আধুনিক এসএইচএ ব্যবহার করে না কেন? " এ আরও দেখুন : এটি গিটার ২.১৯ (প্র 3 2018) থেকে শ্যা -2 ,


গিট 2.25 (কিউ 12020) দিয়ে, পরীক্ষাগুলি একটি SHA-2 স্থানান্তরের জন্য প্রস্তুতি নিচ্ছে এবং খালি গাছের সাথে জড়িত।

দেখুন fa26d5e কমিট , cf02be8 কমিট , 38ee26b কমিট , কমিট 37ab8eb , কমিট 0370b35 , কমিট 0253e12 , কমিট 45e2ef2 , 79b0edc কমিট , কমিট 840624f , কমিট 32a6707 , কমিট 440bf91 , 0b408ca কমিট , কমিট 2eabd38 (28 অক্টোবর 2019), এবং 1bcef51 কমিট , কমিট ecde49b (05 অক্টোবর 2019) ব্রায়ান মি। কার্লসন ( bk2204)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে 28014c1 কমিট, 10 নভেম্বর 2019)

t/oid-info: খালি গাছ এবং খালি ব্লব মান যুক্ত করুন

সাইন-অফ-বাই: ব্রায়ান মি। কার্লসন

পরীক্ষাগুলি শেষ পর্যন্ত কীভাবে SHA-1 ব্যতীত অন্য একটি অ্যালগরিদম ব্যবহার করে চালানো যায় তা শিখবে। এর প্রস্তুতিতে, test_oidফাংশনগুলির পরিবারকে শিখুন কীভাবে ফাঁকা ফাঁকা এবং খালি গাছের মূল্যগুলি সন্ধান করা যায় যাতে তারা ব্যবহার করতে পারে to

সুতরাং t/oid-info/hash-infoএখন অন্তর্ভুক্ত:

rawsz sha1:20
rawsz sha256:32

hexsz sha1:40
hexsz sha256:64

zero sha1:0000000000000000000000000000000000000000
zero sha256:0000000000000000000000000000000000000000000000000000000000000000

algo sha1:sha1
algo sha256:sha256

empty_blob sha1:e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
empty_blob sha256:473a0f4c3be8a93681a267e3b1e9a7dcda1185436fe141f7749120a303721813

empty_tree sha1:4b825dc642cb6eb9a060e54bf8d69288fbee4904
empty_tree sha256:6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321

SHA2 " 6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321" হ'ল নতুন SHA1 " 4b825dc642cb6eb9a060e54bf8d69288fbee4904" খালি গাছ।


@ টোরেক: আমি শূন্য গাছ SHA1 চিত্রিত করার জন্য প্রথম খালি প্রতিশ্রুতি দেওয়ার সর্বোত্তম অনুশীলনের কয়েকটি উদাহরণ যোগ করেছি।
ভোনসি

ঠিক আছে, লক্ষ্যগুলির মধ্যে একটি হ'ল git diff-treeআমি লিখছি এমন কিছু স্ক্রিপ্টগুলিতে যুক্তি হিসাবে "খালি গাছ" হ্যাশ ব্যবহার করা । রেপোতে প্রাথমিক শূন্য প্রতিশ্রুতি থাকার কোনও নিশ্চয়তা নেই। সুতরাং আমি কেবল ভাবছি যদি এই লিপিগুলি কোনও দিন শেষ হয়ে যায়।
টেরিক

1
আপনি পাস যদি -wকরতে git hash-object, এটি সংগ্রহস্থলের বিরুদ্ধে চালানো হচ্ছে বস্তুর তৈরি করব, এবং যে পুনঃ হবে সংগ্রহস্থলের আপনার বিরুদ্ধে চালাচ্ছেন ফাঁকা গাছ ছিল এটি আগের ভবিষ্যতে চলে যান।
jawawizard

আপনি যদি রিবেস ব্যবহার করে প্রথম প্রতিশ্রুতিবদ্ধতার আগে যেতে চান, আপনি গিট রিবেস
রুট

1
বা যদি আপনি /dev/nullprintf '' | git hash-object --stdin -t tree
পাইপগুলির যাদুটির পরিবর্তে যাদুটিকে

3

আমি হ্যাশটি আবিষ্কারের দুটি ভিন্ন উপায় সহ একটি ব্লগ পোস্ট লিখেছিলাম: http://colinschimmelfing.com/blog/gits-empty-tree/

যদি এটি কোনও কারণে কখনও পরিবর্তিত হয় তবে এটি সন্ধান করতে আপনি নীচের দুটি উপায় ব্যবহার করতে পারেন। তবে, .brcrc উপকরণ ইত্যাদিতে হ্যাশটি ব্যবহার করে আমি বেশ আত্মবিশ্বাসী বোধ করব এবং শীঘ্রই এটি কখনই পরিবর্তিত হবে বলে আমি মনে করি না। খুব কমপক্ষে এটি সম্ভবত গিটের একটি বড় মুক্তি হবে।

দুটি উপায় হ'ল:

  1. উপরের উত্তর: git hash-object -t tree --stdin < /dev/null
  2. কেবল একটি খালি রেপো প্রবেশ করানো এবং তারপরে git write-treeসেই নতুন রেপো চালানো - হ্যাশ গিট রাইট-ট্রি দ্বারা আউটপুট হবে।

কমান্ডটি চালানো –-stdinআমাকে fatal: Cannot open '–-stdin': No such file or directoryগিট 2.7.2 দিয়ে দেয় । যাইহোক, --stdinভনসির উত্তরের মতো না করে এটি চালানো হ্যাশটির মান দেয়
সিগি

এই উত্তরটি এখন খুব দরকারী নয় ব্লগ-পোস্টটি মারা গেছে। সুতরাং কেন আমরা সাধারণত এই উত্তরগুলি এসও-তে অনুমোদন করি না।
ফিলিপ হোয়াইট

1
@ ফিলিপওহাইটহাউস ব্লগ পোস্টটি মারা যায় নি, তবে যে কোনও ক্ষেত্রে আমি আমার উত্তরে দুটি উপায় অন্তর্ভুক্ত করেছি - আমি সম্মত হই যে এই দুটি উপায় না করে এটি উত্তম উত্তর হবে না।
ছদ্মবেশী

3

সংগ্রহশালা ইতিমধ্যে খালি না থাকলেও কীভাবে খালি গাছ কমিট তৈরি করা যায় তার উত্তর এখানে। https://stackoverflow.com/a/14623458/9361507

তবে আমি ট্যাগ করতে "খালি" পছন্দ করি তবে শাখা নয়। সহজ উপায়:

git tag empty $(git hash-object -t tree /dev/null)

কারণ ট্যাগটি বিনা প্রতিশ্রুতি ছাড়াই সরাসরি বৃক্ষ-ইশকে নির্দেশ করতে পারে। কার্যকারী গাছের সমস্ত ফাইল পাওয়ার জন্য:

git diff --name-only empty

বা স্ট্যাট সহ একই:

git diff --stat empty

সমস্ত ফাইল পৃথক হিসাবে:

git diff empty

সমস্ত ফাইলে সাদা স্থান পরীক্ষা করুন:

git diff --check empty

... তবে আপনার ট্যাগ তৈরিতে ম্যাজিক নম্বরটি ব্যবহার করা প্রশ্নটির খুব সামান্য বিষয়টির মধ্যেই ব্রাশ করছে ( ম্যাজিক নম্বর SHA-1 ব্যবহার করছে না )
রোমেনভ্যালারি

সত্য না. আমি গাছ-ইশ অবজেক্টের দিকে নির্দেশ করতে ট্যাগ ব্যবহার করেছি। এতক্ষণে এই গাছ-ইশকে SHA-1 দ্বারা সংজ্ঞায়িত করা হয়েছে, ভবিষ্যতে এটি পরিবর্তন করা যেতে পারে, উদাহরণস্বরূপ, SHA-256 এবং আরও কিছুতে (সংগ্রহস্থল স্থানান্তর সহ)। তবে ট্যাগ একই হবে। :) কোনও ট্যাগের প্রধান বৈশিষ্ট্যটি হ'ল অবজেক্টের দিকে নির্দেশ করা। কোনও ট্যাগ SHA-1 অভ্যন্তরীণভাবে বা অন্য কিছু ব্যবহার করতে পারে, এটি কেবল গিট ইন্টার্নালের বিষয়।
ওল্লেগ

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

আপনি যদি খালি গাছের হ্যাশ স্বয়ংক্রিয়ভাবে উত্পন্ন করার কোনও পদ্ধতির সাথে এটি মিশ্রিত করেন তবে আপনি এটি ভবিষ্যতের প্রমাণ করতে পারবেন (@ রোমাইনভ্যালারি অনুসারে)। তবে, যদি এটি আমার git rev-parseউপর নির্ভর করে তবে (নতুন) শূন্য গাছের হ্যাশ এবং (খ) নাল-কমিট হ্যাশ তৈরি করতে, নতুন পতাকা বা কীওয়ার্ড বা সেই লাইনের সাথে কিছু থাকবে something এই দুটিই স্ক্রিপ্টগুলিতে কার্যকর হবে এবং প্রস্তাবিত SHA-256 পরিবর্তনের বিরুদ্ধে রক্ষা করবে।
টোক 16: 24

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