CINXE.COM

Git - Git Attributes

<!DOCTYPE html> <html lang="pl"> <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 - Git Attributes</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/Customizing-Git-Git-Attributes">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Git%e2%80%99i-F%c9%99rdil%c9%99%c5%9fdirm%c9%99k-Git-Atributlar%c4%b1">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg/v2/Git-%d0%bd%d0%b0-%d0%bd%d0%b8%d1%81%d0%ba%d0%be-%d0%bd%d0%b8%d0%b2%d0%be-Git-%d0%be%d0%b1%d0%b5%d0%ba%d1%82%d0%b8">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-einrichten-Git-Attribute">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Git-Attributes">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Personnalisation-de-Git-Attributs-Git">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%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba-Git-%e3%81%ae%e5%b1%9e%e6%80%a7">日本語</a>,</td></tr> <tr><td><a href="/book/ko/v2/Git%eb%a7%9e%ec%b6%a4-Git-Attributes">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Git-aanpassen-Git-attributen">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/%d0%9d%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b0-Git-%d0%90%d1%82%d1%80%d0%b8%d0%b1%d1%83%d1%82%d1%8b-Git">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Prilagoditev-Gita-Atributi-Git">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Pag-aangkop-sa-Sariling-Pangangailagan-ng-Git-Mga-Katangian-ng-Git">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/%d0%9d%d0%b0%d0%bb%d0%b0%d1%88%d1%82%d1%83%d0%b2%d0%b0%d0%bd%d0%bd%d1%8f-Git-%d0%90%d1%82%d1%80%d0%b8%d0%b1%d1%83%d1%82%d0%b8-Git">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/%e8%87%aa%e5%ae%9a%e4%b9%89-Git-Git-%e5%b1%9e%e6%80%a7">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/Customizing-Git-Atributy-Git">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/%d0%9f%d0%b5%d1%80%d1%81%d0%be%d0%bd%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%98%d0%b0-%d0%bd%d0%b0-Git-Git-%d0%90%d1%82%d1%80%d0%b8%d0%b1%d1%83%d1%82%d0%b8">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Dostosowywanie-Gita-Git-Attributes">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%9f%d1%80%d0%b8%d0%bb%d0%b0%d0%b3%d0%be%d1%92%d0%b0%d0%b2%d0%b0%d1%9a%d0%b5-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%b0-%d0%93%d0%b8%d1%82-%d0%93%d0%b8%d1%82-%d0%b0%d1%82%d1%80%d0%b8%d0%b1%d1%83%d1%82%d0%b8">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Customizing-Git-Git-Attributes">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/Customizing-Git-Git-Attributes">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Customizing-Git-Git-Attributes">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/Customizing-Git-Git-Attributes" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Kostumisasi-Git-Git-Attributes">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Customizing-Git-Git-Attributes">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Customizing-Git-Git-Attributes">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Customizing-Git-Git-Attributes">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Personalizar-o-Git-Git-Attributes">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Customizing-Git-Git-Attributes">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-Git-Nitelikleri">Türkçe</a>.</td></tr> </table> </p> <hr class="sidebar"/> <p> The source of this book is <a href="https://github.com/progit2-pl/progit2-pl">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/pl/v2/Pierwsze-kroki-Wprowadzenie-do-kontroli-wersji">Pierwsze kroki</a></h2> <ol> <li> 1.1 <a href="/book/pl/v2/Pierwsze-kroki-Wprowadzenie-do-kontroli-wersji">Wprowadzenie do kontroli wersji</a> </li> <li> 1.2 <a href="/book/pl/v2/Pierwsze-kroki-Kr%c3%b3tka-historia-Git">Krótka historia Git</a> </li> <li> 1.3 <a href="/book/pl/v2/Pierwsze-kroki-Podstawy-Git">Podstawy Git</a> </li> <li> 1.4 <a href="/book/pl/v2/Pierwsze-kroki-Linia-polece%c5%84">Linia poleceń</a> </li> <li> 1.5 <a href="/book/pl/v2/Pierwsze-kroki-Instalacja-Git">Instalacja Git</a> </li> <li> 1.6 <a href="/book/pl/v2/Pierwsze-kroki-Wst%c4%99pna-konfiguracja-Git">Wstępna konfiguracja Git</a> </li> <li> 1.7 <a href="/book/pl/v2/Pierwsze-kroki-Uzyskiwanie-pomocy">Uzyskiwanie pomocy</a> </li> <li> 1.8 <a href="/book/pl/v2/Pierwsze-kroki-Podsumowanie">Podsumowanie</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/pl/v2/Podstawy-Gita-Pierwsze-repozytorium-Gita">Podstawy Gita</a></h2> <ol> <li> 2.1 <a href="/book/pl/v2/Podstawy-Gita-Pierwsze-repozytorium-Gita">Pierwsze repozytorium Gita</a> </li> <li> 2.2 <a href="/book/pl/v2/Podstawy-Gita-Rejestrowanie-zmian-w-repozytorium">Rejestrowanie zmian w repozytorium</a> </li> <li> 2.3 <a href="/book/pl/v2/Podstawy-Gita-Podgl%c4%85d-historii-rewizji">Podgląd historii rewizji</a> </li> <li> 2.4 <a href="/book/pl/v2/Podstawy-Gita-Cofanie-zmian">Cofanie zmian</a> </li> <li> 2.5 <a href="/book/pl/v2/Podstawy-Gita-Praca-ze-zdalnym-repozytorium">Praca ze zdalnym repozytorium</a> </li> <li> 2.6 <a href="/book/pl/v2/Podstawy-Gita-Tagowanie">Tagowanie</a> </li> <li> 2.7 <a href="/book/pl/v2/Podstawy-Gita-Aliasy">Aliasy</a> </li> <li> 2.8 <a href="/book/pl/v2/Podstawy-Gita-Podsumowanie">Podsumowanie</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/pl/v2/Ga%c5%82%c4%99zie-Gita-Czym-jest-ga%c5%82%c4%85%c5%ba">Gałęzie Gita</a></h2> <ol> <li> 3.1 <a href="/book/pl/v2/Ga%c5%82%c4%99zie-Gita-Czym-jest-ga%c5%82%c4%85%c5%ba">Czym jest gałąź</a> </li> <li> 3.2 <a href="/book/pl/v2/Ga%c5%82%c4%99zie-Gita-Podstawy-rozga%c5%82%c4%99ziania-i-scalania">Podstawy rozgałęziania i scalania</a> </li> <li> 3.3 <a href="/book/pl/v2/Ga%c5%82%c4%99zie-Gita-Zarz%c4%85dzanie-ga%c5%82%c4%99ziami">Zarządzanie gałęziami</a> </li> <li> 3.4 <a href="/book/pl/v2/Ga%c5%82%c4%99zie-Gita-Sposoby-pracy-z-ga%c5%82%c4%99ziami">Sposoby pracy z gałęziami</a> </li> <li> 3.5 <a href="/book/pl/v2/Ga%c5%82%c4%99zie-Gita-Ga%c5%82%c4%99zie-zdalne">Gałęzie zdalne</a> </li> <li> 3.6 <a href="/book/pl/v2/Ga%c5%82%c4%99zie-Gita-Zmiana-bazy">Zmiana bazy</a> </li> <li> 3.7 <a href="/book/pl/v2/Ga%c5%82%c4%99zie-Gita-Podsumowanie">Podsumowanie</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/pl/v2/Git-na-serwerze-Protoko%c5%82y">Git na serwerze</a></h2> <ol> <li> 4.1 <a href="/book/pl/v2/Git-na-serwerze-Protoko%c5%82y">Protokoły</a> </li> <li> 4.2 <a href="/book/pl/v2/Git-na-serwerze-Uruchomienie-Git-na-serwerze">Uruchomienie Git na serwerze</a> </li> <li> 4.3 <a href="/book/pl/v2/Git-na-serwerze-Generowanie-Twojego-publicznego-klucza-SSH">Generowanie Twojego publicznego klucza SSH</a> </li> <li> 4.4 <a href="/book/pl/v2/Git-na-serwerze-Konfigurowanie-serwera">Konfigurowanie serwera</a> </li> <li> 4.5 <a href="/book/pl/v2/Git-na-serwerze-Git-Daemon">Git Daemon</a> </li> <li> 4.6 <a href="/book/pl/v2/Git-na-serwerze-Smart-HTTP">Smart HTTP</a> </li> <li> 4.7 <a href="/book/pl/v2/Git-na-serwerze-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/pl/v2/Git-na-serwerze-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/pl/v2/Git-na-serwerze-Inne-opcje-hostowania-przez-podmioty-zewn%c4%99trzne">Inne opcje hostowania przez podmioty zewnętrzne</a> </li> <li> 4.10 <a href="/book/pl/v2/Git-na-serwerze-Podsumowanie">Podsumowanie</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/pl/v2/Rozproszony-Git-Rozproszone-przep%c5%82ywy-pracy">Rozproszony Git</a></h2> <ol> <li> 5.1 <a href="/book/pl/v2/Rozproszony-Git-Rozproszone-przep%c5%82ywy-pracy">Rozproszone przepływy pracy</a> </li> <li> 5.2 <a href="/book/pl/v2/Rozproszony-Git-Wgrywanie-zmian-do-projektu">Wgrywanie zmian do projektu</a> </li> <li> 5.3 <a href="/book/pl/v2/Rozproszony-Git-Utrzymywanie-projektu">Utrzymywanie projektu</a> </li> <li> 5.4 <a href="/book/pl/v2/Rozproszony-Git-Podsumowanie">Podsumowanie</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/pl/v2/GitHub-Account-Setup-and-Configuration">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/pl/v2/GitHub-Account-Setup-and-Configuration">Account Setup and Configuration</a> </li> <li> 6.2 <a href="/book/pl/v2/GitHub-Contributing-to-a-Project">Contributing to a Project</a> </li> <li> 6.3 <a href="/book/pl/v2/GitHub-Maintaining-a-Project">Maintaining a Project</a> </li> <li> 6.4 <a href="/book/pl/v2/GitHub-Managing-an-organization">Managing an organization</a> </li> <li> 6.5 <a href="/book/pl/v2/GitHub-Scripting-GitHub">Scripting GitHub</a> </li> <li> 6.6 <a href="/book/pl/v2/GitHub-Summary">Summary</a> </li> </ol> </li> <li class='chapter'> <h2>7. <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Wskazywanie-rewizji">Narzędzia Gita</a></h2> <ol> <li> 7.1 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Wskazywanie-rewizji">Wskazywanie rewizji</a> </li> <li> 7.2 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Interaktywne-u%c5%bcywanie-przechowali">Interaktywne używanie przechowali</a> </li> <li> 7.3 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Schowek-i-czyszczenie">Schowek i czyszczenie</a> </li> <li> 7.4 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Signing-Your-Work">Signing Your Work</a> </li> <li> 7.5 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Searching">Searching</a> </li> <li> 7.6 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Przepisywanie-historii">Przepisywanie historii</a> </li> <li> 7.7 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Reset-Demystified">Reset Demystified</a> </li> <li> 7.8 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Advanced-Merging">Advanced Merging</a> </li> <li> 7.9 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Rerere">Rerere</a> </li> <li> 7.10 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Debugowanie-z-Gitem">Debugowanie z Gitem</a> </li> <li> 7.11 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Modu%c5%82y-zale%c5%bcne">Moduły zależne</a> </li> <li> 7.12 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Bundling">Bundling</a> </li> <li> 7.13 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Replace">Replace</a> </li> <li> 7.14 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Credential-Storage">Credential Storage</a> </li> <li> 7.15 <a href="/book/pl/v2/Narz%c4%99dzia-Gita-Podsumowanie">Podsumowanie</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/pl/v2/Dostosowywanie-Gita-Konfiguracja-Gita">Dostosowywanie Gita</a></h2> <ol> <li> 8.1 <a href="/book/pl/v2/Dostosowywanie-Gita-Konfiguracja-Gita">Konfiguracja Gita</a> </li> <li> 8.2 <a href="/book/pl/v2/Dostosowywanie-Gita-Git-Attributes" class="active">Git Attributes</a> </li> <li> 8.3 <a href="/book/pl/v2/Dostosowywanie-Gita-Git-Hooks">Git Hooks</a> </li> <li> 8.4 <a href="/book/pl/v2/Dostosowywanie-Gita-An-Example-Git-Enforced-Policy">An Example Git-Enforced Policy</a> </li> <li> 8.5 <a href="/book/pl/v2/Dostosowywanie-Gita-Summary">Summary</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/pl/v2/Git-i-inne-systemy-Git-jako-klient">Git i inne systemy</a></h2> <ol> <li> 9.1 <a href="/book/pl/v2/Git-i-inne-systemy-Git-jako-klient">Git jako klient</a> </li> <li> 9.2 <a href="/book/pl/v2/Git-i-inne-systemy-Migracja-do-Gita">Migracja do Gita</a> </li> <li> 9.3 <a href="/book/pl/v2/Git-i-inne-systemy-Podsumowanie">Podsumowanie</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/pl/v2/Mechanizmy-wewn%c4%99trzne-w-Git-Komendy-typu-plumbing-i-porcelain">Mechanizmy wewnętrzne w Git</a></h2> <ol> <li> 10.1 <a href="/book/pl/v2/Mechanizmy-wewn%c4%99trzne-w-Git-Komendy-typu-plumbing-i-porcelain">Komendy typu plumbing i porcelain</a> </li> <li> 10.2 <a href="/book/pl/v2/Mechanizmy-wewn%c4%99trzne-w-Git-Obiekty-Gita">Obiekty Gita</a> </li> <li> 10.3 <a href="/book/pl/v2/Mechanizmy-wewn%c4%99trzne-w-Git-Referencje-w-Git">Referencje w Git</a> </li> <li> 10.4 <a href="/book/pl/v2/Mechanizmy-wewn%c4%99trzne-w-Git-Spakowane-pliki-packfiles">Spakowane pliki (packfiles)</a> </li> <li> 10.5 <a href="/book/pl/v2/Mechanizmy-wewn%c4%99trzne-w-Git-Refspec">Refspec</a> </li> <li> 10.6 <a href="/book/pl/v2/Mechanizmy-wewn%c4%99trzne-w-Git-Protoko%c5%82y-transferu">Protokoły transferu</a> </li> <li> 10.7 <a href="/book/pl/v2/Mechanizmy-wewn%c4%99trzne-w-Git-Konserwacja-i-odzyskiwanie-danych">Konserwacja i odzyskiwanie danych</a> </li> <li> 10.8 <a href="/book/pl/v2/Mechanizmy-wewn%c4%99trzne-w-Git-Environment-Variables">Environment Variables</a> </li> <li> 10.9 <a href="/book/pl/v2/Mechanizmy-wewn%c4%99trzne-w-Git-Podsumowanie">Podsumowanie</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/pl/v2/Appendix-A:-Git-in-Other-Environments-Graphical-Interfaces">Appendix A: Git in Other Environments</a></h2> <ol> <li> A1.1 <a href="/book/pl/v2/Appendix-A:-Git-in-Other-Environments-Graphical-Interfaces">Graphical Interfaces</a> </li> <li> A1.2 <a href="/book/pl/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Visual-Studio">Git in Visual Studio</a> </li> <li> A1.3 <a href="/book/pl/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Eclipse">Git in Eclipse</a> </li> <li> A1.4 <a href="/book/pl/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Bash">Git in Bash</a> </li> <li> A1.5 <a href="/book/pl/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Zsh">Git in Zsh</a> </li> <li> A1.6 <a href="/book/pl/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Powershell">Git in Powershell</a> </li> <li> A1.7 <a href="/book/pl/v2/Appendix-A:-Git-in-Other-Environments-Summary">Summary</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/pl/v2/Appendix-B:-Embedding-Git-in-your-Applications-Command-line-Git">Appendix B: Embedding Git in your Applications</a></h2> <ol> <li> A2.1 <a href="/book/pl/v2/Appendix-B:-Embedding-Git-in-your-Applications-Command-line-Git">Command-line Git</a> </li> <li> A2.2 <a href="/book/pl/v2/Appendix-B:-Embedding-Git-in-your-Applications-Libgit2">Libgit2</a> </li> <li> A2.3 <a href="/book/pl/v2/Appendix-B:-Embedding-Git-in-your-Applications-JGit">JGit</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/pl/v2/Appendix-C:-Git-Commands-Setup-and-Config">Appendix C: Git Commands</a></h2> <ol> <li> A3.1 <a href="/book/pl/v2/Appendix-C:-Git-Commands-Setup-and-Config">Setup and Config</a> </li> <li> A3.2 <a href="/book/pl/v2/Appendix-C:-Git-Commands-Getting-and-Creating-Projects">Getting and Creating Projects</a> </li> <li> A3.3 <a href="/book/pl/v2/Appendix-C:-Git-Commands-Basic-Snapshotting">Basic Snapshotting</a> </li> <li> A3.4 <a href="/book/pl/v2/Appendix-C:-Git-Commands-Branching-and-Merging">Branching and Merging</a> </li> <li> A3.5 <a href="/book/pl/v2/Appendix-C:-Git-Commands-Sharing-and-Updating-Projects">Sharing and Updating Projects</a> </li> <li> A3.6 <a href="/book/pl/v2/Appendix-C:-Git-Commands-Inspection-and-Comparison">Inspection and Comparison</a> </li> <li> A3.7 <a href="/book/pl/v2/Appendix-C:-Git-Commands-Debugging">Debugging</a> </li> <li> A3.8 <a href="/book/pl/v2/Appendix-C:-Git-Commands-Patching">Patching</a> </li> <li> A3.9 <a href="/book/pl/v2/Appendix-C:-Git-Commands-Email">Email</a> </li> <li> A3.10 <a href="/book/pl/v2/Appendix-C:-Git-Commands-External-Systems">External Systems</a> </li> <li> A3.11 <a href="/book/pl/v2/Appendix-C:-Git-Commands-Administration">Administration</a> </li> <li> A3.12 <a href="/book/pl/v2/Appendix-C:-Git-Commands-Plumbing-Commands">Plumbing Commands</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>8.2 Dostosowywanie Gita - Git Attributes</h1> <div> <h2 id="_git_attributes">Git Attributes</h2> <div class="paragraph"> <p> Some of these settings can also be specified for a path, so that Git applies those settings only for a subdirectory or subset of files. These path-specific settings are called Git attributes and are set either in a <code>.gitattributes</code> file in one of your directories (normally the root of your project) or in the <code>.git/info/attributes</code> file if you don’t want the attributes file committed with your project.</p> </div> <div class="paragraph"> <p>Using attributes, you can do things like specify separate merge strategies for individual files or directories in your project, tell Git how to diff non-text files, or have Git filter content before you check it into or out of Git. In this section, you’ll learn about some of the attributes you can set on your paths in your Git project and see a few examples of using this feature in practice.</p> </div> <div class="sect3"> <h3 id="_binary_files">Binary Files</h3> <div class="paragraph"> <p> One cool trick for which you can use Git attributes is telling Git which files are binary (in cases it otherwise may not be able to figure out) and giving Git special instructions about how to handle those files. For instance, some text files may be machine generated and not diffable, whereas some binary files can be diffed. You’ll see how to tell Git which is which.</p> </div> <div class="sect4"> <h4 id="_identifying_binary_files">Identifying Binary Files</h4> <div class="paragraph"> <p>Some files look like text files but for all intents and purposes are to be treated as binary data. For instance, Xcode projects on the Mac contain a file that ends in <code>.pbxproj</code>, which is basically a JSON (plain-text Javascript data format) dataset written out to disk by the IDE, which records your build settings and so on. Although it’s technically a text file (because it’s all UTF-8), you don’t want to treat it as such because it’s really a lightweight database – you can’t merge the contents if two people change it, and diffs generally aren’t helpful. The file is meant to be consumed by a machine. In essence, you want to treat it like a binary file.</p> </div> <div class="paragraph"> <p>To tell Git to treat all <code>pbxproj</code> files as binary data, add the following line to your <code>.gitattributes</code> file:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>*.pbxproj binary</code></pre> </div> </div> <div class="paragraph"> <p>Now, Git won’t try to convert or fix CRLF issues; nor will it try to compute or print a diff for changes in this file when you run <code>git show</code> or <code>git diff</code> on your project.</p> </div> </div> <div class="sect4"> <h4 id="_diffing_binary_files">Diffing Binary Files</h4> <div class="paragraph"> <p>You can also use the Git attributes functionality to effectively diff binary files. You do this by telling Git how to convert your binary data to a text format that can be compared via the normal diff.</p> </div> <div class="paragraph"> <p>First, you’ll use this technique to solve one of the most annoying problems known to humanity: version-controlling Microsoft Word documents. Everyone knows that Word is the most horrific editor around, but oddly, everyone still uses it. If you want to version-control Word documents, you can stick them in a Git repository and commit every once in a while; but what good does that do? If you run <code>git diff</code> normally, you only see something like this:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git diff diff --git a/chapter1.docx b/chapter1.docx index 88839c4..4afcb7c 100644 Binary files a/chapter1.docx and b/chapter1.docx differ</code></pre> </div> </div> <div class="paragraph"> <p>You can’t directly compare two versions unless you check them out and scan them manually, right? It turns out you can do this fairly well using Git attributes. Put the following line in your <code>.gitattributes</code> file:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>*.docx diff=word</code></pre> </div> </div> <div class="paragraph"> <p>This tells Git that any file that matches this pattern (<code>.docx</code>) should use the “word” filter when you try to view a diff that contains changes. What is the “word” filter? You have to set it up. Here you’ll configure Git to use the <code>docx2txt</code> program to convert Word documents into readable text files, which it will then diff properly.</p> </div> <div class="paragraph"> <p>First, you’ll need to install <code>docx2txt</code>; you can download it from <a href="http://docx2txt.sourceforge.net" class="bare">http://docx2txt.sourceforge.net</a>. Follow the instructions in the <code>INSTALL</code> file to put it somewhere your shell can find it. Next, you’ll write a wrapper script to convert output to the format Git expects. Create a file that’s somewhere in your path called <code>docx2txt</code>, and add these contents:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">#!/bin/bash docx2txt.pl $1 -</code></pre> </div> </div> <div class="paragraph"> <p>Don’t forget to <code>chmod a+x</code> that file. Finally, you can configure Git to use this script:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git config diff.word.textconv docx2txt</code></pre> </div> </div> <div class="paragraph"> <p>Now Git knows that if it tries to do a diff between two snapshots, and any of the files end in <code>.docx</code>, it should run those files through the “word” filter, which is defined as the <code>docx2txt</code> program. This effectively makes nice text-based versions of your Word files before attempting to diff them.</p> </div> <div class="paragraph"> <p>Here’s an example: Chapter 1 of this book was converted to Word format and committed in a Git repository. Then a new paragraph was added. Here’s what <code>git diff</code> shows:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git diff diff --git a/chapter1.docx b/chapter1.docx index 0b013ca..ba25db5 100644 --- a/chapter1.docx +++ b/chapter1.docx @@ -2,6 +2,7 @@ This chapter will be about getting started with Git. We will begin at the beginning by explaining some background on version control tools, then move on to how to get Git running on your system and finally how to get it setup to start working with. At the end of this chapter you should understand why Git is around, why you should use it and you should be all setup to do so. 1.1. About Version Control What is "version control", and why should you care? Version control is a system that records changes to a file or set of files over time so that you can recall specific versions later. For the examples in this book you will use software source code as the files being version controlled, though in reality you can do this with nearly any type of file on a computer. +Testing: 1, 2, 3. If you are a graphic or web designer and want to keep every version of an image or layout (which you would most certainly want to), a Version Control System (VCS) is a very wise thing to use. It allows you to revert files back to a previous state, revert the entire project back to a previous state, compare changes over time, see who last modified something that might be causing a problem, who introduced an issue and when, and more. Using a VCS also generally means that if you screw things up or lose files, you can easily recover. In addition, you get all this for very little overhead. 1.1.1. Local Version Control Systems Many people's version-control method of choice is to copy files into another directory (perhaps a time-stamped directory, if they're clever). This approach is very common because it is so simple, but it is also incredibly error prone. It is easy to forget which directory you're in and accidentally write to the wrong file or copy over files you don't mean to.</code></pre> </div> </div> <div class="paragraph"> <p>Git successfully and succinctly tells us that we added the string “Testing: 1, 2, 3.”, which is correct. It’s not perfect – formatting changes wouldn’t show up here – but it certainly works.</p> </div> <div class="paragraph"> <p>Another interesting problem you can solve this way involves diffing image files. One way to do this is to run image files through a filter that extracts their EXIF information – metadata that is recorded with most image formats. If you download and install the <code>exiftool</code> program, you can use it to convert your images into text about the metadata, so at least the diff will show you a textual representation of any changes that happened:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo '*.png diff=exif' &gt;&gt; .gitattributes $ git config diff.exif.textconv exiftool</code></pre> </div> </div> <div class="paragraph"> <p>If you replace an image in your project and run <code>git diff</code>, you see something like this:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>diff --git a/image.png b/image.png index 88839c4..4afcb7c 100644 --- a/image.png +++ b/image.png @@ -1,12 +1,12 @@ ExifTool Version Number : 7.74 -File Size : 70 kB -File Modification Date/Time : 2009:04:21 07:02:45-07:00 +File Size : 94 kB +File Modification Date/Time : 2009:04:21 07:02:43-07:00 File Type : PNG MIME Type : image/png -Image Width : 1058 -Image Height : 889 +Image Width : 1056 +Image Height : 827 Bit Depth : 8 Color Type : RGB with Alpha</code></pre> </div> </div> <div class="paragraph"> <p>You can easily see that the file size and image dimensions have both changed.</p> </div> </div> </div> <div class="sect3"> <h3 id="_keyword_expansion">Keyword Expansion</h3> <div class="paragraph"> <p> SVN- or CVS-style keyword expansion is often requested by developers used to those systems. The main problem with this in Git is that you can’t modify a file with information about the commit after you’ve committed, because Git checksums the file first. However, you can inject text into a file when it’s checked out and remove it again before it’s added to a commit. Git attributes offers you two ways to do this.</p> </div> <div class="paragraph"> <p>First, you can inject the SHA-1 checksum of a blob into an <code>$Id$</code> field in the file automatically. If you set this attribute on a file or set of files, then the next time you check out that branch, Git will replace that field with the SHA-1 of the blob. It’s important to notice that it isn’t the SHA-1 of the commit, but of the blob itself:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo '*.txt ident' &gt;&gt; .gitattributes $ echo '$Id$' &gt; test.txt</code></pre> </div> </div> <div class="paragraph"> <p>The next time you check out this file, Git injects the SHA-1 of the blob:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ rm test.txt $ git checkout -- test.txt $ cat test.txt $Id: 42812b7653c7b88933f8a9d6cad0ca16714b9bb3 $</code></pre> </div> </div> <div class="paragraph"> <p>However, that result is of limited use. If you’ve used keyword substitution in CVS or Subversion, you can include a datestamp – the SHA-1 isn’t all that helpful, because it’s fairly random and you can’t tell if one SHA-1 is older or newer than another just by looking at them.</p> </div> <div class="paragraph"> <p>It turns out that you can write your own filters for doing substitutions in files on commit/checkout. These are called “clean” and “smudge” filters. In the <code>.gitattributes</code> file, you can set a filter for particular paths and then set up scripts that will process files just before they’re checked out (“smudge”, see <a href="/book/pl/v2/ch00/filters_a">The “smudge” filter is run on checkout.</a>) and just before they’re staged (“clean”, see <a href="/book/pl/v2/ch00/filters_b">The “clean” filter is run when files are staged.</a>). These filters can be set to do all sorts of fun things.</p> </div> <div id="filters_a" class="imageblock"> <div class="content"> <img src="/book/pl/v2/images/smudge.png" alt="The ``smudge'' filter is run on checkout."> </div> <div class="title">Figure 144. The “smudge” filter is run on checkout.</div> </div> <div id="filters_b" class="imageblock"> <div class="content"> <img src="/book/pl/v2/images/clean.png" alt="The ``clean'' filter is run when files are staged."> </div> <div class="title">Figure 145. The “clean” filter is run when files are staged.</div> </div> <div class="paragraph"> <p>The original commit message for this feature gives a simple example of running all your C source code through the <code>indent</code> program before committing. You can set it up by setting the filter attribute in your <code>.gitattributes</code> file to filter <code>*.c</code> files with the “indent” filter:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>*.c filter=indent</code></pre> </div> </div> <div class="paragraph"> <p>Then, tell Git what the “indent” filter does on smudge and clean:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git config --global filter.indent.clean indent $ git config --global filter.indent.smudge cat</code></pre> </div> </div> <div class="paragraph"> <p>In this case, when you commit files that match <code>*.c</code>, Git will run them through the indent program before it stages them and then run them through the <code>cat</code> program before it checks them back out onto disk. The <code>cat</code> program does essentially nothing: it spits out the same data that it comes in. This combination effectively filters all C source code files through <code>indent</code> before committing.</p> </div> <div class="paragraph"> <p>Another interesting example gets <code>$Date$</code> keyword expansion, RCS style. To do this properly, you need a small script that takes a filename, figures out the last commit date for this project, and inserts the date into the file. Here is a small Ruby script that does that:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">#! /usr/bin/env ruby data = STDIN.read last_date = `git log --pretty=format:"%ad" -1` puts data.gsub('$Date$', '$Date: ' + last_date.to_s + '$')</code></pre> </div> </div> <div class="paragraph"> <p>All the script does is get the latest commit date from the <code>git log</code> command, stick that into any <code>$Date$</code> strings it sees in stdin, and print the results – it should be simple to do in whatever language you’re most comfortable in. You can name this file <code>expand_date</code> and put it in your path. Now, you need to set up a filter in Git (call it <code>dater</code>) and tell it to use your <code>expand_date</code> filter to smudge the files on checkout. You’ll use a Perl expression to clean that up on commit:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git config filter.dater.smudge expand_date $ git config filter.dater.clean 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date\\\$/"'</code></pre> </div> </div> <div class="paragraph"> <p>This Perl snippet strips out anything it sees in a <code>$Date$</code> string, to get back to where you started. Now that your filter is ready, you can test it by setting up a file with your <code>$Date$</code> keyword and then setting up a Git attribute for that file that engages the new filter:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo '# $Date$' &gt; date_test.txt $ echo 'date*.txt filter=dater' &gt;&gt; .gitattributes</code></pre> </div> </div> <div class="paragraph"> <p>If you commit those changes and check out the file again, you see the keyword properly substituted:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git add date_test.txt .gitattributes $ git commit -m "Testing date expansion in Git" $ rm date_test.txt $ git checkout date_test.txt $ cat date_test.txt # $Date: Tue Apr 21 07:26:52 2009 -0700$</code></pre> </div> </div> <div class="paragraph"> <p>You can see how powerful this technique can be for customized applications. You have to be careful, though, because the <code>.gitattributes</code> file is committed and passed around with the project, but the driver (in this case, <code>dater</code>) isn’t, so it won’t work everywhere. When you design these filters, they should be able to fail gracefully and have the project still work properly.</p> </div> </div> <div class="sect3"> <h3 id="_exporting_your_repository">Exporting Your Repository</h3> <div class="paragraph"> <p> Git attribute data also allows you to do some interesting things when exporting an archive of your project.</p> </div> <div class="sect4"> <h4 id="_export_ignore"><code>export-ignore</code></h4> <div class="paragraph"> <p>You can tell Git not to export certain files or directories when generating an archive. If there is a subdirectory or file that you don’t want to include in your archive file but that you do want checked into your project, you can determine those files via the <code>export-ignore</code> attribute.</p> </div> <div class="paragraph"> <p>For example, say you have some test files in a <code>test/</code> subdirectory, and it doesn’t make sense to include them in the tarball export of your project. You can add the following line to your Git attributes file:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>test/ export-ignore</code></pre> </div> </div> <div class="paragraph"> <p>Now, when you run git archive to create a tarball of your project, that directory won’t be included in the archive.</p> </div> </div> <div class="sect4"> <h4 id="_export_subst"><code>export-subst</code></h4> <div class="paragraph"> <p>Another thing you can do for your archives is some simple keyword substitution. Git lets you put the string <code>$Format:$</code> in any file with any of the <code>--pretty=format</code> formatting shortcodes, many of which you saw in Chapter 2. For instance, if you want to include a file named <code>LAST_COMMIT</code> in your project, and the last commit date was automatically injected into it when <code>git archive</code> ran, you can set up the file like this:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo 'Last commit date: $Format:%cd$' &gt; LAST_COMMIT $ echo "LAST_COMMIT export-subst" &gt;&gt; .gitattributes $ git add LAST_COMMIT .gitattributes $ git commit -am 'adding LAST_COMMIT file for archives'</code></pre> </div> </div> <div class="paragraph"> <p>When you run <code>git archive</code>, the contents of that file when people open the archive file will look like this:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ cat LAST_COMMIT Last commit date: $Format:Tue Apr 21 08:38:48 2009 -0700$</code></pre> </div> </div> </div> </div> <div class="sect3"> <h3 id="_merge_strategies">Merge Strategies</h3> <div class="paragraph"> <p> You can also use Git attributes to tell Git to use different merge strategies for specific files in your project. One very useful option is to tell Git to not try to merge specific files when they have conflicts, but rather to use your side of the merge over someone else’s.</p> </div> <div class="paragraph"> <p>This is helpful if a branch in your project has diverged or is specialized, but you want to be able to merge changes back in from it, and you want to ignore certain files. Say you have a database settings file called <code>database.xml</code> that is different in two branches, and you want to merge in your other branch without messing up the database file. You can set up an attribute like this:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>database.xml merge=ours</code></pre> </div> </div> <div class="paragraph"> <p>And then define a dummy <code>ours</code> merge strategy with:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git config --global merge.ours.driver true</code></pre> </div> </div> <div class="paragraph"> <p>If you merge in the other branch, instead of having merge conflicts with the <code>database.xml</code> file, you see something like this:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git merge topic Auto-merging database.xml Merge made by recursive.</code></pre> </div> </div> <div class="paragraph"> <p>In this case, <code>database.xml</code> stays at whatever version you originally had.</p> </div> </div> <div id="nav"><a href="/book/pl/v2/Dostosowywanie-Gita-Konfiguracja-Gita">prev</a> | <a href="/book/pl/v2/Dostosowywanie-Gita-Git-Hooks">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>

Pages: 1 2 3 4 5 6 7 8 9 10