-
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ı
8.1 Git’i Özelleştirmek - Git Yapılandırması
Şimdiye kadar, Git’in nasıl çalıştığını ve nasıl kullanılacağını, ve kullanımınızı kolay ve verimli hale getirmek için Git’in sunduğu birçok aracı tanıttık. Bu bölümde, çeşitli önemli yapılandırma ayarlarını ve kancalar sistemini tanıtarak, Git’i daha özelleştirilmiş bir şekilde çalıştırmanın yollarını göreceğiz. Bu araçlarla, Git’i tam olarak sizin, şirketiniz veya grubunuzun ihtiyaç duyduğu şekilde çalıştırmak çok daha kolay olacaktır.
Git Yapılandırması
Başlangıç bölümünde kısaca okuduğunuz gibi, git config
komutu ile Git yapılandırma ayarlarını belirleyebilirsiniz.
İlk yapmanız gereken şeylerden biri adınızı ve e-posta adresinizi ayarlamaktı.
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
Şimdi, Git kullanımınızı özelleştirmek için bu şekilde belirleyebileceğiniz daha ilginç seçeneklerden birkaçını öğreneceksiniz.
İlk olarak, hızlı bir gözden geçirme: Git, istediğiniz varsayılan olmayan davranışı belirlemek için bir dizi yapılandırma dosyası kullanır.
Git, bu değerleri aramak için ilk olarak sistem genelinde /etc/gitconfig
dosyasına bakar; bu dosya, sistemdeki her kullanıcıya ve onların tüm repolarına uygulanan ayarları içerir.
git config
komutuna --system
seçeneğini eklerseniz, Git özellikle bu dosyadan okur ve buraya yazar.
Git’in bir sonraki baktığı yer, kullanıcıya özgü olan ~/.gitconfig
(ya da ~/.config/git/config
) dosyasıdır.
--global
seçeneğini ekleyerek Git’in bu dosyayı okuyup yazdırmasını sağlayabilirsiniz.
Son olarak, Git, şu anda kullandığınız repoya ait olan Git dizinindeki yapılandırma değerlerini arar (.git/config
).
Bu değerler yalnızca o repoya özgüdür ve git config
komutuna --local
seçeneğini eklemeyi temsil eder.
(Hangi düzeyde çalışmak istediğinizi belirtmezseniz, varsayılan olarak bu ayar kullanılır.)
Bu "düzeylerin" (sistem, global, yerel) her biri, önceki düzeydeki değerleri geçersiz kılar; bu nedenle .git/config
dosyasındaki değerler, örneğin, /etc/gitconfig
dosyasındakilerin önüne geçer.
Not
|
Git’in yapılandırma dosyaları düz metindir. Bu nedenle bu değerleri doğru sözdizimini eklemek şartıyla, manuel olarak da belirleyebilirsiniz.
Ancak genellikle |
Temel İstemci Yapılandırması
Git tarafından tanınan yapılandırma seçenekleri iki kategoriye ayrılır: istemci tarafı ve sunucu tarafı. Seçeneklerin çoğu istemci tarafındadır (kişisel çalışma tercihlerinizi yapılandırır). Çok fazla yapılandırma seçeneği desteklenir, ancak bunların büyük bir kısmı yalnızca belirli uç durumlarda kullanışlıdır (burada sadece en yaygın ve kullanışlı seçenekleri ele alacağız). Git’in kullandığınız sürümünün tanıdığı tüm seçeneklerin bir listesini görmek istiyorsanız, şunu çalıştırabilirsiniz:
$ man git-config
Bu komut, detaylı bir şekilde mevcut tüm seçenekleri listeler. Bu başvuru materyalini ayrıca şu adreste bulabilirsiniz: https://git-scm.com/docs/git-config.
core.editor
Git varsayılan olarak, bir kabuk (shell) ortam değişkeni olan VISUAL
veya EDITOR
'da sizin belirttiğiniz varsayılan metin düzenleyicisini kullanır, aksi durumdaysa katkı ve etiket mesajlarını oluşturmak ve düzenlemek için vi
düzenleyicisine geri döner.
Bu varsayılanı başka bir şeye değiştirmek için, core.editor
ayarını kullanabilirsiniz:
$ git config --global core.editor emacs
Artık, varsayılan kabuk düzenleyiciniz ne olursa olsun, Git mesajları düzenlemek için Emacs’i başlatacaktır.
commit.template
Bu değeri sisteminizde bir dosyanın yoluna ayarlarsanız, Git bu dosyayı bir katkı oluştururken varsayılan başlangıç mesajı olarak kullanacaktır. Özel bir katkı şablonu oluşturmanın önemi: bir katkı mesajı oluştururken, (kendinize veya başkalarına) doğru biçim ve stili hatırlatmak için kullanılabilmesidir.
Örneğin, ~/.gitmessage.txt
adresinde şöyle bir şablon dosyası düşünün:
Subject line (try to keep under 50 characters)
Multi-line description of commit,
feel free to be detailed.
[Ticket: X]
Bu katkı şablonunun, katkı işleyen kişiyi; ( git log --oneline
çıktısı için) başlık satırını kısa tutmaya, altına daha fazla ayrıntı eklemeye ve varsa bir soruna veya iş paketi takip numarasına atıfta bulunmaya yönelttiğini görebilirsiniz.
git commit
komutunu çalıştırdığınızda düzenleyicinizde görünen varsayılan mesajı bu şablon olarak kullanılması için, commit.template
yapılandırma değerini ayarlayın:
$ git config --global commit.template ~/.gitmessage.txt
$ git commit
Daha sonra, bir katkı işlerken, düzenleyiciniz şöyle bir şey gösterecek:
Subject line (try to keep under 50 characters)
Multi-line description of commit,
feel free to be detailed.
[Ticket: X]
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: lib/test.rb
#
~
~
".git/COMMIT_EDITMSG" 14L, 297C
Eğer ekibinizin bir katkı mesajı politikası varsa, o politikanın bir şablonunu sisteminize yerleştirmek ve Git’i varsayılan olarak kullanması için yapılandırmak, bu politikanın düzenli olarak uygulanma şansını arttıracaktır.
core.pager
Bu ayar, Git’in log
ve diff
gibi çıktıları yazdırdığında hangi sayfa düzeninin kullanılacağını belirler.
Bunu varsayılan olarak less
şeklinde bırakabilir, more
olarak ayarlanabilir veya boş bir dize olarak ayarlayarak devre dışı bırakabilirsiniz.
$ git config --global core.pager ''
Bunu çalıştırırsanız, ne kadar uzun olursa olsun, Git tüm komutların çıktısını ekrana yazdırır.
user.signingkey
Eğer (Çalışmanızı İmzalama bölümünde anlatıldığı gibi) imzalı açıklama etiketleri oluşturuyorsanız, GPG imzalama anahtarınızı bir yapılandırma ayarı olarak belirlemeniz işlerinizi kolaylaştırır. Anahtar kimliğinizi şu şekilde ayarlayın:
$ git config --global user.signingkey <gpg-key-id>
Artık git tag
komutu ile anahtarınızı belirtmeden etiketleri her seferinde imzalayabilirsiniz.
$ git tag -s <tag-name>
core.excludesfile
(Dosyaları Yoksayma (Ignore) bölümünde anlatıldığı gibi) projenizin .gitignore
dosyasına belli dosya yolu desenleri koyarak, Git’in o dosyaları takip edilmeyen dosyalar olarak görmemesini veya git add
komutunu çalıştırdığınızda onları izleme almaya çalışmamasını sağlayabilirsiniz.
Ancak bazen, çalıştığınız tüm repolarda belirli dosyaları yok saymak istersiniz.
Bilgisayarınızda macOS çalışıyorsa, muhtemelen .DS_Store
dosyalarını biliyorsunuzdur.
Tercih ettiğiniz metin düzenleyici Emacs veya Vim ise, ~
ile biten veya .swp
ile biten dosya adlarını biliyorsunuzdur.
Bu ayar, bir tür global .gitignore
dosyası yazmanızı sağlar.
Bu içeriklere sahip bir ~/.gitignore_global
dosyası oluşturur:
*~
.*.swp
.DS_Store
-
ve
git config --global core.excludesfile ~/.gitignore_global
komutunu çalıştırırsanız, Git artık bu dosyalarla ilgili sizi bir daha rahatsız etmeyecek.
help.autocorrect
Eğer bir komutu yanlış yazarsanız, size şuna benzer bir şey gösterir:
$ git chekcout master
git: 'chekcout' is not a git command. See 'git --help'.
Did you mean this?
checkout
Git yardımcı olmak için ne anlatmaya çalıştığınızı anlamaya çalışır, ama sizin yerinize kendisi yapmaz.
help.autocorrect
'i 1 olarak ayarlarsanız, Git bu komutu sizin için düzeltip otomatik olarak çalıştıracaktır:
$ git chekcout master
WARNING: You called a Git command named 'chekcout', which does not exist.
Continuing under the assumption that you meant 'checkout'
in 0.1 seconds automatically...
"0.1 saniye" kısmına dikkat edin. help.autocorrect
aslında onda bir saniyeyi temsil eden bir tamsayıdır.
Bu nedenle, onu 50 olarak ayarlarsanız; Git size komutu otomatik düzeltmeden önce fikrinizi değiştirebilmeniz için 5 saniye verecektir.
Git’te Renkler
Git, komut çıktısını hızlı ve kolay bir şekilde görsel olarak ayrıştırmaya büyük ölçüde yardımcı olan renkli terminal çıktısını tam destekler. Birkaç seçenek, renklendirmeyi tercihinize göre ayarlamanıza yardımcı olabilir.
color.ui
Git, çoğu çıktıyı otomatik olarak renklendirir, ancak bu davranışı beğenmezseniz bir ana anahtar da vardır. Git’in tüm renkli terminal çıktısını kapatmak için şunu yapın:
$ git config --global color.ui false
Varsayılan ayar auto
'dur.
Bu, çıktı doğrudan bir terminale giderken renklendirme yapar, ancak çıktı bir boru (pipe) veya bir dosyaya yönlendirildiğinde renk kontrol kodlarını atlar.
Ayrıca, terminal ve borular arasındaki farkı yok saymak için onu always
olarak da ayarlayabilirsiniz.
Bunu nadiren isteyeceksiniz; çoğu zaman, yönlendirilmiş çıktınızda renk kodları istiyorsanız, Git buna zorlamak için komuta bir --color
bayrağı geçirerek bunu sağlayabilirsiniz.
Varsayılan ayar zaten neredeyse her zaman isteyeceğiniz şekildedir.
color.*
Belirli komutların nasıl renklendirileceği hakkında daha özelleştirici olmak isterseniz, Git, fiile özgü renklendirme ayarları da sunar.
Her birini true
, false
veya always
olarak ayarlayabilirsiniz:
color.branch color.diff color.interactive color.status
Ayrıca, her birinin (her rengi geçersiz kılacak şekilde) çıktının belirli bölümleri için belirli renkler ayarlamak için kullanabileceğiniz alt ayarları vardır. Örneğin, diff çıktınızdaki meta bilgilerini mavi ön plan, siyah arka plan ve kalın metin olarak ayarlamak için şunu çalıştırabilirsiniz:
$ git config --global color.diff.meta "blue black bold"
Renk seçeneğini aşağıdaki değerlerden biri olarak ayarlayabilirsiniz: normal
, black
, red
, green
, yellow
, blue
, magenta
, cyan
, veya white
.
Önceki örnekteki gibi kalın gibi bir öznitelik istiyorsanız, bold
, dim
, ul
(altını çizmek), blink
, ve reverse
(ön planı ve arka planı değiştirmek) seçeneklerinden birini seçebilirsiniz.
Harici Birleştirme ve Fark Araçları
Git’in bir diff için dahili bir uygulaması olsa da, bunun yerine harici bir araç kurabilirsiniz. Ayrıca, birleşim çakışmalarını manuel olarak çözmek yerine görsel bir çözüm aracı da kurabilirsiniz. Ücretsiz ve güzel görsel araç olduğu için "Perforce Visual Merge Tool (P4Merge)"'i diff ve birleştirme çözümleriniz için nasıl kuracağınızı göstereceğiz.
P4Merge tüm büyük platformlarda çalışır, bu yüzden kullancak olursanız, sorunsuzca çalıştırabiliyor olmalısınız.
Örneklerde macOS ve Linux sistemlerinde çalışan dizin isimlerini kullanacağız; Windows için, /usr/local/bin
'i cihazınızdaki yürütülebilir yolla değiştirmeniz gerekecektir.
Başlamak için, Perforce’tan P4Merge’i indirin: https://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools
Sonraki adımda, komutlarınızı çalıştırmak için harici sargı betiklerini kuracaksınız.
Bu örnekte yürütmek için macOS dizinini kullanacağız; diğer sistemlerde, p4merge
ikilik dosyanızın kurulu olduğu dizin olacaktır.
İkilik dosyanızı çağıran bir birleştirme sargı betiği olan, extMerge
adındaki betiği sağlanan tüm argümanlarla kurun:
$ cat /usr/local/bin/extMerge
#!/bin/sh
/Applications/p4merge.app/Contents/MacOS/p4merge $*
Diff sargısı, yedi argümanın sağlandığını kontrol eder ve bunlardan ikisini birleştirme betiğinize aktarır. Git diff programına aşağıdaki argümanları varsayılan olarak iletir:
path old-file old-hex old-mode new-file new-hex new-mode
Sadece old-file
ve new-file
argümanlarına ihtiyacınız olduğu için, ihtiyacınız olanları iletmek için sargı betiğini kullanırsınız.
$ cat /usr/local/bin/extDiff
#!/bin/sh
[ $# -eq 7 ] && /usr/local/bin/extMerge "$2" "$5"
Bu araçların yürütülebilir olduğundan da emin olmanız gerekir:
$ sudo chmod +x /usr/local/bin/extMerge
$ sudo chmod +x /usr/local/bin/extDiff
Şimdi yapılandırma dosyanızı özel bir birleştirme çözümü ve diff araçları kullanacak şekilde ayarlayabilirsiniz.
Bu bir dizi özel ayarı gerektirir: Git’e hangi stratejiyi kullanacağını söylemek için merge.tool
, komutu nasıl çalıştıracağını belirtmek için mergetool.<tool>.cmd
, programın çıkış kodunun birleştirme çözümünün başarılı olup olmadığını belirtmek için mergetool.<tool>.trustExitCode
, ve diff için çalıştırılacak komutu belirtmek için diff.external
.
Bu yüzden ya dört yapılandırma komutunu da çalıştırırsınız
$ git config --global merge.tool extMerge
$ git config --global mergetool.extMerge.cmd \
'extMerge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"'
$ git config --global mergetool.extMerge.trustExitCode false
$ git config --global diff.external extDiff
ya da ~/.gitconfig
dosyanızı düzenleyerek bu satırları eklersiniz:
[merge]
tool = extMerge
[mergetool "extMerge"]
cmd = extMerge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"
trustExitCode = false
[diff]
external = extDiff
Tüm bunları ayarlandıktan sonra, şunun gibi diff komutlarını çalıştırırsanız:
$ git diff 32d1776b1^ 32d1776b1
Komut satırında diff çıktısı almak yerine, Git P4Merge’i başlatır, ki bu da aşağı yukarı şöyle görünür:
İki dalı birleştirmeye çalışırsınız ve sonrasında birleştirme çakışmaları oluşursa, git mergetool
komutunu çalıştırabilirsiniz; bu size bu GUI (görsel arayüz) aracılığıyla çakışmaları çözme fırsatı sunar.
Bu sargı kurulumunun güzel yanı, diff ve birleştirme araçlarınızı kolayca değiştirebilmenizdir.
Örneğin, extDiff
ve extMerge
araçlarınızı KDiff3 aracını çalıştıracak şekilde değiştirmek için yapmanız gereken tek şey extMerge
dosyanızı düzenlemektir:
$ cat /usr/local/bin/extMerge
#!/bin/sh
/Applications/kdiff3.app/Contents/MacOS/kdiff3 $*
Git artık, diff görüntülemek ve çakışmaları çözmek için KDiff3 aracını kullanacaktır.
Git, cmd yapılandırmasını ayarlamadan önce bir dizi başka birleştirme çözüm aracını kullanmak üzere önceden ayarlanmıştır. Desteklediği araçların bir listesini görmek için şunu deneyin:
$ git mergetool --tool-help
'git mergetool --tool=<tool>' may be set to one of the following:
emerge
gvimdiff
gvimdiff2
opendiff
p4merge
vimdiff
vimdiff2
The following tools are valid, but not currently available:
araxis
bc3
codecompare
deltawalker
diffmerge
diffuse
ecmerge
kdiff3
meld
tkdiff
tortoisemerge
xxdiff
Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.
Eğer KDiff3 aracını, diff için değil de sadece birleştirme çözümü için kullanmak istiyorsanız; ama kdiff3 yürütülebilir dizininizde ise, o zaman şunu çalıştırabilirsiniz:
$ git config --global merge.tool kdiff3
Eğer extMerge
ve extDiff
dosyalarını kurmak yerine bunu çalıştırırsanız, Git birleştirme çözümü için KDiff3’ü ve diff için normal Git diff aracını kullanacaktır.
Biçimlendirme ve Boşluklar
Biçimlendirme ve boşluk sorunları, özellikle platformlar arası işbirliğinde birçok geliştiricinin karşılaştığı en sinir bozucu ve gözden kaçması kolay sorunlardan bazılarıdır. Editörler tarafından sessizce geliştirilen yamalar veya diğer işbirliği çalışmaları yüzünden sisteminize boşluk değişiklikleri aktarılması çok kolaydır. Özellikle dosyalarınız Windows sistemine bir şekilde dokunmuşsa, satır sonları değiştirilmiş olabilir. Git’in bu sorunlarla ilgili yardımcı olmak için, birkaç yapılandırma seçeneği vardır.
core.autocrlf
Windows üzerinde program geliştiriyor ama Windows kullanmayan insanlarla çalışıyorsanız (veya tam tersi), muhtemelen bir noktada satır sonu sorunlarıyla karşılaşacaksınız. Bunun nedeni, Windows’un dosyalarda yeni satırlar için hem bir taşıma-baş (CR: carriage-return) karakteri hem de bir satır besleme (LF: linefeed) karakteri kullanılırken, macOS ve Linux sistemlerinin ise yalnızca satır besleme karakterini kullanmasıdır. Bu, platformlar arası çalışmanın incelikli ama son derece sinir bozucu bir gerçeğidir. Windows’ta birçok editör mevcut LF tarzı satır sonu karakterlerini sessizce CRLF ile değiştirir veya kullanıcı enter tuşuna bastığında her iki satır sonu karakterini de ekler.
Git, bir dosyayı dizine eklerken CRLF satır sonlarını otomatik olarak LF’ye dönüştürerek ve kodu dosya sisteminize çıkardığınızda tersini yaparak bunu yönetebilir.
Bu işlevselliği core.autocrlf
ayarı ile etkinleştirebilirsiniz.
Eğer Windows kullanıyorsanız, bunu true
olarak ayarlayın: bunu yapmak, kodu çıkarırken LF sonlarını CRLF’ye dönüştürür:
$ git config --global core.autocrlf true
Eğer LF satır sonları kullanan bir Linux veya macOS sistemindesiniz, o zaman dosyaları çıkarırken Git’in bunları otomatik olarak dönüştürmesini istemezsiniz; ancak, yanlışlıkla CRLF sonlarına sahip bir dosya tanıtılırsa, o zaman Git’in bunu düzeltmesini isteyebilirsiniz.
core.autocrlf
ayarını input
olarak ayarlayarak Git’e CRLF’yi LF’ye dönüştürmesini ancak tersini yapmamasını söyleyebilirsiniz:
$ git config --global core.autocrlf input
Bu yapılandırma size, Windows çıkarımlarında CRLF sonları bırakırken, macOS ve Linux sistemlerinde ve repoda LF sonları sağlamalıdır.
Eğer Windows programcısıysanız ve yalnızca Windows’a özgü bir proje yapıyorsanız; bu yapılandırma değerini false
olarak ayarlayarak, bu işlevselliği kapatabilir ve taşıma karakterlerini repoya kaydedebilirsiniz:
$ git config --global core.autocrlf false
core.whitespace
Git, bazı boşluk sorunlarını algılamak ve düzeltmek için önceden ayarlanmıştır. Altı temel boşluk sorununu arayabilir: Bunların üçü varsayılan olarak etkinleştirilmiştir ve kapatılabilir, üçü ise varsayılan olarak devre dışı bırakılmıştır ancak etkinleştirilebilir.
Varsayılan olarak açılan üç özellik: satırın sonundaki boşlukları arayan blank-at-eol
, dosyanın sonundaki boş satırları fark eden blank-at-eof
, ve bir satırın başında sekme öncesinde boşluk arayan space-before-tab
'dir.
Varsayılan olarak devre dışı bırakılan ancak etkinleştirilebilecek üç özellik ise: bir satırın başında boşluklar yerine sekme ile başlayan satırları arayan indent-with-non-tab
(ve tabwidth
seçeneği tarafından kontrol edilir), bir satırın girinti kısmındaki sekmeleri izleyen tab-in-indent
, ve satırların sonunda taşıma karakterlerinin kabul edilebilir olduğunu belirten cr-at-eol
'dür.
Git’e bunlardan hangisinin etkinleştirilmesini istediğinizi, core.whitespace
'i açık veya kapalı olmasını istediğiniz değerlere virgülle ayırarak ayarlayarak, söyleyebilirsiniz.
Bir seçeneği devre dışı bırakmak için adının önüne -
ekleyebilirsiniz, veya tamamen ayar dizgisinden çıkararak varsayılan değeri kullanabilirsiniz.
Örneğin, space-before-tab
dışındaki tüm özelliklerin ayarlanmasını istiyorsanız, şunu yapabilirsiniz (hem blank-at-eol
hem de blank-at-eof
'yi kapsayan trailing-space
kısaltmasıyla):
$ git config --global core.whitespace \
trailing-space,-space-before-tab,indent-with-non-tab,tab-in-indent,cr-at-eol
Veya yalnızca özelleştirme kısmını belirtebilirsiniz:
$ git config --global core.whitespace \
-space-before-tab,indent-with-non-tab,tab-in-indent,cr-at-eol
git diff
komutunu çalıştırdığınızda, Git bu sorunları algılayacak ve bunları katkılamadan önce düzeltebilmeniz için de renklendirecektir.
Ayrıca, git apply
ile yamaları uygularken size yardımcı olmak için bu değerleri kullanacaktır.
Yamaları uygularken, Git’ten belirtilen boşluk sorunlarıyla ilgili sizi uyarmanızı isteyebilirsiniz:
$ git apply --whitespace=warn <patch>
Ya da Git’ten yamanın uygulanmasından önce sorunu otomatik olarak düzeltmeye çalışmasını isteyebilirsiniz:
$ git apply --whitespace=fix <patch>
Bu seçenekler git rebase
komutuna da uygulanır.
Eğer kodunuzu boşluk sorunlarını çözmeden katkılamış, ancak henüz üstakıma itmemişseniz; Git’in yamaları yeniden yazarken boşluk sorunlarını otomatik olarak düzeltmesi için git rebase --whitespace=fix
komutunu çalıştırabilirsiniz.
Sunucu Yapılandırması
Git’in sunucu tarafında bu kadar çok yapılandırma seçeneği mevcut değildir, ancak not almak isteyebileceğiniz birkaç ilginç seçenek vardır.
receive.fsckObjects
Git, bir itme işlemi sırasında alınan her nesnenin hala SHA-1 toplamına uymasını ve geçerli nesnelere işaret etmesini sağlayabilir.
Ancak, bunu varsayılan olarak yapmaz. Bu oldukça maliyetli bir işlemdir ve özellikle büyük drpolar veya itme işlemlerinde süreci yavaşlatabilir.
Her itme işleminde Git’in nesne tutarlılığını kontrol etmesini istiyorsanız, receive.fsckObjects
ayarını true olarak ayarlayarak Git’i buna zorlayabilirsiniz:
$ git config --system receive.fsckObjects true
Artık, Git bir itme talebini kabul etmeden önce, reponun bütünlüğünü kontrol edecek ve hatalı (veya kötü niyetli) istemcilerin bozuk veri eklemesini engellemek için çaba gösterecektir.
receive.denyNonFastForwards
Zaten ittiğiniz katkıları yeniden temeller (rebase) ve sonra tekrar itmeye çalışırsanız veya uzak dalın şu anda işaret ettiği katkıyı içermeyen dalına bir katkı göndermeye çalışırsanız reddedilirsiniz. Bu genellikle iyi bir politikadır; ancak yeniden temelleme durumunda, ne yaptığınızı bildiğinizden eminseniz ve uzak şubeyi Push komutunuza bir -f bayrağıyla güncellemeye zorlayabilirsiniz.
, uzak bir dala bir katkı itmek için, uzak dalın şu anda işaretlediği katkıyı içermeyen bir katkı iterseniz, reddedileceksiniz.
Bu genellikle iyi bir politikadır; ancak yeniden temelleme durumunda, ne yaptığınızı bildiğinizden eminseniz, itme komutunuza -f
bayrağı ekleyerek uzak dalı zorla güncelleyebilirsiniz.
Git’e zorla itme işlemlerini reddetmesini söylemek için receive.denyNonFastForwards
ayarını belirleyin:
$ git config --system receive.denyNonFastForwards true
Bunu yapmanın diğer yolu, birazdan ele alacağımız sunucu tarafı kabul kancaları aracılığıyladır. Bu yaklaşım, belirli bir kullanıcı alt kümesine zorlamasız itmelere izin vermek gibi daha karmaşık işler yapmanıza olanak tanır.
receive.denyDeletes
denyNonFastForwards
politikasına yönelik çalışmaların biri, kullanıcının dalı silip ardından yeni referansla tekrar yüklemesidir.
Bunu önlemek için, receive.denyDeletes
ayarını true olarak ayarlayın:
$ git config --system receive.denyDeletes true
Bu ayar, dalların veya etiketlerin herhangi birinin silinmesini reddeder (hiçbir kullanıcı bunu yapamaz). Uzak dalları kaldırmak için, ref dosyalarını sunucudan manuel olarak kaldırmanız gerekir. Ayrıca, Bir Örnek: Mecburi Git Politikası bölümünde öğreneceğiniz gibi, ACL’ler aracılığıyla kullanıcı bazında bunu yapmanın daha ilginç yolları da vardır.