Differences between revisions 1 and 2
Revision 1 as of 2009-01-25 15:27:46
Size: 6266
Comment: Translate first part of page to Thai.
Revision 2 as of 2009-05-19 19:30:55
Size: 6286
Editor: localhost
Comment: converted to 1.6 markup
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
''ตั้งแต่ Mercurial 0.9 มีการแก้ไขและเปลี่ยนไปใช้รูปแบบ revlog ใหม่: ดู [:ThaiRevlogNG]'' ''ตั้งแต่ Mercurial 0.9 มีการแก้ไขและเปลี่ยนไปใช้รูปแบบ revlog ใหม่: ดู [[ThaiRevlogNG]]''
Line 5: Line 5:
'''revlog''' เป็นโครงสร้างข้อมูลที่สำคัญที่สุดในเมอร์คิวเรียล เพราะมันเก็บประวัติทุกอย่างของแต่ละไฟล์ใน [:ThaiRepository:repository] '''revlog''' เป็นโครงสร้างข้อมูลที่สำคัญที่สุดในเมอร์คิวเรียล เพราะมันเก็บประวัติทุกอย่างของแต่ละไฟล์ใน [[ThaiRepository|repository]]
Line 12: Line 12:
 * [:ThaiNodeid:nodeid] ของเวอร์ชั่น  * [[ThaiNodeid|nodeid]] ของเวอร์ชั่น
Line 17: Line 17:
 * linkrev ที่ชี้ไปหา[:ThaiChangeSet:เซ็ตของการแก้ไข]ที่เกี่ยวข้อง  * linkrev ที่ชี้ไปหา[[ThaiChangeSet|เซ็ตของการแก้ไข]]ที่เกี่ยวข้อง
Line 45: Line 45:
นอกจากนั้น Revlog ยังถูกใช้เพื่อเก็บ[:ThaiManifest:มานิเฟสต์]และ[:ThaiChangeSet:เซ็ตของการแก้ไข]อีกด้วย นอกจากนั้น Revlog ยังถูกใช้เพื่อเก็บ[[ThaiManifest|มานิเฟสต์]]และ[[ThaiChangeSet|เซ็ตของการแก้ไข]]อีกด้วย
Line 50: Line 50:
The [http://www.selenic.com/hg/index.cgi/file/tip/contrib/ contrib directory] in the sources contains python scripts [http://www.selenic.com/hg/index.cgi/file/tip/contrib/dumprevlog dumprevlog] and [http://www.selenic.com/hg/index.cgi/file/tip/contrib/undumprevlog undumprevlog] (see changeset [http://www.selenic.com/hg/rev/ec5d77eb3431 ec5d77eb3431]). The [[http://www.selenic.com/hg/index.cgi/file/tip/contrib/|contrib directory]] in the sources contains python scripts [[http://www.selenic.com/hg/index.cgi/file/tip/contrib/dumprevlog|dumprevlog]] and [[http://www.selenic.com/hg/index.cgi/file/tip/contrib/undumprevlog|undumprevlog]] (see changeset [[http://www.selenic.com/hg/rev/ec5d77eb3431|ec5d77eb3431]]).
Line 54: Line 54:
 * ''"Towards a Better SCM: Revlog and Mercurial"'', Matt Mackall ([attachment:Presentations/ols-mercurial-paper.pdf PDF])
 * ''[http://hgbook.red-bean.com/hgbookch4.html#x8-640004 "Behind the scenes"]'' in ''[http://hgbook.red-bean.com/hgbook.html "Distributed revision control with Mercurial"]'', Bryan O’Sullivan
 * ''"Towards a Better SCM: Revlog and Mercurial"'', Matt Mackall ([[attachment:Presentations/ols-mercurial-paper.pdf|PDF]])
 * ''[[http://hgbook.red-bean.com/hgbookch4.html#x8-640004|"Behind the scenes"]]'' in ''[[http://hgbook.red-bean.com/hgbook.html|"Distributed revision control with Mercurial"]]'', Bryan O’Sullivan
Line 57: Line 57:
ลองดู: ["Presentations"] ลองดู: [[Presentations]]

Revlog

ตั้งแต่ Mercurial 0.9 มีการแก้ไขและเปลี่ยนไปใช้รูปแบบ revlog ใหม่: ดู ThaiRevlogNG

revlog เป็นโครงสร้างข้อมูลที่สำคัญที่สุดในเมอร์คิวเรียล เพราะมันเก็บประวัติทุกอย่างของแต่ละไฟล์ใน repository เมอร์คิวเรียลจะทำการบีบอัดไฟล์ฉบับเต็มแต่ละเวอร์ชั่นและเก็บไว้หรืออาจจะเก็บเฉพาะความต่างระหว่างเวอร์ชั่นปัจจุบันกับเวอร์ชั่นก่อนหน้า (compressed delta) ใน revlog ก็ได้ โดยเมอร์คิวเรียลจะตัดสินใจว่าจะเก็บข้อมูลแบบไหนโดยดูขนาดของข้อมูลที่จะต้องใช้เพื่อสร้างไฟล์แต่ละเวอร์ชั่นขึ้นมา วิธีนี้ทำให้เมอร์คิวเรียลไม่ต้องดึงข้อมูลประวัติจำนวนมากเพื่อสร้างไฟล์เวอร์ชั่นใดเวอร์ชั่นหนึ่งขึ้นมา ไม่ว่าจะมีประวัติมากน้อยเท่าไรก็ตาม

การสร้างไฟล์แต่ละเวอร์ชั่นจะใช้การอ่านแค่ครั้งเดียวเท่านั้นถ้าเมอร์คิวเรียลรู้ว่าจะต้องอ่านที่ไหนและเมื่อไร เพราะฉะนั้น revlog แต่ละอันจะมีดัชนี เช่น .hg/store/data/somefile.i ซึ่งเก็บ record ขนาดคงที่สำหรับแต่ละเวอร์ชั่น โดย record ดังกล่าวนี้มีข้อมูล:

  • nodeid ของเวอร์ชั่น

  • nodeids ของบรรพบุรุษ
  • ขนาดของข้อมูลในเวอร์ชั่น
  • ตำแหน่งเริ่มต้นของข้อมูลใน revlog ที่จะบอกว่าควรเริ่มอ่านจากจุดไหน
  • เวอร์ชั่นฐานของ delta chain กรณีที่ต้องสร้างเวอร์ชั่นจากประวัติเก่า
  • linkrev ที่ชี้ไปหาเซ็ตของการแก้ไขที่เกี่ยวข้อง

นี่เป็นตัวอย่างคร่าวๆ:

$ hg debugindex .hg/store/data/README.i
   rev    offset  length   base linkrev nodeid       p1           p2
     0         0    1125      0       0 80b6e76643dc 000000000000 000000000000
     1      1125     268      0       1 d6f755337615 80b6e76643dc 000000000000
     2      1393      49      0      27 96d3ee574f69 d6f755337615 000000000000
     3      1442     349      0      63 8e5de3bb5d58 96d3ee574f69 000000000000
     4      1791      55      0      67 ed9a629889be 8e5de3bb5d58 000000000000
     5      1846     100      0      81 b7ac2f914f9b ed9a629889be 000000000000
     6      1946     405      0     160 1d528b9318aa b7ac2f914f9b 000000000000
     7      2351      39      0     176 2a612f851a95 1d528b9318aa 000000000000
     8      2390       0      0     178 95fdb2f5e08c 2a612f851a95 2a612f851a95
     9      2390     127      0     179 fc5dc12f851b 95fdb2f5e08c 000000000000
    10      2517       0      0     182 24104c3ccac4 fc5dc12f851b fc5dc12f851b
    11      2517     470      0     204 cc286a25cf37 24104c3ccac4 000000000000
    12      2987     346      0     205 ffe871632da6 cc286a25cf37 000000000000
...

ด้วยการอ่านไฟล์ดัชนีหนึ่งครั้งและการอ่าน revlog อีกหนึ่งครั้ง เมอร์คิวเรียลสามารถสร้างไฟล์เวอร์ชั่นใดๆก็ได้ใน repository โดยใช้เวลาที่ได้สัดส่วนกับขนาดของไฟล์นั้นๆ

เพราะฉะนั้นการเพิ่มเวอร์ชั่นใหม่จะต้องใช้การอ่านแค่ O(1) และข้อมูลใน revlogs และดัชนีจะมีแต่เพิ่มขึ้นเท่านั้น (จะไม่มีการลบข้อมูลจาก revlog และดัชนี)

นอกจากนั้น Revlog ยังถูกใช้เพื่อเก็บมานิเฟสต์และเซ็ตของการแก้ไขอีกด้วย

ข้อมูลที่เกี่ยวข้อง

The contrib directory in the sources contains python scripts dumprevlog and undumprevlog (see changeset ec5d77eb3431).

แหล่งอ้างอิง

ลองดู: Presentations


CategoryInternals CategoryThai

ThaiRevlog (last edited 2012-02-24 16:27:43 by WagnerBruna)