CINXE.COM
Git - Alt Modüller
<!DOCTYPE html> <html lang="tr"> <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 - Alt Modüller</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-Tools-Submodules">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Git-Al%c9%99tl%c9%99ri-Alt-Modullar">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-Tools-Submodule">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Herramientas-de-Git-Subm%c3%b3dulos">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Utilitaires-Git-Sous-modules">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%e3%81%95%e3%81%be%e3%81%96%e3%81%be%e3%81%aa%e3%83%84%e3%83%bc%e3%83%ab-%e3%82%b5%e3%83%96%e3%83%a2%e3%82%b8%e3%83%a5%e3%83%bc%e3%83%ab">日本語</a>,</td></tr> <tr><td><a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-%ec%84%9c%eb%b8%8c%eb%aa%a8%eb%93%88">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Git-Tools-Submodules">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/%d0%98%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d1%8b-Git-%d0%9f%d0%be%d0%b4%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d0%b8">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Orodja-Git-Podmoduli">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Mga-Git-na-Kasangkapan-Mga-Submodule">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/%d0%86%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b8-Git-%d0%9f%d1%96%d0%b4%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d1%96">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e5%ad%90%e6%a8%a1%e5%9d%97">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/Git-Tools-Submodules">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/Git-%d0%90%d0%bb%d0%b0%d1%82%d0%ba%d0%b8-Submodules">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Narz%c4%99dzia-Gita-Modu%c5%82y-zale%c5%bcne">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%93%d0%b8%d1%82-%d0%b0%d0%bb%d0%b0%d1%82%d0%b8-%d0%9f%d0%be%d0%b4%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d0%b8">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Git-Tools-Qism-modullar-Submodule">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/Git-%e5%b7%a5%e5%85%b7-Submodules">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Git-Tools-Submodules">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/Git-Tools-Submodules" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Git-Tools-Submodules">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Git-Tools-Submodules">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Git-Tools-Submodules">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Git-Tools-Submodules">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Ferramentas-do-Git-Submodules">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Git-Tools-Submodules">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Alt-Mod%c3%bcller">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-tr">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/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-S%c3%bcr%c3%bcm-Denetimi">Başlangıç</a></h2> <ol> <li> 1.1 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-S%c3%bcr%c3%bcm-Denetimi">Sürüm Denetimi</a> </li> <li> 1.2 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-Git%e2%80%99in-K%c4%b1sa-Tarih%c3%a7esi">Git’in Kısa Tarihçesi</a> </li> <li> 1.3 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-Git-Nedir%3F">Git Nedir?</a> </li> <li> 1.4 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-Komut-Sat%c4%b1r%c4%b1">Komut Satırı</a> </li> <li> 1.5 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-Git%e2%80%99i-Y%c3%bcklemek">Git’i Yüklemek</a> </li> <li> 1.6 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-Git%e2%80%99i-%c4%b0lk-Defa-Kurmak">Git’i İlk Defa Kurmak</a> </li> <li> 1.7 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-Yard%c4%b1m-Almak">Yardım Almak</a> </li> <li> 1.8 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/tr/v2/Git-Temelleri-Bir-Git-Reposu-Olu%c5%9fturma/Kopyalama">Git Temelleri</a></h2> <ol> <li> 2.1 <a href="/book/tr/v2/Git-Temelleri-Bir-Git-Reposu-Olu%c5%9fturma/Kopyalama">Bir Git Reposu Oluşturma/Kopyalama</a> </li> <li> 2.2 <a href="/book/tr/v2/Git-Temelleri-De%c4%9fi%c5%9fikliklerin-Repoya-Kaydedilmesi">Değişikliklerin Repoya Kaydedilmesi</a> </li> <li> 2.3 <a href="/book/tr/v2/Git-Temelleri-Katk%c4%b1-Ge%c3%a7mi%c5%9fini-G%c3%b6r%c3%bcnt%c3%bcleme">Katkı Geçmişini Görüntüleme</a> </li> <li> 2.4 <a href="/book/tr/v2/Git-Temelleri-De%c4%9fi%c5%9fiklikleri-Geri-Alma">Değişiklikleri Geri Alma</a> </li> <li> 2.5 <a href="/book/tr/v2/Git-Temelleri-Uzak-Repo-ile-%c3%87al%c4%b1%c5%9fmak">Uzak Repo ile Çalışmak</a> </li> <li> 2.6 <a href="/book/tr/v2/Git-Temelleri-Etiketleme">Etiketleme</a> </li> <li> 2.7 <a href="/book/tr/v2/Git-Temelleri-Komut-K%c4%b1sayolu-Alias-Ayarlama">Komut Kısayolu (Alias) Ayarlama</a> </li> <li> 2.8 <a href="/book/tr/v2/Git-Temelleri-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/tr/v2/Git-Dallar%c4%b1-Dallar">Git Dalları</a></h2> <ol> <li> 3.1 <a href="/book/tr/v2/Git-Dallar%c4%b1-Dallar">Dallar</a> </li> <li> 3.2 <a href="/book/tr/v2/Git-Dallar%c4%b1-K%c4%b1saca-Dalland%c4%b1rma-ve-Birle%c5%9ftirme-Temelleri">Kısaca Dallandırma ve Birleştirme Temelleri</a> </li> <li> 3.3 <a href="/book/tr/v2/Git-Dallar%c4%b1-Dal-Y%c3%b6netimi">Dal Yönetimi</a> </li> <li> 3.4 <a href="/book/tr/v2/Git-Dallar%c4%b1-%c4%b0%c5%9f-Ak%c4%b1%c5%9f%c4%b1-Dalland%c4%b1rmas%c4%b1">İş Akışı Dallandırması</a> </li> <li> 3.5 <a href="/book/tr/v2/Git-Dallar%c4%b1-Uzak-Dallar">Uzak Dallar</a> </li> <li> 3.6 <a href="/book/tr/v2/Git-Dallar%c4%b1-Yeniden-Temelleme-rebase">Yeniden Temelleme (rebase)</a> </li> <li> 3.7 <a href="/book/tr/v2/Git-Dallar%c4%b1-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-%c4%b0leti%c5%9fim-Kurallar%c4%b1-Protocols">Bir Sunucuda Git Kurma</a></h2> <ol> <li> 4.1 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-%c4%b0leti%c5%9fim-Kurallar%c4%b1-Protocols">İletişim Kuralları (Protocols)</a> </li> <li> 4.2 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-Bir-Sunucuda-Git-Kurma">Bir Sunucuda Git Kurma</a> </li> <li> 4.3 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-SSH-Ortak-Anahtar%c4%b1n%c4%b1z%c4%b1-Olu%c5%9fturma">SSH Ortak Anahtarınızı Oluşturma</a> </li> <li> 4.4 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-Sunucu-Kurma">Sunucu Kurma</a> </li> <li> 4.5 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-Git-Cini-Daemon">Git Cini (Daemon)</a> </li> <li> 4.6 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-Ak%c4%b1ll%c4%b1-HTTP">Akıllı HTTP</a> </li> <li> 4.7 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-%c3%9c%c3%a7%c3%bcnc%c3%bc-Taraf-Bar%c4%b1nd%c4%b1rma-Hosting-Se%c3%a7enekleri">Üçüncü Taraf Barındırma (Hosting) Seçenekleri</a> </li> <li> 4.10 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/tr/v2/Da%c4%9f%c4%b1t%c4%b1k-Git-Da%c4%9f%c4%b1t%c4%b1k-%c4%b0%c5%9f-Ak%c4%b1%c5%9flar%c4%b1">Dağıtık Git</a></h2> <ol> <li> 5.1 <a href="/book/tr/v2/Da%c4%9f%c4%b1t%c4%b1k-Git-Da%c4%9f%c4%b1t%c4%b1k-%c4%b0%c5%9f-Ak%c4%b1%c5%9flar%c4%b1">Dağıtık İş Akışları</a> </li> <li> 5.2 <a href="/book/tr/v2/Da%c4%9f%c4%b1t%c4%b1k-Git-Projenin-Geli%c5%9fiminde-Rol-Almak">Projenin Gelişiminde Rol Almak</a> </li> <li> 5.3 <a href="/book/tr/v2/Da%c4%9f%c4%b1t%c4%b1k-Git-Bir-Projeyi-Y%c3%bcr%c3%bctme">Bir Projeyi Yürütme</a> </li> <li> 5.4 <a href="/book/tr/v2/Da%c4%9f%c4%b1t%c4%b1k-Git-%c3%96zet">Özet</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/tr/v2/GitHub-Bir-Projeye-Katk%c4%b1da-Bulunmak">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/tr/v2/GitHub-Bir-Projeye-Katk%c4%b1da-Bulunmak">Bir Projeye Katkıda Bulunmak</a> </li> <li> 6.2 <a href="/book/tr/v2/GitHub-Proje-Bak%c4%b1m%c4%b1">Proje Bakımı</a> </li> <li> 6.3 <a href="/book/tr/v2/GitHub-Kurumsal-Y%c3%b6netim">Kurumsal Yönetim</a> </li> <li> 6.4 <a href="/book/tr/v2/GitHub-GitHub%e2%80%99%c4%b1-otomatikle%c5%9ftirme">GitHub’ı otomatikleştirme</a> </li> <li> 6.5 <a href="/book/tr/v2/GitHub-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>7. <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-D%c3%bczeltme-Se%c3%a7imi">Git Araçları</a></h2> <ol> <li> 7.1 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-D%c3%bczeltme-Se%c3%a7imi">Düzeltme Seçimi</a> </li> <li> 7.2 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Etkile%c5%9fimli-%c4%b0zlemleme-Staging">Etkileşimli İzlemleme (Staging)</a> </li> <li> 7.3 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Saklama-ve-Silme">Saklama ve Silme</a> </li> <li> 7.4 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-%c3%87al%c4%b1%c5%9fman%c4%b1z%c4%b1-%c4%b0mzalama">Çalışmanızı İmzalama</a> </li> <li> 7.5 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Arama">Arama</a> </li> <li> 7.6 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Ge%c3%a7mi%c5%9fi-Yeniden-Yazma">Geçmişi Yeniden Yazma</a> </li> <li> 7.7 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Reset-Komutunun-Gizemleri">Reset Komutunun Gizemleri</a> </li> <li> 7.8 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-%c4%b0leri-Seviye-Birle%c5%9ftirme">İleri Seviye Birleştirme</a> </li> <li> 7.9 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Rerere">Rerere</a> </li> <li> 7.10 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Git%e2%80%99le-Hata-Ay%c4%b1klama">Git’le Hata Ayıklama</a> </li> <li> 7.11 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Alt-Mod%c3%bcller" class="active">Alt Modüller</a> </li> <li> 7.12 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Demetleme-Bundling">Demetleme (Bundling)</a> </li> <li> 7.13 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Git-Nesnesini-De%c4%9fi%c5%9ftirme">Git Nesnesini Değiştirme</a> </li> <li> 7.14 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Kimlik-Bilgisi-Depolama">Kimlik Bilgisi Depolama</a> </li> <li> 7.15 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-Git-Yap%c4%b1land%c4%b1rmas%c4%b1">Git’i Özelleştirmek</a></h2> <ol> <li> 8.1 <a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-Git-Yap%c4%b1land%c4%b1rmas%c4%b1">Git Yapılandırması</a> </li> <li> 8.2 <a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-Git-Nitelikleri">Git Nitelikleri</a> </li> <li> 8.3 <a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-Git-Kancalar%c4%b1-Hooks">Git Kancaları (Hooks)</a> </li> <li> 8.4 <a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-Bir-%c3%96rnek:-Mecburi-Git-Politikas%c4%b1">Bir Örnek: Mecburi Git Politikası</a> </li> <li> 8.5 <a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/tr/v2/Git-ve-Di%c4%9fer-Sistemler-%c4%b0stemci-Olarak-Git">Git ve Diğer Sistemler</a></h2> <ol> <li> 9.1 <a href="/book/tr/v2/Git-ve-Di%c4%9fer-Sistemler-%c4%b0stemci-Olarak-Git">İstemci Olarak Git</a> </li> <li> 9.2 <a href="/book/tr/v2/Git-ve-Di%c4%9fer-Sistemler-Git%e2%80%99e-Ge%c3%a7i%c5%9f">Git’e Geçiş</a> </li> <li> 9.3 <a href="/book/tr/v2/Git-ve-Di%c4%9fer-Sistemler-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Tesisat-ve-D%c3%b6%c5%9feme-Plumbing-ve-Porcelain">Dahili Git Ögeleri</a></h2> <ol> <li> 10.1 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Tesisat-ve-D%c3%b6%c5%9feme-Plumbing-ve-Porcelain">Tesisat ve Döşeme (Plumbing ve Porcelain)</a> </li> <li> 10.2 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Git-Nesneleri">Git Nesneleri</a> </li> <li> 10.3 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Git-Referanslar%c4%b1">Git Referansları</a> </li> <li> 10.4 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Packfiles">Packfiles</a> </li> <li> 10.5 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Refspec">Refspec</a> </li> <li> 10.6 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Transfer-Protokolleri">Transfer Protokolleri</a> </li> <li> 10.7 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Bak%c4%b1m-ve-Veri-Kurtarma">Bakım ve Veri Kurtarma</a> </li> <li> 10.8 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Ortam-De%c4%9fi%c5%9fkenleri">Ortam Değişkenleri</a> </li> <li> 10.9 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-%c3%96zet">Özet</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-G%c3%b6rsel-Aray%c3%bczler">Ek bölüm A: Diğer Ortamlarda Git</a></h2> <ol> <li> A1.1 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-G%c3%b6rsel-Aray%c3%bczler">Görsel Arayüzler</a> </li> <li> A1.2 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-Visual-Studio-ile-Git">Visual Studio ile Git</a> </li> <li> A1.3 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-Visual-Studio-Code-ile-Git">Visual Studio Code ile Git</a> </li> <li> A1.4 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-Eclipse-ile-Git">Eclipse ile Git</a> </li> <li> A1.5 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-Sublime-Text-ile-Git">Sublime Text ile Git</a> </li> <li> A1.6 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-Bash-ile-Git">Bash ile Git</a> </li> <li> A1.7 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-Zsh-ile-Git">Zsh ile Git</a> </li> <li> A1.8 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-PowerShell-ile-Git">PowerShell ile Git</a> </li> <li> A1.9 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-B:-Git%e2%80%99i-Uygulamalar%c4%b1n%c4%b1za-G%c3%b6mmek-Git-Komut-Sat%c4%b1r%c4%b1">Ek bölüm B: Git’i Uygulamalarınıza Gömmek</a></h2> <ol> <li> A2.1 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-B:-Git%e2%80%99i-Uygulamalar%c4%b1n%c4%b1za-G%c3%b6mmek-Git-Komut-Sat%c4%b1r%c4%b1">Git Komut Satırı</a> </li> <li> A2.2 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-B:-Git%e2%80%99i-Uygulamalar%c4%b1n%c4%b1za-G%c3%b6mmek-Libgit2">Libgit2</a> </li> <li> A2.3 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-B:-Git%e2%80%99i-Uygulamalar%c4%b1n%c4%b1za-G%c3%b6mmek-JGit">JGit</a> </li> <li> A2.4 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-B:-Git%e2%80%99i-Uygulamalar%c4%b1n%c4%b1za-G%c3%b6mmek-go-git">go-git</a> </li> <li> A2.5 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-B:-Git%e2%80%99i-Uygulamalar%c4%b1n%c4%b1za-G%c3%b6mmek-Dulwich">Dulwich</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Kurulum-ve-Yap%c4%b1land%c4%b1rma-Komutlar%c4%b1">Ek bölüm C: Git Komutları</a></h2> <ol> <li> A3.1 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Kurulum-ve-Yap%c4%b1land%c4%b1rma-Komutlar%c4%b1">Kurulum ve Yapılandırma Komutları</a> </li> <li> A3.2 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Proje-Olu%c5%9fturma-Komutlar%c4%b1">Proje Oluşturma Komutları</a> </li> <li> A3.3 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-K%c4%b1saca-Poz-Snapshot-Alma">Kısaca Poz (Snapshot) Alma</a> </li> <li> A3.4 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Dalland%c4%b1rma-ve-Birle%c5%9ftirme-Komutlar%c4%b1">Dallandırma ve Birleştirme Komutları</a> </li> <li> A3.5 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Projeleri-Payla%c5%9fma-ve-G%c3%bcncelleme-Komutlar%c4%b1">Projeleri Paylaşma ve Güncelleme Komutları</a> </li> <li> A3.6 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-%c4%b0nceleme-ve-Kar%c5%9f%c4%b1la%c5%9ft%c4%b1rma-Komutlar%c4%b1">İnceleme ve Karşılaştırma Komutları</a> </li> <li> A3.7 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Hata-Ay%c4%b1klama-Debugging-Komutlar%c4%b1">Hata Ayıklama (Debugging) Komutları</a> </li> <li> A3.8 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Yamalama-Patching">Yamalama (Patching)</a> </li> <li> A3.9 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-E-Posta-Komutlar%c4%b1">E-Posta Komutları</a> </li> <li> A3.10 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Harici-Sistemler">Harici Sistemler</a> </li> <li> A3.11 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Y%c3%b6netim">Yönetim</a> </li> <li> A3.12 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Tesisat-Plumbing-Komutlar%c4%b1">Tesisat (Plumbing) Komutları</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>7.11 Git Araçları - Alt Modüller</h1> <div> <h2 id="_git_submodules">Alt Modüller</h2> <div class="paragraph"> <p>Bir projede çalışırken, sıklıkla onun içindeki başka bir projeyi kullanmanız gerekebilir. Bu üçüncü tarafın geliştirdiği bir kütüphane veya ayrı olarak geliştirdiğiniz ve birden fazla ana projede kullandığınız bir kütüphane de olabilir. Bu senaryolarda ortak bir sorun ortaya çıkar: İki projeyi ayrı olarak işlemek, ancak birini diğerinin içinden kullanabilmek istersiniz.</p> </div> <div class="paragraph"> <p>İşte bir örnek. Bir web sitesi geliştirirken, Atom beslemesi oluşturuyorsunuz. Atom oluşturmak üzere kendi kodunuzu yazmak yerine bir kütüphane kullanmaya karar veriyorsunuz. Muhtemelen bu kodu ya bir CPAN yüklemesi veya Ruby gem gibi paylaşılan bir kütüphaneden dahil etmek ya da kaynak kodunu kendi proje ağacınıza kopyalamak zorunda kalacaksınız. Kütüphaneyi dahil etmenin sorunu, kütüphaneyi herhangi bir şekilde özelleştirmenin zor olması ve her istemcinin o kütüphaneye erişimi olması gerektiği için, dağıtmanın genellikle daha da zor olmasıdır. Kodunuzu kendi projenize kopyalamanın sorunu ise, yukarı akış (upstream) değişiklikleri mevcutsa, herhangi bir özel değişiklik yapmanın zorlaşmasıdır.</p> </div> <div class="paragraph"> <p>Git bu sorunu alt modüller kullanarak ele alır. Alt modüller, bir Git reposunu başka bir Git reposunun bir alt dizini olarak tutmanıza izin verir. Bu yöntem, diğer depoyu projenize kopyalayarak (git clone) ve katkılarınızı ayrı tutmanızı sağlar.</p> </div> <div class="sect3"> <h3 id="_starting_submodules">Alt Modüllere Giriş</h3> <div class="paragraph"> <p>Bir ana proje ve birkaç alt proje olarak bölünmüş basit bir proje geliştirme örneği inceleyeceğiz.</p> </div> <div class="paragraph"> <p>Çalıştığımız repoya bir alt modül olarak varolan bir Git reposunu eklemeye başlayarak başlayalım. Yeni bir alt modül eklemek için, <code>git submodule add</code> komutuna, izlemek istediğiniz projenin mutlak veya göreli URL’sini eklersiniz. Bu örnekte, ``DbConnector`` adında bir kütüphane ekleyeceğiz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git submodule add https://github.com/chaconinc/DbConnector Cloning into 'DbConnector'... remote: Counting objects: 11, done. remote: Compressing objects: 100% (10/10), done. remote: Total 11 (delta 0), reused 11 (delta 0) Unpacking objects: 100% (11/11), done. Checking connectivity... done.</code></pre> </div> </div> <div class="paragraph"> <p>Alt modüller, projeyi varsayılan olarak ``DbConnector`` adında bir alt dizine ekler. Başka bir yere gitmesini istiyorsanız komutun sonuna farklı bir yol ekleyebilirsiniz.</p> </div> <div class="paragraph"> <p>Bu noktada <code>git status</code> komutunu çalıştırırsanız, birkaç şey fark edeceksiniz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: .gitmodules new file: DbConnector</code></pre> </div> </div> <div class="paragraph"> <p>İlk olarak, yeni <code>.gitmodules</code> dosyasını fark etmişsinizdir. Bu, projenin URL’si ile onu çektiğiniz yerel alt dizin arasındaki eşleştirmeyi saklayan bir yapılandırma dosyasıdır:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ini" data-lang="ini">[submodule "DbConnector"] path = DbConnector url = https://github.com/chaconinc/DbConnector</code></pre> </div> </div> <div class="paragraph"> <p>Eğer birden fazla alt modülünüz varsa, bu dosyada birden fazla girişiniz olacaktır. Bu dosyanın, <code>.gitignore</code> dosyanız gibi diğer dosyalarınızla birlikte sürüm denetimi altında olduğunu belirtmek önemlidir. Bu, bu projeyi kopyalayan diğer kişilerin alt modül projelerini nereden alacaklarını bildikleri anlamına gelir.</p> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Not</div> </td> <td class="content"> <div class="paragraph"> <p>Başkalarının ilk olarak kopyalamaya veya çekmeye çalışacakları yer <code>.gitmodules</code> dosyasındaki URL olduğu için, mümkünse onların erişebileceği bir URL kullanmaya özen gösterin. Örneğin, başkalarının çekmek için kullandığından farklı bir URL’yi siz itmek için kullanıyorsanız, diğerlerinin de erişimine açık olanı kullanın. Kendi kullanımınız için bu değeri yerel olarak değiştirmek isterseniz, <code>git config submodule.DbConnector.url PRIVATE_URL</code> komutu ile varolan değerin üzerine yazabilirsiniz. Mümkünse, göreli bir URL kullanmak da faydalı olabilir.</p> </div> </td> </tr> </table> </div> <div class="paragraph"> <p><code>git status</code> çıktısındaki diğer bilgi, proje klasörü girişidir. Bunu üzerinde <code>git diff</code> komutunu çalıştırırsanız, ilginç bir şey göreceksiniz:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git diff --cached DbConnector diff --git a/DbConnector b/DbConnector new file mode 160000 index 0000000..c3f01dc --- /dev/null +++ b/DbConnector @@ -0,0 +1 @@ +Subproject commit c3f01dc8862123d317dd46284b05b6892c7b29bc</code></pre> </div> </div> <div class="paragraph"> <p><code>DbConnector</code>, çalışma dizininizde bir alt dizin olsa dahi, Git onu bir alt modül olarak görür ve siz o dizinde olmadığınızda içeriğini izlemez. Git bunun yerine onu, o repodan belirli bir katkı olarak görür.</p> </div> <div class="paragraph"> <p>Daha düzgün bir diff çıktısı istiyorsanız, <code>git diff</code> komutuna <code>--submodule</code> seçeneğini ekleyebilirsiniz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git diff --cached --submodule diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..71fc376 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "DbConnector"] + path = DbConnector + url = https://github.com/chaconinc/DbConnector Submodule DbConnector 0000000...c3f01dc (new submodule)</code></pre> </div> </div> <div class="paragraph"> <p>Eğer katkılarsanız, şöyle bir şey göreceksiniz:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git commit -am 'added DbConnector module' [master fb9093c] added DbConnector module 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 DbConnector</code></pre> </div> </div> <div class="paragraph"> <p><code>DbConnector</code> girişinin <code>160000</code> moduna dikkat edin. Bu, Git’te bir dizin girişini, bir alt dizin veya bir dosya olarak kaydetmek yerine bir katkı olarak kaydettiğiniz anlamına gelen özel bir moddur.</p> </div> <div class="paragraph"> <p>Son olarak, bu değişiklikleri itin:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git push origin master</code></pre> </div> </div> </div> <div class="sect3"> <h3 id="_cloning_submodules">Alt Modülleri Olan Bir Projeyi Kopyalama</h3> <div class="paragraph"> <p>İşte bir alt modül içeren bir projeyi kopyalayacağız. Böyle bir projeyi kopyaladığınızda, varsayılan olarak alt modülleri içeren dizinleri alırsınız, ancak henüz içlerindeki dosyaları almazsınız:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git clone https://github.com/chaconinc/MainProject Cloning into 'MainProject'... remote: Counting objects: 14, done. remote: Compressing objects: 100% (13/13), done. remote: Total 14 (delta 1), reused 13 (delta 0) Unpacking objects: 100% (14/14), done. Checking connectivity... done. $ cd MainProject $ ls -la total 16 drwxr-xr-x 9 schacon staff 306 Sep 17 15:21 . drwxr-xr-x 7 schacon staff 238 Sep 17 15:21 .. drwxr-xr-x 13 schacon staff 442 Sep 17 15:21 .git -rw-r--r-- 1 schacon staff 92 Sep 17 15:21 .gitmodules drwxr-xr-x 2 schacon staff 68 Sep 17 15:21 DbConnector -rw-r--r-- 1 schacon staff 756 Sep 17 15:21 Makefile drwxr-xr-x 3 schacon staff 102 Sep 17 15:21 includes drwxr-xr-x 4 schacon staff 136 Sep 17 15:21 scripts drwxr-xr-x 4 schacon staff 136 Sep 17 15:21 src $ cd DbConnector/ $ ls $</code></pre> </div> </div> <div class="paragraph"> <p><code>DbConnector</code> dizini vardır, ancak içi boştur. İki komut çalıştırmanız gerekiyor: Yerel yapılandırma dosyanızı başlatmak için <code>git submodule init</code> ve o projeden tüm verileri almak ve süperprojenizde listelenen uygun katkıları kontrol etmek için <code>git submodule update</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git submodule init Submodule 'DbConnector' (https://github.com/chaconinc/DbConnector) registered for path 'DbConnector' $ git submodule update Cloning into 'DbConnector'... remote: Counting objects: 11, done. remote: Compressing objects: 100% (10/10), done. remote: Total 11 (delta 0), reused 11 (delta 0) Unpacking objects: 100% (11/11), done. Checking connectivity... done. Submodule path 'DbConnector': checked out 'c3f01dc8862123d317dd46284b05b6892c7b29bc'</code></pre> </div> </div> <div class="paragraph"> <p>Şimdi <code>DbConnector</code> alt diziniz, daha önce katkıladığınız durumda. Ancak, biraz daha basit olan bir yol daha var. <code>git clone</code> komutuna <code>--recurse-submodules</code> bayrağını geçirirseniz, repodaki her alt modülü otomatik olarak başlatır ve güncellersiniz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git clone --recurse-submodules https://github.com/chaconinc/MainProject Cloning into 'MainProject'... remote: Counting objects: 14, done. remote: Compressing objects: 100% (13/13), done. remote: Total 14 (delta 1), reused 13 (delta 0) Unpacking objects: 100% (14/14), done. Checking connectivity... done. Submodule 'DbConnector' (https://github.com/chaconinc/DbConnector) registered for path 'DbConnector' Cloning into 'DbConnector'... remote: Counting objects: 11, done. remote: Compressing objects: 100% (10/10), done. remote: Total 11 (delta 0), reused 11 (delta 0) Unpacking objects: 100% (11/11), done. Checking connectivity... done. Submodule path 'DbConnector': checked out 'c3f01dc8862123d317dd46284b05b6892c7b29bc'</code></pre> </div> </div> </div> <div class="sect3"> <h3 id="_alt_modülleri_olan_projelerle_çalışmak">Alt Modülleri Olan Projelerle Çalışmak</h3> <div class="paragraph"> <p>Şimdi alt modülleri olan bir projenin bir kopyasına sahibiz ve ana projede ve alt modül projede ekibimizle işbirliği yapacağız.</p> </div> <div class="sect4"> <h4 id="_üst_akım_değişikliklerini_çekmek">Üst-akım Değişikliklerini Çekmek</h4> <div class="paragraph"> <p>Eğer yalnızca bir alt projeyi tüketiyorsanız ve zaman zaman ondan güncellemeler almak istiyorsanız, ancak gerçekte kopyanızda hiçbir şeyi değiştirmiyorsanız; alt modülleri bir projede kullanmanın en basit modelini uygulayabilirsiniz. Bir örnek ile üzerinden basitçe geçelim.</p> </div> <div class="paragraph"> <p>Eğer bir alt modüldeki yeni çalışmayı kontrol etmek istiyorsanız, dizine gidip yerel kodu güncellemek için <code>git fetch</code> ve <code>git merge</code> komutlarını kullanabilirsiniz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git fetch From https://github.com/chaconinc/DbConnector c3f01dc..d0354fc master -> origin/master $ git merge origin/master Updating c3f01dc..d0354fc Fast-forward scripts/connect.sh | 1 + src/db.c | 1 + 2 files changed, 2 insertions(+)</code></pre> </div> </div> <div class="paragraph"> <p>Şimdi ana projeye geri döner ve <code>git diff --submodule</code> komutunu çalıştırırsanız, alt modülün güncellendiğini ve ona eklenen katkıların bir listesini görebilirsiniz. <code>git diff</code> komutunu her çalıştırdığınızda <code>--submodule</code> yazmak istemiyorsanız, <code>diff.submodule</code> yapılandırma değerini ``log`` olarak değiştirerek bu formatı varsayılan olarak ayarlayabilirsiniz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git config --global diff.submodule log $ git diff Submodule DbConnector c3f01dc..d0354fc: > more efficient db routine > better connection routine</code></pre> </div> </div> <div class="paragraph"> <p>Bu noktada bir katkı işlerseniz, başkaları güncellediğinde alt modülü yeni koda kilitlenmiş olursunuz.</p> </div> <div class="paragraph"> <p>Alt dizinde manuel olarak çekme ve birleştirme yapmak istemiyorsanız, bunu yapmanın daha kolay bir yolu daha vardır. <code>git submodule update --remote</code> komutunu çalıştırırsanız, Git sizin için alt modüllere çekip, güncelleyecektir.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git submodule update --remote DbConnector remote: Counting objects: 4, done. remote: Compressing objects: 100% (2/2), done. remote: Total 4 (delta 2), reused 4 (delta 2) Unpacking objects: 100% (4/4), done. From https://github.com/chaconinc/DbConnector 3f19983..d0354fc master -> origin/master Submodule path 'DbConnector': checked out 'd0354fc054692d3906c85c3af05ddce39a1c0644'</code></pre> </div> </div> <div class="paragraph"> <p>Bu komut, varsayılan olarak alt modül reposunun <code>master</code> dalını izlemek istediğinizi varsayar. Ancak dilerseniz, bunu farklı bir şeye de ayarlayabilirsiniz. Örneğin, DbConnector alt modülünün o reposunun ``stable`` dalını izlemesini istiyorsanız, bunu ya <code>.gitmodules</code> dosyanızda (böylece diğer herkes de izleyebilir) ya da sadece yerel <code>.git/config</code> dosyanızda ayarlayabilirsiniz. Şimdi bunu <code>.gitmodules</code> dosyasına ayarlayalım:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git config -f .gitmodules submodule.DbConnector.branch stable $ git submodule update --remote remote: Counting objects: 4, done. remote: Compressing objects: 100% (2/2), done. remote: Total 4 (delta 2), reused 4 (delta 2) Unpacking objects: 100% (4/4), done. From https://github.com/chaconinc/DbConnector 27cf5d3..c87d55d stable -> origin/stable Submodule path 'DbConnector': checked out 'c87d55d4c6d4b05ee34fbc8cb6f7bf4585ae6687'</code></pre> </div> </div> <div class="paragraph"> <p><code>-f .gitmodules</code> seçeneğini kullanmazsanız, sadece sizin için değişiklik yapar, ancak muhtemelen bu bilgiyi herkesin takip etmesi daha mantıklı olacaktır.</p> </div> <div class="paragraph"> <p>Bu noktada <code>git status</code> komutunu çalıştırdığınızda, Git alt modülde "yeni katkılar" olduğunu gösterecektir.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git status On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: .gitmodules modified: DbConnector (new commits) no changes added to commit (use "git add" and/or "git commit -a")</code></pre> </div> </div> <div class="paragraph"> <p><code>status.submodulesummary</code> yapılandırmasını ayarlarsanız, Git ayrıca alt modüllerinizdeki değişikliklerin kısa bir özetini de gösterecektir:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git config status.submodulesummary 1 $ git status On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: .gitmodules modified: DbConnector (new commits) Submodules changed but not updated: * DbConnector c3f01dc...c87d55d (4): > catch non-null terminated lines</code></pre> </div> </div> <div class="paragraph"> <p>Bu noktada <code>git diff</code> komutunu çalıştırırsanız, hem <code>.gitmodules</code> dosyasını değiştirdiğimizi hem de indirdiğimiz bir dizi katkının alt modül projemize işlenmeye hazır olduğunu görebilirsiniz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git diff diff --git a/.gitmodules b/.gitmodules index 6fc0b3d..fd1cc29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "DbConnector"] path = DbConnector url = https://github.com/chaconinc/DbConnector + branch = stable Submodule DbConnector c3f01dc..c87d55d: > catch non-null terminated lines > more robust error handling > more efficient db routine > better connection routine</code></pre> </div> </div> <div class="paragraph"> <p>Alt modülümüze işleyebileceğimiz katkıların günlüğünü görebilmemiz harika. Bir kez katkılandıktan sonra, <code>git log -p</code> komutunu çalıştırdığınızda, sonradan bu bilgiyi de görebilirsiniz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log -p --submodule commit 0a24cfc121a8a3c118e0105ae4ae4c00281cf7ae Author: Scott Chacon <schacon@gmail.com> Date: Wed Sep 17 16:37:02 2014 +0200 updating DbConnector for bug fixes diff --git a/.gitmodules b/.gitmodules index 6fc0b3d..fd1cc29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "DbConnector"] path = DbConnector url = https://github.com/chaconinc/DbConnector + branch = stable Submodule DbConnector c3f01dc..c87d55d: > catch non-null terminated lines > more robust error handling > more efficient db routine > better connection routine</code></pre> </div> </div> <div class="paragraph"> <p><code>git submodule update --remote</code> komutunu çalıştırdığınızda Git, (varsayılan olarak) <strong>tüm</strong> alt modüllerinizi güncellemeye çalışacaktır, bu yüzden birçok alt modülünüz varsa, sadece güncellemek istediğiniz alt modülün adını geçirmek isteyebilirsiniz.</p> </div> </div> <div class="sect4"> <h4 id="_bir_alt_modülle_çalışmak">Bir Alt Modülle Çalışmak</h4> <div class="paragraph"> <p>Alt modüller kullanıyorsanız bunun sebebi muhtemelen, ana projedeki kodla aynı anda alt modüldeki (veya birkaç alt modüldeki) kod üzerinde de çalışmak istemenizdir. Aksi takdirde, muhtemelen daha basit bir bağımlılık yönetim sistemi kullanıyor olurdunuz (örneğin Maven veya Rubygems gibi).</p> </div> <div class="paragraph"> <p>Şimdi, ana projede olduğu gibi alt modülde değişiklik yapma ve bu değişiklikleri aynı anda katkılama ve yayınlama örneğini inceleyelim.</p> </div> <div class="paragraph"> <p>Şimdiye kadar öğrendiğimiz üzere, alt modül repolarından değişiklikleri almak için <code>git submodule update</code> komutunu çalıştırdığımızda; Git değişiklikleri alır ve alt dizindeki dosyaları günceller ancak alt repoyu ``detached HEAD`` (bağlı olmayan bir HEAD) durumunda bırakır. Bu, yerel çalışma dalının (örneğin ``master`` gibi) değişiklikleri izlemediği anlamına gelir. Değişiklikleri izleyen bir çalışma dalı olmadığı için, alt modülde değişiklik yaparsanız bile, bu değişikliklerin bir sonraki <code>git submodule update</code> komutunu çalıştırdığınızda kaybolma olasılığı oldukça yüksektir. Bir alt modüldeki değişikliklerin izlenmesini istiyorsanız atmanız gereken ekstra adımlar bulunmaktadır.</p> </div> <div class="paragraph"> <p>Alt modülünüzü daha kolay bir şekilde düzenlemek için iki şey yapmanız gerekiyor. Her alt modüle gitmeli ve üzerinde çalışmak için bir dal açmalısınız. Sonra, eğer değişiklik yapmışsanız ve ardından <code>git submodule update --remote</code> ile yeni çalışmaları üst akımdan çekiyorsanız, Git’e ne yapması gerektiğini söylemelisiniz. Seçenekler, yeni değişiklikleri yerel işinize birleştirmek veya yerel işinizi yeni değişikliklerin üstüne tekrar temellemeyi denemektir.</p> </div> <div class="paragraph"> <p>İlk olarak, alt modül dizinine giderek bir dala geçelim.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout stable Switched to branch 'stable'</code></pre> </div> </div> <div class="paragraph"> <p>Bunu ``merge`` seçeneğiyle deneyelim. Manuel olarak belirtmek için, <code>update</code> çağrımıza <code>--merge</code> seçeneğini ekleyebiliriz. İşte bu alt modül için sunucuda bir değişiklik olduğunu göreceğiz ve bu değişiklik birleştirilir.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git submodule update --remote --merge remote: Counting objects: 4, done. remote: Compressing objects: 100% (2/2), done. remote: Total 4 (delta 2), reused 4 (delta 2) Unpacking objects: 100% (4/4), done. From https://github.com/chaconinc/DbConnector c87d55d..92c7337 stable -> origin/stable Updating c87d55d..92c7337 Fast-forward src/main.c | 1 + 1 file changed, 1 insertion(+) Submodule path 'DbConnector': merged in '92c7337b30ef9e0893e758dac2459d07362ab5ea'</code></pre> </div> </div> <div class="paragraph"> <p>DbConnector dizinine girdiğimizde, yeni değişikliklerin zaten yerel <code>stable</code> dalımıza birleştirildiğini göreceğiz. Şimdi kütüphanede kendi yerel değişikliğimizi yapalım ve aynı zamanda başka birinin üst akıma başka bir değişiklik gönderdiğinde ne olacağını görelim.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ cd DbConnector/ $ vim src/db.c $ git commit -am 'unicode support' [stable f906e16] unicode support 1 file changed, 1 insertion(+)</code></pre> </div> </div> <div class="paragraph"> <p>Şimdi alt modülümüzü güncellediğimizde, yerel bir değişiklik yaptığımız ve üst akımın da dahil edilmesi gereken bir değişikliğe sahip olduğumuzda ne olacağını görelim.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git submodule update --remote --rebase First, rewinding head to replay your work on top of it... Applying: unicode support Submodule path 'DbConnector': rebased into '5d60ef9bbebf5a0c1c1050f242ceeb54ad58da94'</code></pre> </div> </div> <div class="paragraph"> <p>Eğer <code>--rebase</code> veya <code>--merge</code> seçeneklerini unutursanız, Git sadece alt modülü sunucuda bulunan herhangi bir duruma günceller ve projenizi bağlı bir HEAD durumuna (detached HEAD) sıfırlar.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git submodule update --remote Submodule path 'DbConnector': checked out '5d60ef9bbebf5a0c1c1050f242ceeb54ad58da94'</code></pre> </div> </div> <div class="paragraph"> <p>Eğer böyle bir durumla karşılaşırsanız endişelenmeyin, sadece dizininize geri dönüp dalınıza tekrar geçebilirsiniz (ki bu hala çalışmanızı içerecektir) ve <code>origin/stable</code> (veya istediğiniz uzak dal) dalı manuel olarak birleştirebilir veya tekrar temelleyebilirsiniz.</p> </div> <div class="paragraph"> <p>Alt modüldeki değişikliklerinizi katkılamadıysanız ve bir alt modül güncellemesi çalıştırdığınızda sorunlara neden olabilecek değişiklikleri yapmadıysanız, Git değişiklikleri alır ancak alt modül dizininizde kaydedilmemiş çalışmanın üzerine yeniden yazmaz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git submodule update --remote remote: Counting objects: 4, done. remote: Compressing objects: 100% (3/3), done. remote: Total 4 (delta 0), reused 4 (delta 0) Unpacking objects: 100% (4/4), done. From https://github.com/chaconinc/DbConnector 5d60ef9..c75e92a stable -> origin/stable error: Your local changes to the following files would be overwritten by checkout: scripts/setup.sh Please, commit your changes or stash them before you can switch branches. Aborting Unable to checkout 'c75e92a2b3855c9e5b66f915308390d9db204aca' in submodule path 'DbConnector'</code></pre> </div> </div> <div class="paragraph"> <p>Eğer üst akımda yapılan bir değişiklikle çakışan değişiklikler yaptıysanız, güncelleme işlemini çalıştırdığınızda Git bunu size bildirecektir.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git submodule update --remote --merge Auto-merging scripts/setup.sh CONFLICT (content): Merge conflict in scripts/setup.sh Recorded preimage for 'scripts/setup.sh' Automatic merge failed; fix conflicts and then commit the result. Unable to merge 'c75e92a2b3855c9e5b66f915308390d9db204aca' in submodule path 'DbConnector'</code></pre> </div> </div> <div class="paragraph"> <p>Alt modül dizinine gidip çakışmayı normal şekilde düzeltebilirsiniz.</p> </div> </div> <div class="sect4"> <h4 id="_publishing_submodules">Alt Modül Değişikliklerini Yayınlama</h4> <div class="paragraph"> <p>Şimdi alt modül dizinimizde bazı değişikliklerimiz var. Bu değişikliklerden bazıları güncellemelerimizle üst akımdan getirildi, diğerleri ise yerel olarak yapıldı ama henüz itmediğimiz için başkaları tarafından erişilebilir durumda değil.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git diff Submodule DbConnector c87d55d..82d2ad3: > Merge from origin/stable > updated setup script > unicode support > remove unnecessary method > add new option for conn pooling</code></pre> </div> </div> <div class="paragraph"> <p>Ana projeyi katkılayıp ittiğimizde ve alt modül değişikliklerini itmediğimizde; bağımlı olunan alt modül değişikliklerini almanın bir yolu olmayacağı için değişikliklerimizi çekmek isteyenler sıkıntı yaşayacaklar. Bu değişiklikler yalnızca bizim yerel kopyamızda var olacaktır.</p> </div> <div class="paragraph"> <p>Bunu önlemek için, ana projeyi itmeden önce, tüm alt modüllerinizin düzgün bir şekilde itildiğinden emin olmak için Git’ten istekte bulunabilirsiniz. <code>git push</code> komutu ``check`` ya da ``on-demand`` olarak ayarlanabilecek olan <code>--recurse-submodules</code> argümanını alır. ``check`` seçeneği, katkılanmış alt modül değişikliklerinden herhangi biri henüz itilmediyse <code>push</code> komutunu geçersiz kılar.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git push --recurse-submodules=check The following submodule paths contain changes that can not be found on any remote: DbConnector Please try git push --recurse-submodules=on-demand or cd to the path and use git push to push them to a remote.</code></pre> </div> </div> <div class="paragraph"> <p>Gördüğünüz gibi, bize ne yapmamız gerektiği konusunda bazı yardımcı önerilerde bulunulmaktadır. En basit seçenek, her alt modüle gidip manuel olarak uzak sunuculara itmek ve sonra ana itme işlemini tekrar denemektir. Eğer bu denetleme davranışının tüm itmeler için gerçekleşmesini istiyorsanız, bu davranışı varsayılan olarak yapmak için <code>git config push.recurseSubmodules check</code> komutunu kullanabilirsiniz.</p> </div> <div class="paragraph"> <p>Diğer seçenek, bunu sizin için bunu yapmaya çalışacak olan ``on-demand`` değerini kullanmaktır.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git push --recurse-submodules=on-demand Pushing submodule 'DbConnector' Counting objects: 9, done. Delta compression using up to 8 threads. Compressing objects: 100% (8/8), done. Writing objects: 100% (9/9), 917 bytes | 0 bytes/s, done. Total 9 (delta 3), reused 0 (delta 0) To https://github.com/chaconinc/DbConnector c75e92a..82d2ad3 stable -> stable Counting objects: 2, done. Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (2/2), 266 bytes | 0 bytes/s, done. Total 2 (delta 1), reused 0 (delta 0) To https://github.com/chaconinc/MainProject 3d6d338..9a377d1 master -> master</code></pre> </div> </div> <div class="paragraph"> <p>Görüldüğü gibi, Git DbConnector modülüne girdi ve ana projeyi itmeden önce bu alt modülü itti. Eğer bu itme bir nedenle başarısız olursa, ana proje itmesi de başarısız olacaktır. Bu davranışı varsayılan olarak ayarlamak için <code>git config push.recurseSubmodules on-demand</code> komutunu kullanabilirsiniz.</p> </div> </div> <div class="sect4"> <h4 id="_alt_modül_değişikliklerini_birleştirme">Alt Modül Değişikliklerini Birleştirme</h4> <div class="paragraph"> <p>Eğer bir başkasıyla aynı anda bir alt modül referansını değiştirirseniz, bazı sorunlarla karşılaşabilirsiniz. Yani, alt modül geçmişleri ayrışmış ve üstproje içinde ayrık (divergent) dallara katkı işlenmişse, bunu düzeltmeniz gerekebilir.</p> </div> <div class="paragraph"> <p>Eğer katkılardan biri diğerinin doğrudan önceliyse (bir hızlı ileri birleştirme), Git sadece birleştirme için sonuncuyu seçecektir, bu yüzden bu sorunsuz çalışır.</p> </div> <div class="paragraph"> <p>Ancak Git sizin için basit birleştirmeyi bile denemez. Eğer alt modül katkıları ayrıksa ve birleştirilmeleri gerekiyorsa, şuna benzer bir uyarı alırsınız:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git pull remote: Counting objects: 2, done. remote: Compressing objects: 100% (1/1), done. remote: Total 2 (delta 1), reused 2 (delta 1) Unpacking objects: 100% (2/2), done. From https://github.com/chaconinc/MainProject 9a377d1..eb974f8 master -> origin/master Fetching submodule DbConnector warning: Failed to merge submodule DbConnector (merge following commits not found) Auto-merging DbConnector CONFLICT (submodule): Merge conflict in DbConnector Automatic merge failed; fix conflicts and then commit the result.</code></pre> </div> </div> <div class="paragraph"> <p>Temelde burada olan olay şudur: Git, alt modülün geçmişinde ayrık ve birleştirilmesi gereken noktaları kaydeden iki dal olduğunu anlamıştır. Bu, "merge following commits not found" olarak açıklanmıştır, bu kafa karıştırıcıdır ancak birazdan neden böyle olduğunu açıklayacağız.</p> </div> <div class="paragraph"> <p>Sorunu çözmek için, alt modülün hangi durumda olması gerektiğini belirlemeniz gerekmektedir. Garip bir şekilde, Git size burada yardımcı olacak pek fazla bilgi vermez, hatta tarihin her iki tarafında katkıların SHA-1’lerini bile vermez. Neyse ki, bunu bulmak oldukça basittir. <code>git diff</code> komutunu çalıştırırsanız, birleştirmeye çalıştığınız iki dalda kaydedilen katkıların SHA-1’lerini alabilirsiniz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git diff diff --cc DbConnector index eb41d76,c771610..0000000 --- a/DbConnector +++ b/DbConnector</code></pre> </div> </div> <div class="paragraph"> <p>Bu durumda, <code>eb41d76</code> alt modüldeki <strong>bizim</strong> katkımızı ve <code>c771610</code>'ı yukarı akımın katkısını temsil etmektedir. Alt modül dizinimize gittiğimizde, birleştirme ona dokunmadığı için, <code>eb41d76</code> üzerinde olması gerekir. Herhangi bir nedenden dolayı değilse bile, ona işaret eden bir dal oluşturabilirsiniz.</p> </div> <div class="paragraph"> <p>Önemli olan, diğer taraftan gelen katkının SHA-1’idir. Çözmeniz ve birleştirmeniz gereken budur. Doğrudan SHA-1 ile birleştirmeyi deneyebilirsiniz, veya onun için bir dal oluşturabilir ve ardından bunu birleştirmeyi deneyebilirsiniz. En azından daha güzel bir birleştirme katkı mesajı oluşturmak için, biz ikincisini öneriyoruz.</p> </div> <div class="paragraph"> <p>Bu nedenle, alt modül dizinimize gireceğiz, <code>git diff</code> ile alınan ikinci SHA-1’e dayalı bir dal oluşturacağız ve manuel olarak birleştireceğiz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ cd DbConnector $ git rev-parse HEAD eb41d764bccf88be77aced643c13a7fa86714135 $ git branch try-merge c771610 (DbConnector) $ git merge try-merge Auto-merging src/main.c CONFLICT (content): Merge conflict in src/main.c Recorded preimage for 'src/main.c' Automatic merge failed; fix conflicts and then commit the result.</code></pre> </div> </div> <div class="paragraph"> <p>Burada gerçek bir birleştirme çakışması yaşadık, bu yüzden bunu çözer ve katkılarsak, bu sonuçla ana projeyi güncelleyebiliriz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ vim src/main.c <b class="conum">(1)</b> $ git add src/main.c $ git commit -am 'merged our changes' Recorded resolution for 'src/main.c'. [master 9fd905e] merged our changes $ cd .. <b class="conum">(2)</b> $ git diff <b class="conum">(3)</b> diff --cc DbConnector index eb41d76,c771610..0000000 --- a/DbConnector +++ b/DbConnector @@@ -1,1 -1,1 +1,1 @@@ - Subproject commit eb41d764bccf88be77aced643c13a7fa86714135 -Subproject commit c77161012afbbe1f58b5053316ead08f4b7e6d1d ++Subproject commit 9fd905e5d7f45a0d4cbc43d1ee550f16a30e825a $ git add DbConnector <b class="conum">(4)</b> $ git commit -m "Merge Tom's Changes" <b class="conum">(5)</b> [master 10d2c60] Merge Tom's Changes</code></pre> </div> </div> <div class="colist arabic"> <ol> <li> <p>İlk olarak çakışmayı çöz</p> </li> <li> <p>TArdından ana proje dizinine geri dön</p> </li> <li> <p>SHA-1’leri tekrar kontrol edebiliriz</p> </li> <li> <p>Çakışmış alt modül girişini çöz</p> </li> <li> <p>Birleştirmeyi katkı olarak işle</p> </li> </ol> </div> <div class="paragraph"> <p>Bu biraz kafa karıştırıcı olabilir, ancak gerçekten çok zor değil.</p> </div> <div class="paragraph"> <p>İlginç bir şekilde, Git’in ele aldığı başka bir durum daha var. Eğer alt modül dizininde hem geçmişteki <strong>her iki</strong> katkıyı da içeren birleştirme katkısı varsa, Git size bunu olası bir çözüm olarak önerir. Alt modül projesinde, bu iki katkıyı içeren dalların birleştirildiği bir nokta olduğunu görür, bu yüzden belki de bunu isteyebileceğinizi düşünür.</p> </div> <div class="paragraph"> <p>Bu yüzden önceki hata mesajının nedeni "merge following commits not found" idi, çünkü <strong>bunu</strong> yapamadı. Karışık görünmesinin sebebi kimsenin bunu denemesini beklememesidir.</p> </div> <div class="paragraph"> <p>Eğer Git tek bir kabul edilebilir birleştirme katkısı bulursa, şuna benzer bir şey göreceksiniz:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git merge origin/master warning: Failed to merge submodule DbConnector (not fast-forward) Found a possible merge resolution for the submodule: 9fd905e5d7f45a0d4cbc43d1ee550f16a30e825a: > merged our changes If this is correct simply add it to the index for example by using: git update-index --cacheinfo 160000 9fd905e5d7f45a0d4cbc43d1ee550f16a30e825a "DbConnector" which will accept this suggestion. Auto-merging DbConnector CONFLICT (submodule): Merge conflict in DbConnector Automatic merge failed; fix conflicts and then commit the result.</code></pre> </div> </div> <div class="paragraph"> <p>Verilen komut, izlemi <code>git add</code> komutunu çalıştırmış gibi günceller (çakışmayı temizler) ve ardından katkıyı işler. Aslında bunu yapmanız pek önerilmez. Bunun yerine, alt modül dizinine girip farkın ne olduğunu görebilir, bu katkıya hızlı bir ileri sarma yapabilir, uygun şekilde test edebilir ve ardından katkınızı işleyebilirsiniz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ cd DbConnector/ $ git merge 9fd905e Updating eb41d76..9fd905e Fast-forward $ cd .. $ git add DbConnector $ git commit -am 'Fast forwarded to a common submodule child'</code></pre> </div> </div> <div class="paragraph"> <p>Bu da aynı şeyi yapar, ama en azından bu şekilde düzgün çalışıp çalışmadığını doğrulayabilir ve işiniz bittiğinde kodun alt modül dizinizde olduğunu görebilirsiniz.</p> </div> </div> </div> <div class="sect3"> <h3 id="_alt_modül_i̇puçları">Alt Modül İpuçları</h3> <div class="paragraph"> <p>Alt modüllerle çalışmayı biraz daha kolaylaştırmak için yapabileceğiniz birkaç şey var.</p> </div> <div class="sect4"> <h4 id="_alt_modül_foreach_komutu">Alt Modül "Foreach" Komutu</h4> <div class="paragraph"> <p>Her bir alt modülde belirli bir komut çalıştırmak için <code>foreach</code> alt modül komutu bulunmaktadır. Aynı projede birkaç alt modülünüz varsa, bu gerçekten yardımcı olabilir.</p> </div> <div class="paragraph"> <p>Örneğin, yeni bir özellik başlatmak veya bir hata düzeltmek istediğimizi ve birkaç alt modülde çalışmamız olduğunu varsayalım. Tüm alt modüllerimizdeki çalışmamızı kolayca saklayabiliriz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git submodule foreach 'git stash' Entering 'CryptoLibrary' No local changes to save Entering 'DbConnector' Saved working directory and index state WIP on stable: 82d2ad3 Merge from origin/stable HEAD is now at 82d2ad3 Merge from origin/stable</code></pre> </div> </div> <div class="paragraph"> <p>Daha sonra tüm alt modüllerimizde yeni bir dal oluşturabilir ve ona geçebiliriz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git submodule foreach 'git checkout -b featureA' Entering 'CryptoLibrary' Switched to a new branch 'featureA' Entering 'DbConnector' Switched to a new branch 'featureA'</code></pre> </div> </div> <div class="paragraph"> <p>Fikri anladınız. Yapabileceğiniz en faydalı şey, ana projenizde neyin değiştiğini ve tüm yan projelerinizde neyin değiştiğini gösteren güzel bir birleşik diff oluşturmaktır.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git diff; git submodule foreach 'git diff' Submodule DbConnector contains modified content diff --git a/src/main.c b/src/main.c index 210f1ae..1f0acdc 100644 --- a/src/main.c +++ b/src/main.c @@ -245,6 +245,8 @@ static int handle_alias(int *argcp, const char ***argv) commit_pager_choice(); + url = url_decode(url_orig); + /* build alias_argv */ alias_argv = xmalloc(sizeof(*alias_argv) * (argc + 1)); alias_argv[0] = alias_string + 1; Entering 'DbConnector' diff --git a/src/db.c b/src/db.c index 1aaefb6..5297645 100644 --- a/src/db.c +++ b/src/db.c @@ -93,6 +93,11 @@ char *url_decode_mem(const char *url, int len) return url_decode_internal(&url, len, NULL, &out, 0); } +char *url_decode(const char *url) +{ + return url_decode_mem(url, strlen(url)); +} + char *url_decode_parameter_name(const char **query) { struct strbuf out = STRBUF_INIT;</code></pre> </div> </div> <div class="paragraph"> <p>Burada, bir alt modülde bir fonksiyon tanımlıyoruz ve ana projede onu çağırıyoruz. Bu açıkça basitleştirilmiş bir örnek, ancak umarım bunun nasıl faydalı olabileceğine dair bir fikir verir.</p> </div> </div> <div class="sect4"> <h4 id="_faydalı_kısaltmalar_alias">Faydalı Kısaltmalar (Alias)</h4> <div class="paragraph"> <p>Bazıları oldukça uzun olan bu komutlar için bazı kısaltmalar oluşturmak isteyebilirsiniz ancak bunları varsayılan yapmak isterseniz, çoğu yapılandırma seçeneğini değiştiremezsiniz. Git’te kısaltmalar kurmayı <a href="/book/tr/v2/ch00/_git_aliases">Komut Kısayolu (Alias) Ayarlama</a> bölümünde ele almıştık, ancak alt modüllerle sıkça çalışmayı planlıyorsanızx kurmak isteyebileceğiniz bir örnek aşağıda verilmiştir.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git config alias.sdiff '!'"git diff && git submodule foreach 'git diff'" $ git config alias.spush 'push --recurse-submodules=on-demand' $ git config alias.supdate 'submodule update --remote --merge'</code></pre> </div> </div> <div class="paragraph"> <p>Bu şekilde alt modüllerinizi güncellemek istediğinizde sadece <code>git supdate</code> komutunu çalıştırabilir veya alt modül bağımlılığı kontrolü ile itmek için <code>git spush</code> komutunu kullanabilirsiniz.</p> </div> </div> </div> <div class="sect3"> <h3 id="_alt_modüllerle_i̇lgili_sorunlar">Alt Modüllerle İlgili Sorunlar</h3> <div class="paragraph"> <p>Ancak alt modüllerle çalışmak tamamen sorunsuz değildir.</p> </div> <div class="paragraph"> <p>Örneğin, alt modül içeren dallarda çalışırken dal değiştirmek karmaşık olabilir. Eğer yeni bir dal oluşturup, oraya bir alt modül eklerseniz ve daha sonra o alt modülü içermeyen başka bir dala geçerseniz; alt modül dizinini halen izlenmeyen bir dizin olarak görürsününüz:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout -b add-crypto Switched to a new branch 'add-crypto' $ git submodule add https://github.com/chaconinc/CryptoLibrary Cloning into 'CryptoLibrary'... ... $ git commit -am 'adding crypto library' [add-crypto 4445836] adding crypto library 2 files changed, 4 insertions(+) create mode 160000 CryptoLibrary $ git checkout master warning: unable to rmdir CryptoLibrary: Directory not empty Switched to branch 'master' Your branch is up-to-date with 'origin/master'. $ git status On branch master Your branch is up-to-date with 'origin/master'. Untracked files: (use "git add <file>..." to include in what will be committed) CryptoLibrary/ nothing added to commit but untracked files present (use "git add" to track)</code></pre> </div> </div> <div class="paragraph"> <p>Dizini kaldırmak zor değildir, ancak orada bulundurmak biraz kafa karıştırıcı olabilir. Eğer kaldırırsanız ve daha sonra o alt modülü içeren dala geri geçerseniz, yeniden oluşturmak için <code>submodule update --init</code> komutunu çalıştırmanız gerekecektir.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git clean -ffdx Removing CryptoLibrary/ $ git checkout add-crypto Switched to branch 'add-crypto' $ ls CryptoLibrary/ $ git submodule update --init Submodule path 'CryptoLibrary': checked out 'b8dda6aa182ea4464f3f3264b11e0268545172af' $ ls CryptoLibrary/ Makefile includes scripts src</code></pre> </div> </div> <div class="paragraph"> <p>Tekrardan: gerçekten çok zor değil, ancak biraz kafa karıştırıcı olabilir.</p> </div> <div class="paragraph"> <p>Birçok insanın karşılaştığı diğer ana husus, alt dizinlerden alt modüllere geçiş yapmaktır. Eğer projenizdeki dosyaları izliyor ve onları bir alt modüle taşımak istiyorsanız, dikkatli olmanız gerekir; yoksa Git size kızabilir. Diyelim ki projedeki bir alt dizinde dosyalarınız var ve onu bir alt modüle geçirmek istiyorsunuz. Eğer alt dizini sildikten sonra <code>submodule add</code> komutunu çalıştırırsanız, Git size bağırmaya başlayacaktır:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ rm -Rf CryptoLibrary/ $ git submodule add https://github.com/chaconinc/CryptoLibrary 'CryptoLibrary' already exists in the index</code></pre> </div> </div> <div class="paragraph"> <p>Önce <code>CryptoLibrary</code> dizinini izlemden (stage) çıkarmalısınız. Sonra alt modülü ekleyebilirsiniz:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git rm -r CryptoLibrary $ git submodule add https://github.com/chaconinc/CryptoLibrary Cloning into 'CryptoLibrary'... remote: Counting objects: 11, done. remote: Compressing objects: 100% (10/10), done. remote: Total 11 (delta 0), reused 11 (delta 0) Unpacking objects: 100% (11/11), done. Checking connectivity... done.</code></pre> </div> </div> <div class="paragraph"> <p>Şimdi bunu bir dalda yaptığınızı varsayalım. Eğer bu dosyalar bir alt modül yerine hâlâ gerçek bir ağaçta duruyorsa, o dala geri geçmeye çalıştığınızda, şu hatayı alırsınız:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout master error: The following untracked working tree files would be overwritten by checkout: CryptoLibrary/Makefile CryptoLibrary/includes/crypto.h ... Please move or remove them before you can switch branches. Aborting</code></pre> </div> </div> <div class="paragraph"> <p>Geçişe zorlamak için <code>checkout -f</code> deneyebilirsiniz, ancak bu komutla kaydedilmemiş değişikliklerinizin üzerine yazılabileceğinden dikkatli olun!</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout -f master warning: unable to rmdir CryptoLibrary: Directory not empty Switched to branch 'master'</code></pre> </div> </div> <div class="paragraph"> <p>Ardından, geri geçtiğinizde, nedeni bilinmeyen bir şekilde boş bir <code>CryptoLibrary</code> dizini alırsınız ve <code>git submodule update</code> de bunu düzeltemeyebilir. Tüm dosyalarınızı geri almak için submodule dizinine girip <code>git checkout .</code> komutunu çalıştırmanız gerekebilir. Bu komutu birden fazla alt modül için çalıştırmak için <code>submodule foreach</code> bektiğinde çalıştırabilirsiniz.</p> </div> <div class="paragraph"> <p>Bugünlerde alt modüllerin tüm Git verilerini üst projenin <code>.git</code> dizininde tuttuğunu unutmayın. Bu nedenle çok eski Git sürümlerinden farklı olarak, bir alt modül dizinini yok etmek, önceden sahip olduğunuz herhangi bir katkı veya dalı kaybetmez.</p> </div> <div class="paragraph"> <p>Bu araçlarla sayesinde alt modüller, birbiriyle ilişkili ancak ayrı projede bulunan geliştirmeleri aynı anda yapabilmek için oldukça basit ve etkili bir yöntem olabilir.</p> </div> </div> <div id="nav"><a href="/book/tr/v2/Git-Araçları-Git’le-Hata-Ayıklama">prev</a> | <a href="/book/tr/v2/Git-Araçları-Demetleme-Bundling">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>