-
1. Başlangıç
- 1.1 Sürüm Denetimi
- 1.2 Git’in Kısa Tarihçesi
- 1.3 Git Nedir?
- 1.4 Komut Satırı
- 1.5 Git’i Yüklemek
- 1.6 Git’i İlk Defa Kurmak
- 1.7 Yardım Almak
- 1.8 Özet
-
2. Git Temelleri
-
3. Git Dalları
- 3.1 Dallar
- 3.2 Kısaca Dallandırma ve Birleştirme Temelleri
- 3.3 Dal Yönetimi
- 3.4 İş Akışı Dallandırması
- 3.5 Uzak Dallar
- 3.6 Yeniden Temelleme (rebase)
- 3.7 Özet
-
4. Bir Sunucuda Git Kurma
- 4.1 İletişim Kuralları (Protocols)
- 4.2 Bir Sunucuda Git Kurma
- 4.3 SSH Ortak Anahtarınızı Oluşturma
- 4.4 Sunucu Kurma
- 4.5 Git Cini (Daemon)
- 4.6 Akıllı HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Üçüncü Taraf Barındırma (Hosting) Seçenekleri
- 4.10 Özet
-
5. Dağıtık Git
- 5.1 Dağıtık İş Akışları
- 5.2 Projenin Gelişiminde Rol Almak
- 5.3 Bir Projeyi Yürütme
- 5.4 Özet
-
6. GitHub
- 6.1 Bir Projeye Katkıda Bulunmak
- 6.2 Proje Bakımı
- 6.3 Kurumsal Yönetim
- 6.4 GitHub’ı otomatikleştirme
- 6.5 Özet
-
7. Git Araçları
- 7.1 Düzeltme Seçimi
- 7.2 Etkileşimli İzlemleme (Staging)
- 7.3 Saklama ve Silme
- 7.4 Çalışmanızı İmzalama
- 7.5 Arama
- 7.6 Geçmişi Yeniden Yazma
- 7.7 Reset Komutunun Gizemleri
- 7.8 İleri Seviye Birleştirme
- 7.9 Rerere
- 7.10 Git’le Hata Ayıklama
- 7.11 Alt Modüller
- 7.12 Demetleme (Bundling)
- 7.13 Git Nesnesini Değiştirme
- 7.14 Kimlik Bilgisi Depolama
- 7.15 Özet
-
8. Git’i Özelleştirmek
- 8.1 Git Yapılandırması
- 8.2 Git Nitelikleri
- 8.3 Git Kancaları (Hooks)
- 8.4 Bir Örnek: Mecburi Git Politikası
- 8.5 Özet
-
9. Git ve Diğer Sistemler
- 9.1 İstemci Olarak Git
- 9.2 Git’e Geçiş
- 9.3 Özet
-
10. Dahili Git Ögeleri
- 10.1 Tesisat ve Döşeme (Plumbing ve Porcelain)
- 10.2 Git Nesneleri
- 10.3 Git Referansları
- 10.4 Packfiles
- 10.5 Refspec
- 10.6 Transfer Protokolleri
- 10.7 Bakım ve Veri Kurtarma
- 10.8 Ortam Değişkenleri
- 10.9 Özet
-
A1. Ek bölüm A: Diğer Ortamlarda Git
- A1.1 Görsel Arayüzler
- A1.2 Visual Studio ile Git
- A1.3 Visual Studio Code ile Git
- A1.4 Eclipse ile Git
- A1.5 Sublime Text ile Git
- A1.6 Bash ile Git
- A1.7 Zsh ile Git
- A1.8 PowerShell ile Git
- A1.9 Özet
-
A2. Ek bölüm B: Git’i Uygulamalarınıza Gömmek
- A2.1 Git Komut Satırı
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Ek bölüm C: Git Komutları
- A3.1 Kurulum ve Yapılandırma Komutları
- A3.2 Proje Oluşturma Komutları
- A3.3 Kısaca Poz (Snapshot) Alma
- A3.4 Dallandırma ve Birleştirme Komutları
- A3.5 Projeleri Paylaşma ve Güncelleme Komutları
- A3.6 İnceleme ve Karşılaştırma Komutları
- A3.7 Hata Ayıklama (Debugging) Komutları
- A3.8 Yamalama (Patching)
- A3.9 E-Posta Komutları
- A3.10 Harici Sistemler
- A3.11 Yönetim
- A3.12 Tesisat (Plumbing) Komutları
A2.3 Ek bölüm B: Git’i Uygulamalarınıza Gömmek - JGit
JGit
Git’i bir Java programından kullanmak istiyorsanız, JGIT adlı tam özellikli bir GIT kütüphanesi bulunmaktadır. JGIT Java’da yerel olarak yazılmış, GIT’in nispeten tam özellikli bir uygulamasıdır ve Java topluluğunda yaygın olarak kullanılmaktadır. JGIT projesi Eclipse şemsiyesi altındadır https://www.eclipse.org/jgit/ adresinde bulunabilir.
Kurulum
Projenizi JGit’e bağlamanın ve kod yazmaya başlamanın çeşitli yolları vardır. Muhtemelen en kolayı Maven’i kullanmaktır; aşağıdaki kod parçacığını pom.xml dosyanızdaki <dependencies>` (bağımlılıklar) etiketine ekleyerek entegrasyonu gerçekleştirebilirsiniz:
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>3.5.0.201409260305-r</version>
</dependency>
Siz bunu okuduğunuzda sürüm
büyük olasılıkla ilerlemiş olacaktır; Güncellenmiş repo bilgileri için https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit adresini kontrol edin.
Bu adım tamamlandığında Maven, ihtiyaç duyacağınız JGit kitaplıklarını otomatik olarak alacak ve kullanacaktır.
İkilik bağımlılıkları kendiniz yönetmeyi tercih ederseniz, önceden oluşturulmuş JGit ikilik dosyalarına https://www.eclipse.org/jgit/download adresinden ulaşabilirsiniz. Aşağıdaki gibi bir komut çalıştırarak bunları projenize dahil edebilirsiniz:
javac -cp .:org.eclipse.jgit-3.5.0.201409260305-r.jar App.java
java -cp .:org.eclipse.jgit-3.5.0.201409260305-r.jar App
Tesisat (Plumbing)
JGit’in iki temel API seviyesi vardır: tesisat ve döşeme. Bunların terminolojisi Git’in kendisinden gelir ve JGit aşağı yukarı aynı türden alanlara bölünmüştür: döşeme API’leri, ortak kullanıcı düzeyindeki eylemler (normal bir kullanıcının Git komut satırını kullanacağı türden şeyler) için kullanıcı dostu bir ön yüzdür, tesisat API’leri ise düşük seviyeli repo nesneleriyle doğrudan etkileşim kurmak içindir.
Çoğu JGit oturumunun başlangıç noktası Repository
sınıfıdır ve yapmak isteyeceğiniz ilk şey onun bir örneğini oluşturmaktır.
Dosya sistemi tabanlı bir repo için (evet, JGit diğer depolama modellerine izin verir), bu FileRepositoryBuilder
kullanılarak gerçekleştirilir:
// Create a new repository
Repository newlyCreatedRepo = FileRepositoryBuilder.create(
new File("/tmp/new_repo/.git"));
newlyCreatedRepo.create();
// Open an existing repository
Repository existingRepo = new FileRepositoryBuilder()
.setGitDir(new File("my_repo/.git"))
.build();
Oluşturucu, programınızın tam olarak nerede bulunduğunu bilse de bilmese de, bir Git reposu bulmak için ihtiyaç duyduğu her şeyi sağlayan akıcı bir API’ye sahiptir.
Ortam değişkenlerini (.readEnvironment()
) kullanabilir, çalışma dizinindeki bir yerden başlayıp, arama yapabilir (.setWorkTree(…).findGitDir()
) veya yukarıdaki gibi bilinen bir .git
dizinini açabilir.
Bir Repository
örneğine sahip olduğunuzda, onunla her türlü şeyi yapabilirsiniz.
İşte hızlı bir örnekleme:
// Get a reference
Ref master = repo.getRef("master");
// Get the object the reference points to
ObjectId masterTip = master.getObjectId();
// Rev-parse
ObjectId obj = repo.resolve("HEAD^{tree}");
// Load raw object contents
ObjectLoader loader = repo.open(masterTip);
loader.copyTo(System.out);
// Create a branch
RefUpdate createBranch1 = repo.updateRef("refs/heads/branch1");
createBranch1.setNewObjectId(masterTip);
createBranch1.update();
// Delete a branch
RefUpdate deleteBranch1 = repo.updateRef("refs/heads/branch1");
deleteBranch1.setForceUpdate(true);
deleteBranch1.delete();
// Config
Config cfg = repo.getConfig();
String name = cfg.getString("user", null, "name");
Burada pek çok şey gerçekleştiği için her seferinde bir bölüm üzerinden geçelim.
İlk satır master
referansa bir işaretçi alır.
JGit refs/heads/master
konumunda bulunan gerçek master
referansını otomatik olarak alır ve referans hakkında bilgi almanıza olanak tanıyan bir nesne döndürür.
Adı (.getName()
) ve doğrudan referansın hedef nesnesini (.getObjectId()
) ya da sembolik bir referansla gösterilen referansı (.getTarget()
) alabilirsiniz.
Ref nesneleri ayrıca etiket referanslarını ve nesnelerini temsil etmek için de kullanılır; bu nedenle, etiketin (potansiyel olarak uzun) bir etiket nesneleri dizisinin son hedefini işaret ettiği anlamına gelen peeled
(soyulmuş) olup olmadığını sorabilirsiniz.
İkinci satır, ObjectId örneği olarak döndürülen master
referansının hedefini alır.
ObjectId Git’in nesne veritabanında bulunabilen veya bulunmayan bir nesnenin SHA-1 karmasını temsil eder.
Üçüncü satır benzerdir ancak JGit’in ters ayrıştırma sözdizimini nasıl işlediğini gösterir (bununla ilgili daha fazla bilgi için bkz. Dal Referansları).
Git’in anladığı herhangi bir nesne belirtecini iletebilirsiniz ve JGit o nesne için geçerli bir ObjectId veya null
döndürecektir.
Sonraki iki satır, bir nesnenin ham içeriğinin nasıl yükleneceğini gösterir.
Bu örnekte, nesnenin içeriğini doğrudan stdout’a aktarmak için ObjectLoader.copyTo()'yu çağırıyoruz, ancak ObjectLoader'ın ayrıca bir nesnenin türünü ve boyutunu okumak ve onu bir bayt dizisi olarak döndürmek için de yöntemleri vardır.
Büyük nesneler için (burada `.isLarge()
, true
değerini döndürür), ham nesne verilerini hepsini aynı anda belleğe çekmeden okuyabilen OutputStream benzeri bir nesne elde etmek için .openStream()
çağrısını yapabilirsiniz.
Sonraki birkaç satır yeni bir dal oluşturmak için ne gerektiğini gösteriyor.
Bir RefUpdate örneği oluşturuyoruz, bazı parametreleri yapılandırıyoruz ve değişikliği tetiklemek için .update()
çağrısını yapıyoruz.
Doğrudan bunu takip eden kod aynı dalı silmek için kullanılır.
Bunun çalışması için .setForceUpdate(true)`nin gerekli olduğunu unutmayın; aksi takdirde `.delete()
çağrısı REJECTED
sonucunu döndürecek ve hiçbir şey olmayacaktır.
Son örnek, Git yapılandırma dosyalarından user.name
değerinin nasıl alınacağını gösterir.
Bu Config örneği, yerel yapılandırma için daha önce açtığımız repoyu kullanır, ancak genel ve sistem yapılandırma dosyalarını otomatik olarak algılayacak ve onlardan değerleri okuyacaktır.
Bu, tam tesisat API’sinin yalnızca küçük bir örneğidir (daha birçok yöntem ve sınıf mevcuttur).
Ayrıca burada JGit’in istisnaları kullanarak hataları nasıl ele aldığı gösterilmemiştir.
JGit API’leri bazen standart Java istisnaları (IOException
gibi) atar, ancak aynı zamanda JGit’e özgü sağlanan bir dizi istisna türü de vardır (NoRemoteRepositoryException
, CorruptObjectException
, ve NoMergeBaseException
gibi).
Döşeme (Porcelain)
Tesisat API’leri oldukça eksiksizdir ancak dizine bir dosya eklemek veya yeni bir katkıda bulunmak gibi ortak hedeflere ulaşmak için bunları bir araya getirmek zahmetli olabilir.
JGit bu konuda yardımcı olmak için daha üst düzeyde bir API seti sağlar ve bu API’lerin giriş noktası Git
sınıfıdır:
Repository repo;
// construct repo...
Git git = new Git(repo);
Git sınıfı, oldukça karmaşık bazı davranışlar oluşturmak için kullanılabilecek builder tarzı, bir dizi üst düzey yönteme sahiptir.
git ls-remote
gibi bir şey yaparak şu örneğe bakalım:
CredentialsProvider cp = new UsernamePasswordCredentialsProvider("username", "p4ssw0rd");
Collection<Ref> remoteRefs = git.lsRemote()
.setCredentialsProvider(cp)
.setRemote("origin")
.setTags(true)
.setHeads(false)
.call();
for (Ref ref : remoteRefs) {
System.out.println(ref.getName() + " -> " + ref.getObjectId().name());
}
Bu Git sınıfında ortak bir kalıptır; metodlar, parametreleri ayarlamak için metod çağrılarını zincirlemenize izin veren bir komut nesnesi döndürür. Bunlar .call()
çağrısı yaptığınızda yürütülür.
Bu durumda, origin
uzaktan reposundan etiketler istiyoruz, ancak uçları (HEAD) istemiyoruz.
Ayrıca kimlik doğrulama için CredentialsProvider
nesnesinin kullanıldığına da dikkat edin.
Git sınıfı aracılığıyla; add
, blame
, commit
, clean
, push
, rebase
, revert
, reset
ve daha birçok başka komut mevcuttur.
İleri Okumalar
Bu JGit’in tüm parçalarının sadece küçük bir örneklemesidir. Eğer daha fazla bilgi edinmek istiyorsanız, daha fazla bilgi ve ilham alabileceğiniz yerleri burada bulabilirsiniz:
-
Resmi JGit API kılavuzlarını https://www.eclipse.org/jgit/documentation adresinde bulabilirsiniz. Bunlar standart Javadoc’tur, dolayısıyla favori JVM IDE’niz bunları yerel olarak da yükleyebilecektir.
-
https://github.com/centic9/jgit-cookbook adresindeki JGit Kullanım Kitabı, JGit ile belirli görevlerin nasıl yapılacağına dair birçok örnek içerir.