Tree

Git, bir repository'deki dizinlerin yapısını tree adı verilen objeler ile saklamaktadır. Tree objeleri ile repository'mizin dosya sistemi bilgisi, hangi dizinde hangi dizinlerin ve hangi dosyaların olduğunu, bu dizin ve dosyaların izin bilgileri bir arada saklanmaktadır.

Terminoloji

Bir commit'in işaret ettiği tree objesine root tree adı verilir. Root tree'ler repository'mizin kök dizin yapısını barındırırlar.

Tree objesini daha iyi açıklayabilmek için repository'mizde klasörler oluşturup bu klasörlerin içinde dosyalar oluşturup bir commit atalım.

$ mkdir alt-dizinim && echo "bu bir testtir" > alt-dizinim/alt-dosya.txt

$ mkdir alt-dizinim/bir-baska-alt-dizin && echo "baska bir test" > alt-dizinim/bir-baska-alt-dizin/baska-alt-dosya.txt

$ git add . && git commit -m "alt dizinlerle dosyalar olusturdum"
[dal-A 255a1c9] alt dizinlerle dosyalar olusturdum
 2 files changed, 2 insertions(+)
 create mode 100644 alt-dizinim/alt-dosya.txt
 create mode 100644 alt-dizinim/bir-baska-alt-dizin/baska-alt-dosya.txt
# repository dizinimizin son haline bakalim
$ tree .
.
├── alt-dizinim
│   ├── alt-dosya.txt
│   └── bir-baska-alt-dizin
│       └── baska-alt-dosya.txt
├── test-2.txt
└── test.txt

3 directories, 4 files

cat-file komutu yardımıyla mevcut commit'imizin işaret ettiği root tree'ye bakalım.

-p Bayrağı

Yazının bu noktasından itibaren cat-file komutunu -p bayrağı ile kullanacağım. Aksi halde tree objeleri ekrana bozuk karakterler ile basılacaktır.

$ git cat-file -p 255a1c9
tree 49664afeafb81dd195da85101c35bfdb18fd277b
parent 789492681e6b0d56b1fe142431bae464d630f2d3
author <username> <email> 1747583059 +0200
committer <username> <email> 1747583059 +0200

alt dizinlerle dosyalar olusturdum

$ git cat-file -p 49664afeafb81dd195da85101c35bfdb18fd277b
040000 tree 3b863a1570fbd49a0edddaa19e139d914e8fe5de    alt-dizinim
100644 blob 3be11c69355948412925fa5e073d76d58ff3afd2    test-2.txt
100644 blob 52ac9288adff03447ba51676ca78a830d8b69ccb    test.txt

Yukarıda da görüldüğü üzere mevcut commit'imizin işaret ettiği root tree objesi repository'mizde oluşturduğumuz dosyalarımızı blob isminde bir obje tipi ve bu objelerin hash'leri ile işaret etmektedir.

Unix Bilgisi

Tree objemizin listelediği blob objelerinin başında yer alan 100644 sayısı Unix sistemlerde bir dosyanın tipini ve kimlerin bu dosyaya erişebildiğini gösteren bir kodlama yöntemidir. 100644 kodu bize dosyanın çalıştırılamaz bir dosya olduğunu ve bu dosyaya sadece dosya sahibinin yazma işlemi yapabileceğini ifade etmektedir.

040000 ise bize bunun bir dizin olduğunu söylemektedir.

Burada dikkatimizi çeken bir başka unsur ise root tree'mizin içerdiği bir başka öğe olan alt-dizinim isimli bir başka tree. Root tree'miz aslında bir alt dizini bir tree objesi olarak işaret etmekte. Peki bu alt-dizinim tree'sinin öğeleri neler?

$ git cat-file -p 3b863a1570fbd49a0edddaa19e139d914e8fe5de
100644 blob 855deee8a88ad1a89440c6e868e326e14c2d55a4    alt-dosya.txt
040000 tree b23821ed42fc628b9cdd2d16bf14ed3c7f5bffb6    bir-baska-alt-dizin

Bu alt dizinin tree objesi de aynı şekilde bir blob ve bir alt tree tipi içermekte. Genelleştirirsek:

  • Her tree kendi bağlamlarında anonimdir. Hash'leri dışında bir kimlikleri yoktur.
  • Bir tree bir başka tree'ye işaret ederken tree'nin hash'i ile birlikte bir isim atfedebilir.
  • Her tree içinde barındırdığı blob ve treelerin hash'lerini işaret eder.
  • Bir commit'in işaret ettiği tree objesine root tree denir.
  • Root tree'den başlayarak işaret edilen blob ve treeleri recursive bir şekilde gezersek commit'imizin atıldığı esnadaki repository'nin dizin yapısını oluşturabiliriz.