2015-03-17 19 views
12

Git taahhütlerini benzersiz olarak tanımları oluşturmak için nasıl oluşturulur?Git - Bir git taahhüt kimliği nedir?

Örnek: 521747298a3790fde1710f3aa2d03b55020575aa

Nasıl çalışır? Her proje için sadece benzersiz mi? ya da global olarak git depoları için?

+0

Bkz. Http://git-scm.com/book/en/v2/Getting-Started-Git-Basics#Git-Has-Integrity – Jubobs

+4

Neden inandığınızdan emin değilsiniz. Bu konuyu çok ilginç buluyorum. –

cevap

16

A Git kimliği işlemek her önemli şey bir SHA-1 hash olduğunu taahhüt. Hepsini listelemiyorum, ama işte önemli olanlar ...

  • Sadece içerik değil, içerik.
  • Gönderme tarihi.
  • Committer adı ve e-posta adresi.
  • Günlüğü mesaj.
  • önceki ID (ler) işlemek.

Değişim hiçbirini ve taahhüt kimliği değişir. Ve evet, aynı özelliklerle aynı işlem, farklı bir makinede aynı kimliğe sahip olacaktır. Bu üç amaca hizmet eder. Birincisi, sistemin bir taahhütte bulunup bulunmadığını söyleyebilmesi anlamına gelir. Mimariye doğru fırında.

İkincisi, tek hızla karşılaştırabilirsiniz sadece kendi kimliklerine bakarak taahhüt. Bu, Git'in ağ protokollerini çok verimli hale getirir. Aynı olup olmadığını görmek için iki işi karşılaştırmak ister misiniz? Bütün farklılığı göndermek zorunda değilsiniz, sadece kimlikleri gönderin.

Üçüncüsü, ve bu da aynı kimlikle aynı kimliğe sahip iki aynı işi paylaşıyor. Bu yüzden önceki işlemlerin kimliği karmanın bir parçası. Bir taahhüdün içeriği aynıysa ancak ebeveynler farklıysa, taahhüt kimliği farklı olmalıdır. Bu, depoları (bir itme veya çekme gibi) karşılaştırırken, Git denetimini durdurabilen iki havuz arasında ortak bir taahhüt bulduğunda karşılaştırır. Bu, itme ve çekme işlemini son derece verimli hale getirir. Örneğin ...

origin 
A - B - C - D - E [master] 

A - B [origin/master] 

git fetch origin için ağ konuşma böyle bir şey ...

  • local Hey kökeni, ne dallar var gider? -E
  • local Ben E bulunmadığı en master var
  • origin, ben B. adresinden usta
  • origin B diyorsunuz var? Bende B var ve E.'nin atası. Size C, D ve E gönderelim.

Ayrıca, rebase ile yapılan bir işlemi yeniden yazdığınızda, her şey değiştikten sonra bu yüzden de. İşte bir örnek.

A - B - C - D - E - F - G [master] 

Şimdi, az önce günlük mesaj biraz değiştirmek, D yeniden varsayalım. Artık D artık D olamaz, D1'i arayacağımız yeni bir işleme kopyalanması gerekir.

A - B - C - D - E - F - G [master] 
     \ 
      D1 

D1 onun ebeveyn olarak C (C etkilenmez çocuklarını bilmiyorum taahhüt) o E, F, G bağlantısı kesildiğinde sahip olabilmelerine rağmenE'nin ebeveyni D1'e değiştirirsek, E artık E olamaz. Yeni bir taahhüt E1'e kopyalanması gerekiyor.

A - B - C - D - E - F - G [master] 
     \ 
      D1 - E1 

ve böylece F F1 ve G G1

.
A - B - C - D - E - F - G 
     \ 
      D1 - E1 - F1 - G1 [master] 

Hepsi aynı kodu, sadece farklı anne (veya D1 durumunda olduğu, farklı bir taahhüt mesajı) var.

11

Sen

git cat-file commit HEAD 

çalıştırarak bir taahhüt id yaparak gider tam olarak ne görebilirsiniz Size verir

tree 07e239f2f3d8adc12566eaf66e0ad670f36202b5 
parent 543a4849f7201da7bed297b279b7b1e9a086a255 
author Justin Howard <[email protected]> 1426631449 -0700 
committer Justin Howard <[email protected]> 1426631471 -0700 

My commit message 

gibi bir şey verecektir: ait

  1. bir sağlama toplamı ağaç içeriği
  2. Üst kimlik kimliği (bu birleştirme ise, t Burada)
  3. damgası

Git tüm bu alır ve bunun bir sha1 özetini yapar taahhüt damgası

  • ile taahhüt mesajın committer ile taahhüt yazarı daha anne olacak. Bu bir boşluk ve cat-file metin blob'un bayt sayısı takiben dize commit yazdırarak başlar

    (printf "commit %s\0" $(git cat-file commit HEAD | wc -c); git cat-file commit HEAD) | sha1sum 
    

    çalıştırarak taahhüt id üretebilir. Daha sonra cat-file blob ekler ve onu null byte ekler. Bunların hepsi sha1sum'dan geçer.

    Gördüğünüz gibi, bu bilgiyi projede veya depoda tanımlayan hiçbir şey yoktur. Bunun problemlere neden olmaması, iki farklı karmaşanın çarpışması için astronomik bir olasılık olmadığı için.

  • +0

    Bu gerçekten seçilen cevabı tamamlar, ben kontrol ettim, kabuk betiği gerçekten işe yarıyor, sanırım bu gerçek koddan kopyalanıyor, değil mi? –

    +1

    @JeanVincent: Tam olarak koddan alınmadı. Bunun C dilinde yazıldığını hayal ediyorum. Fakat algoritmayı doğru bir şekilde yeniden üretiyor (şu an itibariyle, ancak katkıda bulunanlar SHA1'i değiştirmek için çalışıyorlar). –

    +0

    Bu bilgiyi nereden aldınız? https://gist.github.com/masak/2415865 –