หัวข้อนี้กล่าวถึง:
หากคุณจำต้นไม้ที่ว่างเปล่า sha1 คุณสามารถได้รับมันด้วย:
git hash-object -t tree /dev/null
หรือตามที่Ciro Santilliเสนอในความคิดเห็น :
printf '' | git hash-object --stdin -t tree
หรือตามที่เห็นที่นี่จากColin Schimmelfing :
git hash-object -t tree --stdin < /dev/null
ดังนั้นฉันเดาว่าจะปลอดภัยกว่าถ้ากำหนดตัวแปรโดยให้ผลลัพธ์ของคำสั่งนั้นเป็นต้นไม้ sha1 ว่างของคุณ (แทนที่จะใช้ "ค่าที่รู้จักกันดี")
หมายเหตุ: Git 2.25.1 (กุมภาพันธ์ 2020) เสนอในการกระทำ 9c8a294 :
empty_tree=$(git mktree </dev/null)
# Windows:
git mktree <NUL
และเพิ่ม:
ในฐานะบันทึกทางประวัติศาสตร์ฟังก์ชันนี้เรียกว่าrepo_read_object_file()
ได้รับการสอนต้นไม้ว่างใน346245a1bb ("hard-code the empty tree object", 2008-02-13, Git v1.5.5-rc0 - merge ) และฟังก์ชันที่รู้จักกันในขณะนี้ ตามที่oid_object_info()
ได้รับการสอนเรื่องต้นไม้ว่างในc4d9986f5f (" sha1_object_info
: ตรวจสอบcached_object
ร้านค้าด้วย", 2011-02-07, Git v1.7.4.1)
หมายเหตุคุณจะเห็นว่า SHA1 ปรากฏขึ้นในที่เก็บ GitHub บางส่วนเมื่อผู้เขียนต้องการให้คอมมิตแรกว่างเปล่า (ดูบล็อกโพสต์ " ฉันจะเริ่มต้นที่เก็บ Git ของฉันได้อย่างไร "):
$ 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 ที่แน่นอนของทรีว่างนั้น
คุณเพียงแค่ทำตามวิธีปฏิบัติที่ดีเริ่มต้น repo ของคุณด้วยการกระทำครั้งแรกที่ว่างเปล่า
ในการทำเช่นนั้น:
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 เฉพาะสำหรับ repo ของคุณชื่อผู้ใช้อีเมลวันที่สร้าง (หมายถึง 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
(และยังใช้งานได้กับ Windows ด้วยคำสั่งGnu บน Windows )
ตามความคิดเห็นด้านล่างการใช้git diff <commit> HEAD
สิ่งนี้จะแสดงไฟล์ทั้งหมดของคุณใน HEAD สาขาปัจจุบัน:
git diff --name-only 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD
หมายเหตุ: ค่าต้นไม้ว่างนั้นถูกกำหนดอย่างเป็นทางการในcache.h
.
#define EMPTY_TREE_SHA1_HEX \
"4b825dc642cb6eb9a060e54bf8d69288fbee4904"
ตั้งแต่ Git 2.16 (Q1 2018) มันถูกใช้ในโครงสร้างที่ไม่ได้เชื่อมโยงกับ (เท่านั้น) SHA1 อีกต่อไปดังที่เห็นในการกระทำ eb0ccfd :
สลับการค้นหาต้นไม้ที่ว่างเปล่าและหยดเพื่อใช้สิ่งที่เป็นนามธรรมของแฮช
สลับการใช้empty_tree_oid
และempty_blob_oid
ใช้current_hash
นามธรรมที่แสดงอัลกอริทึมแฮชปัจจุบันที่ใช้อยู่
ดูเพิ่มเติมได้ที่ " ทำไม Git ไม่ใช้ SHA ที่ทันสมัยกว่านี้ " คือSHA-2ตั้งแต่ Git 2.19 (ไตรมาส 3 ปี 2018)
ด้วย Git 2.25 (Q1 2020) การทดสอบกำลังเตรียมพร้อมสำหรับการเปลี่ยนแปลง SHA-2และเกี่ยวข้องกับทรีว่าง
ดูกระทำ fa26d5e , กระทำ cf02be8 , กระทำ 38ee26b , กระทำ 37ab8eb , กระทำ 0370b35 , กระทำ 0253e12 , กระทำ 45e2ef2 , กระทำ 79b0edc , กระทำ 840624f , กระทำ 32a6707 , กระทำ 440bf91 , กระทำ 0b408ca , กระทำ 2eabd38 (28 ตุลาคม 2019) และกระทำ 1bcef51 , กระทำ ecde49b (05 ต.ค. 2019) โดยbrian m. คาร์ลสัน ( bk2204
) .
(ผสานโดยJunio C Hamano - gitster
-ในการกระทำ 28014c1, 10 พ.ย. 2019)
t/oid-info
: เพิ่มต้นไม้ว่างและค่าหยดว่าง
ลงนามโดย: brian m. คาร์ลสัน
ในที่สุด testsuite จะเรียนรู้วิธีเรียกใช้โดยใช้อัลกอริทึมอื่นที่ไม่ใช่ SHA-1 ในการเตรียมการนี้ให้สอนกลุ่มtest_oid
ฟังก์ชันเกี่ยวกับการค้นหาหยดว่างและค่าต้นไม้ว่างเพื่อให้สามารถใช้งานได้
ดังนั้น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
" คือ4b825dc642cb6eb9a060e54bf8d69288fbee4904
ต้นไม้ว่างSHA1 " " ใหม่