CINXE.COM
Git - Objekti Git
<!DOCTYPE html> <html lang="sl"> <head> <meta charset='utf-8'> <meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible'> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Git - Objekti Git</title> <link href="/favicon.ico" rel='shortcut icon' type='image/x-icon'> <link rel="stylesheet" href="/application.min.css"> <script src="/js/modernizr.js"></script> <script src="/js/modernize.js"></script> </head> <body id="documentation"> <div class="inner"> <header> <a href="/"><img src="/images/logo@2x.png" width="110" height="46" alt="Git" /></a> <span id="tagline"></span> <script type="text/javascript"> const taglines = [ "fast-version-control", "everything-is-local", "distributed-even-if-your-workflow-isnt", "local-branching-on-the-cheap", "distributed-is-the-new-centralized" ]; var tagline = taglines[Math.floor(Math.random() * taglines.length)]; document.getElementById('tagline').innerHTML = '--' + tagline; </script> <form id="search" action="/search/results"> <input id="search-text" name="search" placeholder="Type / to search entire site…" autocomplete="off" type="text" /> </form> <div id="search-results"></div> </header> </div> <div class="inner"> <div id="content-wrapper"> <div tabindex="1" class="sidebar-btn"></div> <aside class="sidebar" id="sidebar"> <nav> <ul> <li> <a href="/about">About</a> <ul> </ul> </li> <li> <a href="/doc" class="active">Documentation</a> <ul class="expanded"> <li> <a href="/docs">Reference</a> </li> <li> <a href="/book" class="active">Book</a> </li> <li> <a href="/videos">Videos</a> </li> <li> <a href="/doc/ext">External Links</a> </li> </ul> </li> <li> <a href="/downloads">Downloads</a> <ul > <li> <a href="/downloads/guis">GUI Clients</a> </li> <li> <a href="/downloads/logos">Logos</a> </li> </ul> </li> <li> <a href="/community">Community</a> </li> </ul> <hr class="sidebar"> <p> This book is available in <a href="/book/en/v2/Git-Internals-Git-Objects">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Git%e2%80%99in-Daxili-%c4%b0%c5%9fl%c9%99ri-Git-Obyektl%c9%99ri">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg/v2/%d0%9f%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-B:-%d0%92%d0%b3%d1%80%d0%b0%d0%b6%d0%b4%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-Git-%d0%b2-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-Libgit2">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-Interna-Git-Objekte">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Los-entresijos-internos-de-Git-Los-objetos-Git">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Les-tripes-de-Git-Les-objets-de-Git">Français</a>,</td></tr> <tr><td><a href="/book/gr">Ελληνικά</a>,</td></tr> <tr><td><a href="/book/ja/v2/Git%e3%81%ae%e5%86%85%e5%81%b4-Git%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88">日本語</a>,</td></tr> <tr><td><a href="/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-Git-%ea%b0%9c%ec%b2%b4">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Git-Binnenwerk-Git-objecten">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/Git-%d0%b8%d0%b7%d0%bd%d1%83%d1%82%d1%80%d0%b8-%d0%9e%d0%b1%d1%8a%d0%b5%d0%ba%d1%82%d1%8b-Git">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Notranjost-Gita-Objekti-Git">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Mga-Panloob-ng-GIT-Git-Objects">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/Git-%d0%b7%d1%81%d0%b5%d1%80%d0%b5%d0%b4%d0%b8%d0%bd%d0%b8-%d0%9e%d0%b1%e2%80%99%d1%94%d0%ba%d1%82%d0%b8-Git">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/Git-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86-Git-%e5%af%b9%e8%b1%a1">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/Git-Internals-Git-Objects">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/%d0%92%d0%bd%d0%b0%d1%82%d1%80%d0%b5%d1%88%d0%bd%d0%be%d1%81%d1%82%d0%b0-%d0%bd%d0%b0-Git-Git-Objects">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Mechanizmy-wewn%c4%99trzne-w-Git-Obiekty-Gita">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%93%d0%b8%d1%82-%d0%b8%d0%b7%d0%bd%d1%83%d1%82%d1%80%d0%b0-%d0%93%d0%b8%d1%82-%d0%be%d0%b1%d1%98%d0%b5%d0%ba%d1%82%d0%b8">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Git-Internals-Git-Objects">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/Git-Internals-Git-Objects">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Git-Internals-Git-Objects">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/Git-Internals-Git-Objects" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Git-Internals-Git-Objects">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Git-Internals-Git-Objects">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Git-Internals-Git-Objects">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Objetos-do-Git">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Internos-do-Git-Git-Objects">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Git-Internals-Git-Objects">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Git-Nesneleri">Türkçe</a>.</td></tr> </table> </p> <hr class="sidebar"/> <p> The source of this book is <a href="https://github.com/progit/progit2-sl">hosted on GitHub.</a></br> Patches, suggestions and comments are welcome. </p> </nav> </aside> <div id="content"> <div id="book-chapters"> <a class="dropdown-trigger" id="book-chapters-trigger" data-panel-id="chapters-dropdown" href="#">Chapters ▾</a> <div class='dropdown-panel' id='chapters-dropdown'> <div class='three-column'> <div class="column-left"> <ol class='book-toc'> <li class='chapter'> <h2>1. <a href="/book/sl/v2/Za%c4%8detek-O-nadzoru-razli%c4%8dic">Začetek</a></h2> <ol> <li> 1.1 <a href="/book/sl/v2/Za%c4%8detek-O-nadzoru-razli%c4%8dic">O nadzoru različic</a> </li> <li> 1.2 <a href="/book/sl/v2/Za%c4%8detek-Kratka-zgodovina-Gita">Kratka zgodovina Gita</a> </li> <li> 1.3 <a href="/book/sl/v2/Za%c4%8detek-Kaj-je-Git%3F">Kaj je Git?</a> </li> <li> 1.4 <a href="/book/sl/v2/Za%c4%8detek-Ukazna-vrstica">Ukazna vrstica</a> </li> <li> 1.5 <a href="/book/sl/v2/Za%c4%8detek-Namestitev-Gita">Namestitev Gita</a> </li> <li> 1.6 <a href="/book/sl/v2/Za%c4%8detek-Prva-nastavitev-Gita">Prva nastavitev Gita</a> </li> <li> 1.7 <a href="/book/sl/v2/Za%c4%8detek-Pridobivanje-pomo%c4%8di">Pridobivanje pomoči</a> </li> <li> 1.8 <a href="/book/sl/v2/Za%c4%8detek-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/sl/v2/Osnove-Git-Pridobivanje-repozitorija-Git">Osnove Git</a></h2> <ol> <li> 2.1 <a href="/book/sl/v2/Osnove-Git-Pridobivanje-repozitorija-Git">Pridobivanje repozitorija Git</a> </li> <li> 2.2 <a href="/book/sl/v2/Osnove-Git-Snemanje-sprememb-v-repozitorij">Snemanje sprememb v repozitorij</a> </li> <li> 2.3 <a href="/book/sl/v2/Osnove-Git-Pregled-zgodovine-potrditev">Pregled zgodovine potrditev</a> </li> <li> 2.4 <a href="/book/sl/v2/Osnove-Git-Razveljavljanje-stvari">Razveljavljanje stvari</a> </li> <li> 2.5 <a href="/book/sl/v2/Osnove-Git-Delo-z-daljavami">Delo z daljavami</a> </li> <li> 2.6 <a href="/book/sl/v2/Osnove-Git-Ozna%c4%8devanje">Označevanje</a> </li> <li> 2.7 <a href="/book/sl/v2/Osnove-Git-Aliasi-Git">Aliasi Git</a> </li> <li> 2.8 <a href="/book/sl/v2/Osnove-Git-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/sl/v2/Veje-Git-Veje-na-kratko">Veje Git</a></h2> <ol> <li> 3.1 <a href="/book/sl/v2/Veje-Git-Veje-na-kratko">Veje na kratko</a> </li> <li> 3.2 <a href="/book/sl/v2/Veje-Git-Osnove-vej-in-zdru%c5%beevanja">Osnove vej in združevanja</a> </li> <li> 3.3 <a href="/book/sl/v2/Veje-Git-Upravljanje-vej">Upravljanje vej</a> </li> <li> 3.4 <a href="/book/sl/v2/Veje-Git-Poteki-dela-z-vejami">Poteki dela z vejami</a> </li> <li> 3.5 <a href="/book/sl/v2/Veje-Git-Oddaljene-veje">Oddaljene veje</a> </li> <li> 3.6 <a href="/book/sl/v2/Veje-Git-Ponovno-baziranje">Ponovno baziranje</a> </li> <li> 3.7 <a href="/book/sl/v2/Veje-Git-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/sl/v2/Git-na-stre%c5%beniku-Protokoli">Git na strežniku</a></h2> <ol> <li> 4.1 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Protokoli">Protokoli</a> </li> <li> 4.2 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Pridobitev-Gita-na-stre%c5%beniku">Pridobitev Gita na strežniku</a> </li> <li> 4.3 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Generiranje-va%c5%a1ih-javnih-klju%c4%8dev-SSH">Generiranje vaših javnih ključev SSH</a> </li> <li> 4.4 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Nastavitev-stre%c5%benika">Nastavitev strežnika</a> </li> <li> 4.5 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Prikriti-proces-Git">Prikriti proces Git</a> </li> <li> 4.6 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Pametni-HTTP">Pametni HTTP</a> </li> <li> 4.7 <a href="/book/sl/v2/Git-na-stre%c5%beniku-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/sl/v2/Git-na-stre%c5%beniku-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Mo%c5%benosti-gostovanja-pri-tretjih-ponudnikih">Možnosti gostovanja pri tretjih ponudnikih</a> </li> <li> 4.10 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/sl/v2/Porazdeljeni-Git-Porazdeljeni-poteki-dela">Porazdeljeni Git</a></h2> <ol> <li> 5.1 <a href="/book/sl/v2/Porazdeljeni-Git-Porazdeljeni-poteki-dela">Porazdeljeni poteki dela</a> </li> <li> 5.2 <a href="/book/sl/v2/Porazdeljeni-Git-Prispevek-k-projektu">Prispevek k projektu</a> </li> <li> 5.3 <a href="/book/sl/v2/Porazdeljeni-Git-Vzdr%c5%beevanje-projekta">Vzdrževanje projekta</a> </li> <li> 5.4 <a href="/book/sl/v2/Porazdeljeni-Git-Povzetek">Povzetek</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/sl/v2/GitHub-Namestitev-in-konfiguracija-ra%c4%8duna">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/sl/v2/GitHub-Namestitev-in-konfiguracija-ra%c4%8duna">Namestitev in konfiguracija računa</a> </li> <li> 6.2 <a href="/book/sl/v2/GitHub-Prispevek-k-projektu">Prispevek k projektu</a> </li> <li> 6.3 <a href="/book/sl/v2/GitHub-Vzdr%c5%beevanje-projekta">Vzdrževanje projekta</a> </li> <li> 6.4 <a href="/book/sl/v2/GitHub-Upravljanje-organizacije">Upravljanje organizacije</a> </li> <li> 6.5 <a href="/book/sl/v2/GitHub-Skriptni-GitHub">Skriptni GitHub</a> </li> <li> 6.6 <a href="/book/sl/v2/GitHub-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>7. <a href="/book/sl/v2/Orodja-Git-Izbira-revizije">Orodja Git</a></h2> <ol> <li> 7.1 <a href="/book/sl/v2/Orodja-Git-Izbira-revizije">Izbira revizije</a> </li> <li> 7.2 <a href="/book/sl/v2/Orodja-Git-Interaktivno-pripravljanje">Interaktivno pripravljanje</a> </li> <li> 7.3 <a href="/book/sl/v2/Orodja-Git-Shranjevanje-na-varno-angl-stashing-in-%c4%8di%c5%a1%c4%8denje">Shranjevanje na varno (angl. stashing) in čiščenje</a> </li> <li> 7.4 <a href="/book/sl/v2/Orodja-Git-Podpisovanje-va%c5%a1ega-dela">Podpisovanje vašega dela</a> </li> <li> 7.5 <a href="/book/sl/v2/Orodja-Git-Iskanje">Iskanje</a> </li> <li> 7.6 <a href="/book/sl/v2/Orodja-Git-Prepisovanje-zgodovine">Prepisovanje zgodovine</a> </li> <li> 7.7 <a href="/book/sl/v2/Orodja-Git-Demistifikacija-ponastavitve">Demistifikacija ponastavitve</a> </li> <li> 7.8 <a href="/book/sl/v2/Orodja-Git-Napredno-zdru%c5%beevanje">Napredno združevanje</a> </li> <li> 7.9 <a href="/book/sl/v2/Orodja-Git-Rerere">Rerere</a> </li> <li> 7.10 <a href="/book/sl/v2/Orodja-Git-Razhro%c5%a1%c4%8devanje-z-Gitom">Razhroščevanje z Gitom</a> </li> <li> 7.11 <a href="/book/sl/v2/Orodja-Git-Podmoduli">Podmoduli</a> </li> <li> 7.12 <a href="/book/sl/v2/Orodja-Git-Povezovanje-v-pakete">Povezovanje v pakete</a> </li> <li> 7.13 <a href="/book/sl/v2/Orodja-Git-Zamenjava">Zamenjava</a> </li> <li> 7.14 <a href="/book/sl/v2/Orodja-Git-Shramba-poverilnic">Shramba poverilnic</a> </li> <li> 7.15 <a href="/book/sl/v2/Orodja-Git-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/sl/v2/Prilagoditev-Gita-Konfiguracija-Git">Prilagoditev Gita</a></h2> <ol> <li> 8.1 <a href="/book/sl/v2/Prilagoditev-Gita-Konfiguracija-Git">Konfiguracija Git</a> </li> <li> 8.2 <a href="/book/sl/v2/Prilagoditev-Gita-Atributi-Git">Atributi Git</a> </li> <li> 8.3 <a href="/book/sl/v2/Prilagoditev-Gita-Kljuke-Git">Kljuke Git</a> </li> <li> 8.4 <a href="/book/sl/v2/Prilagoditev-Gita-Primer-pravilnika,-ki-ga-uveljavlja-Git">Primer pravilnika, ki ga uveljavlja Git</a> </li> <li> 8.5 <a href="/book/sl/v2/Prilagoditev-Gita-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/sl/v2/Git-in-ostali-sistemi-Git-kot-odjemalec">Git in ostali sistemi</a></h2> <ol> <li> 9.1 <a href="/book/sl/v2/Git-in-ostali-sistemi-Git-kot-odjemalec">Git kot odjemalec</a> </li> <li> 9.2 <a href="/book/sl/v2/Git-in-ostali-sistemi-Migracija-na-Git">Migracija na Git</a> </li> <li> 9.3 <a href="/book/sl/v2/Git-in-ostali-sistemi-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/sl/v2/Notranjost-Gita-Napeljava-in-keramika">Notranjost Gita</a></h2> <ol> <li> 10.1 <a href="/book/sl/v2/Notranjost-Gita-Napeljava-in-keramika">Napeljava in keramika</a> </li> <li> 10.2 <a href="/book/sl/v2/Notranjost-Gita-Objekti-Git" class="active">Objekti Git</a> </li> <li> 10.3 <a href="/book/sl/v2/Notranjost-Gita-Reference-Git">Reference Git</a> </li> <li> 10.4 <a href="/book/sl/v2/Notranjost-Gita-Packfiles-datoteke-zmanj%c5%a1anih-podatkov">Packfiles (datoteke zmanjšanih podatkov)</a> </li> <li> 10.5 <a href="/book/sl/v2/Notranjost-Gita-Refspec">Refspec</a> </li> <li> 10.6 <a href="/book/sl/v2/Notranjost-Gita-Protokoli-prenosa">Protokoli prenosa</a> </li> <li> 10.7 <a href="/book/sl/v2/Notranjost-Gita-Vzdr%c5%beevanje-in-obnovitev-podatkov">Vzdrževanje in obnovitev podatkov</a> </li> <li> 10.8 <a href="/book/sl/v2/Notranjost-Gita-Spremenljivke-okolja">Spremenljivke okolja</a> </li> <li> 10.9 <a href="/book/sl/v2/Notranjost-Gita-Povzetek">Povzetek</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Grafi%c4%8dni-vmesniki">Dodatek A: Git v drugih okoljih</a></h2> <ol> <li> A1.1 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Grafi%c4%8dni-vmesniki">Grafični vmesniki</a> </li> <li> A1.2 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Git-v-Visual-Studio">Git v Visual Studio</a> </li> <li> A1.3 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Git-v-Visual-Studio-Code">Git v Visual Studio Code</a> </li> <li> A1.4 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Git-v-IntelliJ-/-PyCharm-/-WebStorm-/-PhpStorm-/-RubyMine">Git v IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine</a> </li> <li> A1.5 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Git-v-Sublime-Text">Git v Sublime Text</a> </li> <li> A1.6 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Git-v-Bashu">Git v Bashu</a> </li> <li> A1.7 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Git-v-Zsh">Git v Zsh</a> </li> <li> A1.8 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Git-v-Powershellu">Git v Powershellu</a> </li> <li> A1.9 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/sl/v2/Dodatek-B:-Vdelava-Gita-v-va%c5%a1o-aplikacijo-Git-v-ukazni-vrstici">Dodatek B: Vdelava Gita v vašo aplikacijo</a></h2> <ol> <li> A2.1 <a href="/book/sl/v2/Dodatek-B:-Vdelava-Gita-v-va%c5%a1o-aplikacijo-Git-v-ukazni-vrstici">Git v ukazni vrstici</a> </li> <li> A2.2 <a href="/book/sl/v2/Dodatek-B:-Vdelava-Gita-v-va%c5%a1o-aplikacijo-Libgit2">Libgit2</a> </li> <li> A2.3 <a href="/book/sl/v2/Dodatek-B:-Vdelava-Gita-v-va%c5%a1o-aplikacijo-JGit">JGit</a> </li> <li> A2.4 <a href="/book/sl/v2/Dodatek-B:-Vdelava-Gita-v-va%c5%a1o-aplikacijo-go-git">go-git</a> </li> <li> A2.5 <a href="/book/sl/v2/Dodatek-B:-Vdelava-Gita-v-va%c5%a1o-aplikacijo-Dulwich">Dulwich</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Nastavitev-in-konfiguracija">Dodatek C: Ukazi Git</a></h2> <ol> <li> A3.1 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Nastavitev-in-konfiguracija">Nastavitev in konfiguracija</a> </li> <li> A3.2 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Pridobivanje-in-ustvarjanje-projektov">Pridobivanje in ustvarjanje projektov</a> </li> <li> A3.3 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Osnove-posnetkov">Osnove posnetkov</a> </li> <li> A3.4 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Veje-in-zdru%c5%beevanje">Veje in združevanje</a> </li> <li> A3.5 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Deljenje-in-posodabljanje-projektov">Deljenje in posodabljanje projektov</a> </li> <li> A3.6 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Pregled-in-primerjava">Pregled in primerjava</a> </li> <li> A3.7 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Razhro%c5%a1%c4%8devanje">Razhroščevanje</a> </li> <li> A3.8 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Popravljanje">Popravljanje</a> </li> <li> A3.9 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-E-po%c5%a1ta">E-pošta</a> </li> <li> A3.10 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Zunanji-sistemi">Zunanji sistemi</a> </li> <li> A3.11 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Administracija">Administracija</a> </li> <li> A3.12 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Orodja-za-sisteme-napeljave">Orodja za sisteme napeljave</a> </li> </ol> </li> </ol> </div> </div> </div> <span class="light" id="edition"> 2nd Edition </span> </div> <div id="main" data-pagefind-filter="category:book" data-pagefind-meta="category:Book" data-pagefind-weight="0.05" data-pagefind-body class="book edition2"> <h1>10.2 Notranjost Gita - Objekti Git</h1> <div> <h2 id="_objects">Objekti Git</h2> <div class="paragraph"> <p>Git je sistem za shranjevanje vsebine s poudarkom na datotečnem sistemu. Odlično. Kaj to pomeni? To pomeni, da je v jedru Git preprosta shramba podatkov ključ-vrednost. To pomeni, da lahko v repozitorij Git vstavite katero koli vrsto vsebine, za katero vam bo Git vrnil edinstven ključ, ki ga lahko pozneje uporabite za pridobitev te vsebine.</p> </div> <div class="paragraph"> <p>Kot demonstracijo si poglejmo ukaz napeljave <code>git hash-object</code>, ki sprejme nekaj podatkov, jih shrani v vaš direktorij <code>.git/objects</code> (<em>objektna baza podatkov</em>) in vam vrne edinstven ključ, ki se nanaša na ta podatkovni objekt.</p> </div> <div class="paragraph"> <p>Najprej inicializirajte nov repozitorij Git in preverite, da v mapi <code>objects</code> (pričakovano) ni ničesar:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git init test Initialized empty Git repository in /tmp/test/.git/ $ cd test $ find .git/objects .git/objects .git/objects/info .git/objects/pack $ find .git/objects -type f</code></pre> </div> </div> <div class="paragraph"> <p>Git je inicializiral mapo <code>objects</code> in v njej ustvaril podmapi <code>pack</code> in <code>info</code>, vendar v njej ni navadnih datotek. Sedaj pa uporabimo <code>git hash-object</code>, da ustvarimo nov podatkovni objekt in ga ročno shranimo v vašo novo podatkovno zbirko Git:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo 'test content' | git hash-object -w --stdin d670460b4b4aece5915caf5c68d12f560a9fe3e4</code></pre> </div> </div> <div class="paragraph"> <p>V najpreprostejši obliki bi <code>git hash-object</code> sprejel vsebino, ki ste jo posredovali, in preprosto vrnil edinstven ključ, ki <em>bi bil</em> uporabljen za shranjevanje v vaši podatkovni zbirki Git. Možnost <code>-w</code> ukazu pove, naj ne vrne le ključa, ampak objekt tudi zapiše v zbirko. Možnost <code>--stdin</code> pove <code>git hash-object</code>, naj vsebino za obdelavo prebere iz stdin; sicer bi ukaz na koncu pričakoval argument imena datoteke, ki vsebuje vsebino, ki jo je treba uporabiti.</p> </div> <div class="paragraph"> <p>Izhod iz zgornjega ukaza je 40 znakov dolga zgoščena vrednost kontrolne vsote. To je zgoščena vrednost SHA-1 oz. kontrolna vsota vsebine, ki jo shranjujete, in glava, o kateri boste izvedeli več v kratkem. Sedaj lahko vidite, kako je Git shranil vaše podatke:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ find .git/objects -type f .git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4</code></pre> </div> </div> <div class="paragraph"> <p>Če ponovno pregledate mapo <code>objects</code>, lahko vidite, da vsebuje datoteko za to novo vsebino. To je način, kako Git sprva shranjuje vsebino — kot posamezno datoteko za vsak kos vsebine, poimenovan s kontrolno vsoto SHA-1 vsebine in njegove glave. Podmapa je poimenovana s prvima dvema znakoma SHA-1, ime datoteke pa predstavlja preostalih 38 znakov.</p> </div> <div class="paragraph"> <p>Ko imate vsebino v svoji objektni podatkovni bazi, lahko to vsebino pregledate z ukazom <code>git cat-file</code>. Ta ukaz je nekakšen švicarski vojaški nož za pregledovanje objektov Git. Možnost <code>-p</code>, podana <code>cat-file</code>, ukazu naroči, naj najprej ugotovi vrsto vsebine in jo ustrezno prikaže:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4 test content</code></pre> </div> </div> <div class="paragraph"> <p>Sedaj lahko dodajate vsebino v Git in jo nato spet povlečete iz njega. To lahko storite tudi z vsebino v datotekah. Na primer, lahko opravite nekaj preprostega nadzora različic datoteke. Najprej ustvarite novo datoteko in shranite njeno vsebino v svojo podatkovno zbirko:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo 'version 1' > test.txt $ git hash-object -w test.txt 83baae61804e65cc73a7201a7252750c76066a30</code></pre> </div> </div> <div class="paragraph"> <p>Nato napišite nekaj vsebine v to datoteko in jo ponovno shranite:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo 'version 2' > test.txt $ git hash-object -w test.txt 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a</code></pre> </div> </div> <div class="paragraph"> <p>Vaša objektna podatkovna baza sedaj vsebuje obe različici te nove datoteke (kot tudi prvo vsebino, ki ste jo tam shranili):</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ find .git/objects -type f .git/objects/1f/7a7a472abf3dd9643fd615f6da379c4acb3e3a .git/objects/83/baae61804e65cc73a7201a7252750c76066a30 .git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4</code></pre> </div> </div> <div class="paragraph"> <p>V tem trenutku lahko izbrišete svojo lokalno kopijo datoteke <code>test.txt</code> in nato uporabite Git, da iz objektne podatkovne baze pridobite prvo različico, ki ste jo shranili:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -p 83baae61804e65cc73a7201a7252750c76066a30 > test.txt $ cat test.txt version 1</code></pre> </div> </div> <div class="paragraph"> <p>ali pa drugo različico:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -p 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a > test.txt $ cat test.txt version 2</code></pre> </div> </div> <div class="paragraph"> <p>Vendar zapomniti si ključa SHA-1 za vsako različico datoteke ni praktično; poleg tega ne shranjujete imena datoteke v svojem sistemu — samo vsebino. Ta vrsta objekta se imenuje blob. Git vam lahko pove, kakšne vrste objekta je katerikoli objekt v Git, glede na njegov ključ SHA-1, z <code>git cat-file -t</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -t 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a blob</code></pre> </div> </div> <div class="sect3"> <h3 id="_tree_objects">Drevesni objekti</h3> <div class="paragraph"> <p>Naslednjo vrsto objekta Git, ki jo bomo pregledali, je drevo (angl. <em>tree</em>), ki rešuje problem shranjevanja imena datoteke in vam omogoča, da skupino datotek shranite skupaj. Git vsebino shranjuje na način, podoben UNIX-ovi datotečni strukturi, vendar nekoliko poenostavljeno. Vse vsebine so shranjene kot objekti dreves in blobov, pri čemer drevesa ustrezajo vnosom v UNIX-ovem imeniku, blobi pa približno ustrezajo inodom ali vsebini datotek. Posamezni objekt drevesa vsebuje enega ali več vnosov, pri čemer je vsak vnos zgoščene vrednosti SHA-1 koda bloba ali poddrevesa s pripadajočim načinom, vrsto in imenom datoteke. Na primer, recimo, da imate projekt, kjer je zadnje drevo videti nekako takole:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -p master^{tree} 100644 blob a906cb2a4a904a152e80877d4088654daad0c859 README 100644 blob 8f94139338f9404f26296befa88755fc2598c289 Rakefile 040000 tree 99f1a6d12cb4b6f19c8655fca46c3ecf317074e0 lib</code></pre> </div> </div> <div class="paragraph"> <p>Sintaksa <code>master^{drevo}</code> določa objekt drevesa, na katerega kaže zadnja potrditev v vaši veji <code>master</code>. Bodite pozorni, da poddirektorij <code>lib</code> ni blob ampak kazalec na drugo drevo:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -p 99f1a6d12cb4b6f19c8655fca46c3ecf317074e0 100644 blob 47c6340d6459e05787f644c2447d2595f5d3a54b simplegit.rb</code></pre> </div> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Opomba</div> </td> <td class="content"> <div class="paragraph"> <p>Odvisno od uporabljene lupine se lahko pri uporabi sintakse <code>master^{drevo}</code> srečate z napakami.</p> </div> <div class="paragraph"> <p>V CMD na sistemu Windows se znak <code>^</code> uporablja kot ubežni znak, zato ga morate podvojiti, da se izognete temu: <code>git cat-file -p master^^{drevo}</code>. Pri uporabi PowerShell je treba parametre, ki uporabljajo znake <code>{}</code> , navesti v narekovajih, da se izognete napačnemu razčlenjevanju parametra: <code>git cat-file -p 'master^{drevo}'</code>.</p> </div> <div class="paragraph"> <p>Če uporabljate ZSH, se znak <code>^</code> uporablja za razširjanje vzorcev, zato morate celoten izraz obdati z navednicami: <code>git cat-file -p "master^{drevo}"</code>.</p> </div> </td> </tr> </table> </div> <div class="paragraph"> <p>Konceptualno so podatki, ki jih Git shranjuje, videti nekako takole:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/sl/v2/images/data-model-1.png" alt="Enostavna različica modela podatkov Git"> </div> <div class="title">Slika 173. Enostavna različica modela podatkov Git</div> </div> <div class="paragraph"> <p>Dokaj enostavno lahko ustvarite lastno drevo. Git običajno ustvari drevo tako, da vzame stanje vašega področja za pripravo ali indeksa in iz njega napiše zaporedje drevesnih objektov. Zato morate za ustvarjanje drevesnega objekta najprej nastaviti indeks tako, da nekatere datoteke pripravite. Za ustvarjanje indeksa s posameznim vnosom — prvo različico datoteke <code>test.txt</code> — lahko uporabite ukaz <code>git update-index</code>. Ta ukaz uporabite, da umetno dodate prejšnjo različico datoteke <code>test.txt</code> v novo področje za pripravo. Podati mu morate možnost <code>--add</code>, ker datoteka še ni v vašem področju za pripravo (niti še niste nastavili področja za pripravo) in <code>--cacheinfo</code>, ker datoteke, ki jo dodajate, ni v vaši mapi, ampak v vaši bazi podatkov. Nato navedete način, SHA-1 in ime datoteke:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git update-index --add --cacheinfo 100644 \ 83baae61804e65cc73a7201a7252750c76066a30 test.txt</code></pre> </div> </div> <div class="paragraph"> <p>V tem primeru navajate način <code>100644</code>, kar pomeni, da je to običajna datoteka. Druge možnosti so <code>100755</code>, kar pomeni, da gre za izvršljivo datoteko; in <code>120000</code>, kar določa simbolično povezavo. Način je vzet iz običajnih načinov UNIX, vendar je veliko manj prilagodljiv — ti trije načini so edini veljavni za datoteke (spletne objekte) v Gitu (čeprav se za mape in podmodule uporabljajo drugi načini).</p> </div> <div class="paragraph"> <p>Zdaj lahko uporabite <code>git write-tree</code>, da izpišete področje za pripravo v drevesni objekt. Možnost <code>-w</code> ni potrebna — klic tega ukaza samodejno ustvari drevesni objekt iz stanja indeksa, če tega drevesa še ni:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git write-tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579 $ git cat-file -p d8329fc1cc938780ffdd9f94e0d364e0ea74f579 100644 blob 83baae61804e65cc73a7201a7252750c76066a30 test.txt</code></pre> </div> </div> <div class="paragraph"> <p>Prav tako lahko preverite, da je to drevesni objekt z uporabo enakega ukaza <code>git cat-file</code>, kot ste ga videli prej:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -t d8329fc1cc938780ffdd9f94e0d364e0ea74f579 tree</code></pre> </div> </div> <div class="paragraph"> <p>Zdaj boste ustvarili novo drevo z drugo različico <code>test.txt</code> in tudi z novo datoteko:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo 'new file' > new.txt $ git update-index --cacheinfo 100644 \ 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a test.txt $ git update-index --add new.txt</code></pre> </div> </div> <div class="paragraph"> <p>Vaše področje za pripravo zdaj vsebuje novo različico <code>test.txt</code> in novo datoteko <code>new.txt</code>. Izpišite to drevo (zabeležite stanje področja za pripravo ali indeksa v drevesni objekt) in preverite, kakšno je videti:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git write-tree 0155eb4229851634a0f03eb265b69f5a2d56f341 $ git cat-file -p 0155eb4229851634a0f03eb265b69f5a2d56f341 100644 blob fa49b077972391ad58037050f2a75f74e3671e92 new.txt 100644 blob 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a test.txt</code></pre> </div> </div> <div class="paragraph"> <p>Opazite, da ima to drevo vnos tako za datoteke kot tudi to, da je SHA-1 <code>test.txt</code> »različica 2« SHA-1 iz prejšnjega (<code>1f7a7a</code>). Le za zabavo boste dodali prvo drevo kot podmapo v to. Drevesa lahko preberete v vaše področje za pripravo s klicem <code>git read-tree</code>. V tem primeru lahko obstoječe drevo preberete v svoje področje za pripravo kot poddrevo s tem ukazom, ki uporablja možnost <code>--prefix</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git read-tree --prefix=bak d8329fc1cc938780ffdd9f94e0d364e0ea74f579 $ git write-tree 3c4e9cd789d88d8d89c1073707c3585e41b0e614 $ git cat-file -p 3c4e9cd789d88d8d89c1073707c3585e41b0e614 040000 tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579 bak 100644 blob fa49b077972391ad58037050f2a75f74e3671e92 new.txt 100644 blob 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a test.txt</code></pre> </div> </div> <div class="paragraph"> <p>Če bi iz novega drevesa ustvarili delovni imenik, bi dobili dve datoteki na vrhnji ravni delovnega imenika in podmapo z imenom <code>bak</code>, ki bi vsebovala prvo različico datoteke <code>test.txt</code>. Podatke, ki jih Git vsebuje za te strukture, si lahko predstavljate takole:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/sl/v2/images/data-model-2.png" alt="Struktura vsebine vaših trenutnih podatkov Git"> </div> <div class="title">Slika 174. Struktura vsebine vaših trenutnih podatkov Git</div> </div> </div> <div class="sect3"> <h3 id="_git_commit_objects">Objekti potrditev</h3> <div class="paragraph"> <p>Če ste naredili vse zgoraj našteto, imate sedaj tri drevesa, ki predstavljajo različne posnetke vašega projekta, ki jih želite spremljati, vendar ostaja prejšnji problem: morate si zapomniti vse tri vrednosti SHA-1, da se lahko spomnite posnetkov. Prav tako nimate nobenih informacij o tem, kdo je shranil posnetke, kdaj so bili shranjeni ali zakaj so bili shranjeni. To je osnovna informacija, ki jo za vas shrani objekt potrditve.</p> </div> <div class="paragraph"> <p>Za ustvarjanje objekta potrditve kličete <code>commit-tree</code> in navedete eno SHA-1 drevesa ter kakršne koli objekte potrditev, ki so ji neposredno sledili. Začnite s prvim drevesom, ki ste ga napisali:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo 'First commit' | git commit-tree d8329f fdf4fc3344e67ab068f836878b6c4951e3b15f3d</code></pre> </div> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Opomba</div> </td> <td class="content"> <div class="paragraph"> <p>Zdaj boste dobili drugačno zgoščeno vrednost zaradi različnega časa ustvarjanja in avtorskih podatkov. Poleg tega, čeprav se lahko v teoriji vsak objekt potrditve natančno reproducira s temi podatki, zgodovinski podatki o gradnji te knjige pomenijo, da se natisnjene zgoščene vrednosti potrditve morda ne ujemajo z določenimi potrditvami. V tem poglavju nadomestite zgoščene vrednosti potrditve in oznak s svojimi kontrolnimi vsotami.</p> </div> </td> </tr> </table> </div> <div class="paragraph"> <p>Sedaj lahko pogledate vaš novi objekt potrditve z <code>git cat-file</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console?prompt=$" data-lang="console?prompt=$">$ git cat-file -p fdf4fc3 tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579 author Scott Chacon <schacon@gmail.com> 1243040974 -0700 committer Scott Chacon <schacon@gmail.com> 1243040974 -0700 First commit</code></pre> </div> </div> <div class="paragraph"> <p>Oblika objekta potrditve je preprosta: določi se drevo najvišje ravni za posnetek projekta v tem trenutku, predhodnih potrditev, če obstajajo (zgoraj opisana potrditev nima nobenih predhodnikov); informacije o avtorju/potrjevalcu (ki uporabljajo vaše nastavitve konfiguracije <code>user.name</code> in <code>user.email</code> ter časovni žig); prazna vrstica in nato besedilo potrditve.</p> </div> <div class="paragraph"> <p>Nato boste napisali še drugi dve potrditvi, ki se sklicujeta na potrditev, ki je neposredno sledila potrditvi:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo 'Second commit' | git commit-tree 0155eb -p fdf4fc3 cac0cab538b970a37ea1e769cbbde608743bc96d $ echo 'Third commit' | git commit-tree 3c4e9c -p cac0cab 1a410efbd13591db07496601ebc7a059dd55cfe9</code></pre> </div> </div> <div class="paragraph"> <p>Vsak izmed treh objektov potrditev kaže na eno od treh posnetkov dreves, ki ste jih ustvarili. Presenetljivo imate sedaj dejansko zgodovino Git, ki jo lahko pregledujete z ukazom <code>git log</code>, če ga poženete na SHA-1 zadnje potrditve:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console?prompt=$" data-lang="console?prompt=$">$ git log --stat 1a410e commit 1a410efbd13591db07496601ebc7a059dd55cfe9 Author: Scott Chacon <schacon@gmail.com> Date: Fri May 22 18:15:24 2009 -0700 Third commit bak/test.txt | 1 + 1 file changed, 1 insertion(+) commit cac0cab538b970a37ea1e769cbbde608743bc96d Author: Scott Chacon <schacon@gmail.com> Date: Fri May 22 18:14:29 2009 -0700 Second commit new.txt | 1 + test.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) commit fdf4fc3344e67ab068f836878b6c4951e3b15f3d Author: Scott Chacon <schacon@gmail.com> Date: Fri May 22 18:09:34 2009 -0700 First commit test.txt | 1 + 1 file changed, 1 insertion(+)</code></pre> </div> </div> <div class="paragraph"> <p>Neverjetno. Pravkar ste izvedli nizko nivojske operacije za gradnjo zgodovine Git brez uporabe nobenega od ukazov ospredja. To je v bistvu tisto, kar Git naredi, ko zaženete ukaze <code>git add</code> in <code>git commit</code> — shrani blobe za datoteke, ki so se spremenile, posodablja indeks, zapisuje drevesa in zapisuje objekte potrditev, ki se sklicujejo na drevesa najvišje ravni in potrditve, ki so jim takoj sledile. Ti trije glavni objekti Git — blob, drevo in potrditev — so na začetku shranjeni kot ločene datoteke v vaši mapi <code>.git/objects</code>. Tukaj so vsi objekti v mapi iz primera, opremljeni s komentarji o tem, kaj shranjujejo:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ find .git/objects -type f .git/objects/01/55eb4229851634a0f03eb265b69f5a2d56f341 # tree 2 .git/objects/1a/410efbd13591db07496601ebc7a059dd55cfe9 # commit 3 .git/objects/1f/7a7a472abf3dd9643fd615f6da379c4acb3e3a # test.txt v2 .git/objects/3c/4e9cd789d88d8d89c1073707c3585e41b0e614 # tree 3 .git/objects/83/baae61804e65cc73a7201a7252750c76066a30 # test.txt v1 .git/objects/ca/c0cab538b970a37ea1e769cbbde608743bc96d # commit 2 .git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4 # 'test content' .git/objects/d8/329fc1cc938780ffdd9f94e0d364e0ea74f579 # tree 1 .git/objects/fa/49b077972391ad58037050f2a75f74e3671e92 # new.txt .git/objects/fd/f4fc3344e67ab068f836878b6c4951e3b15f3d # commit 1</code></pre> </div> </div> <div class="paragraph"> <p>Če ste sledili vsem internim kazalnikom, dobite objektni graf, ki je videti nekako takole:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/sl/v2/images/data-model-3.png" alt="Vsi dosegljivi objekti v vašem imeniku Git"> </div> <div class="title">Slika 175. Vsi dosegljivi objekti v vašem imeniku Git</div> </div> </div> <div class="sect3"> <h3 id="_shramba_objekta">Shramba objekta</h3> <div class="paragraph"> <p>Zgoraj smo omenili, da ima vsak objekt, ki ga potrdimo v objektno bazo podatkov Git, shranjeno glavo. Za minuto si oglejmo, kako Git shranjuje svoje objekte. Prikazali bomo, kako shraniti objekt blob — v tem primeru niz »what is up, doc?« — interaktivno v programskega jezika Ruby.</p> </div> <div class="paragraph"> <p>Interaktivni način Ruby lahko zaženete z ukazom <code>irb</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ irb >> content = "what is up, doc?" => "what is up, doc?"</code></pre> </div> </div> <div class="paragraph"> <p>Git najprej sestavi glavo, ki se začne z identifikacijo vrste objekta — v tem primeru gre za blob. Git k prvemu delu glave doda presledek, nato pa še velikost v bajtih vsebine in na koncu še ničelni bajt:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">>> header = "blob #{content.bytesize}\0" => "blob 16\u0000"</code></pre> </div> </div> <div class="paragraph"> <p>Git združuje glavo in izvirno vsebino ter izračuna kontrolne vsote SHA-1 te nove vsebine. Vrednost SHA-1 niza lahko izračunate v Rubyju z vključitvijo knjižnice SHA1 digest s pomočjo ukaza <code>require</code>, nato pa kličete <code>Digest::SHA1.hexdigest()</code> s tem nizom:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">>> store = header + content => "blob 16\u0000what is up, doc?" >> require 'digest/sha1' => true >> sha1 = Digest::SHA1.hexdigest(store) => "bd9dbf5aae1a3862dd1526723246b20206e5fc37"</code></pre> </div> </div> <div class="paragraph"> <p>Primerjajmo to z izhodom <code>git hash-object</code>. Tukaj uporabljamo <code>echo -n</code>, da preprečimo dodajanje nove vrstice vhodu.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo -n "what is up, doc?" | git hash-object --stdin bd9dbf5aae1a3862dd1526723246b20206e5fc37</code></pre> </div> </div> <div class="paragraph"> <p>Git stisne novo vsebino z zlib, kar lahko storimo v Rubyju z uporabo knjižnice zlib. Najprej morate knjižnico zahtevati in nato na vsebini zagnati <code>Zlib::Deflate.deflate()</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">>> require 'zlib' => true >> zlib_content = Zlib::Deflate.deflate(store) => "x\x9CK\xCA\xC9OR04c(\xCFH,Q\xC8,V(-\xD0QH\xC9O\xB6\a\x00_\x1C\a\x9D"</code></pre> </div> </div> <div class="paragraph"> <p>Na koncu boste napisali vašo zlib-stisnjeno vsebino na objekt na disku. Določili boste pot objekta, ki ga želite zapisati (prvi dve številki vrednosti SHA-1 predstavljata ime poddirektorija, preostalih 38 znakov pa predstavlja ime datoteke znotraj tega direktorija). V jeziku Ruby lahko funkcijo <code>FileUtils.mkdir_p()</code> uporabite za ustvarjanje poddirektorija, če ta še ne obstaja. Nato odprite datoteko s <code>File.open()</code> in zapišite predhodno zlib-stisnjeno vsebino v datoteko s klicem <code>write()</code> na nastalem datotečnem oprimku:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">>> path = '.git/objects/' + sha1[0,2] + '/' + sha1[2,38] => ".git/objects/bd/9dbf5aae1a3862dd1526723246b20206e5fc37" >> require 'fileutils' => true >> FileUtils.mkdir_p(File.dirname(path)) => ".git/objects/bd" >> File.open(path, 'w') { |f| f.write zlib_content } => 32</code></pre> </div> </div> <div class="paragraph"> <p>Poglejmo vsebino objekta z uporabo <code>git cat-file</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">--- $ git cat-file -p bd9dbf5aae1a3862dd1526723246b20206e5fc37 what is up, doc? ---</code></pre> </div> </div> <div class="paragraph"> <p>To je to — ustvarili ste veljaven Gitov objekt blob.</p> </div> <div class="paragraph"> <p>Vsi objekti Git se shranjujejo na enak način, samo z različnimi vrstami — namesto niza blob, se bo glava začela s potrditvijo ali drevesom. Poleg tega, čeprav je lahko vsebina bloba skorajda karkoli, je vsebina potrditve in drevesa zelo natančno oblikovana.</p> </div> </div> <div id="nav"><a href="/book/sl/v2/Notranjost-Gita-Napeljava-in-keramika">prev</a> | <a href="/book/sl/v2/Notranjost-Gita-Reference-Git">next</a></div> </div> </div> </div> </div> <footer> <div class="site-source"> <a href="/site">About this site</a><br> Patches, suggestions, and comments are welcome. </div> <div class="sfc-member"> Git is a member of <a href="/sfc">Software Freedom Conservancy</a> </div> </footer> <a href="#top" class="no-js scrollToTop" id="scrollToTop" data-label="Scroll to top"> <img src="/images/icons/chevron-up@2x.png" width="20" height="20" alt="scroll-to-top"/> </a> <script src="/js/jquery-1.7.1.min.js"></script> <script src="/js/jquery-ui-1.8.18.custom.min.js"></script> <script src="/js/jquery.defaultvalue.js"></script> <script src="/js/session.min.js"></script> <script src="/js/application.min.js"></script> </div> </body> </html>