├── couchapp ├── .couchapprc ├── _id ├── templates │ ├── foot.html │ └── head.html ├── Readme.md ├── shows │ └── chapter.js ├── Makefile └── vendor │ ├── mustache.js │ └── mustache.js │ └── markdown │ └── showdown.js ├── .gitattributes ├── fr ├── NOTES.fr-fr.markdown ├── NOTES.fr-fr.md ├── README.md └── glossaire-git.adoc ├── ca └── README.txt ├── epub ├── title.png └── ProGit.css ├── ebooks └── cover.png ├── figures ├── 18333fig0101-tn.png ├── 18333fig0102-tn.png ├── 18333fig0103-tn.png ├── 18333fig0104-tn.png ├── 18333fig0105-tn.png ├── 18333fig0106-tn.png ├── 18333fig0107-tn.png ├── 18333fig0201-tn.png ├── 18333fig0202-tn.png ├── 18333fig0301-tn.png ├── 18333fig0302-tn.png ├── 18333fig0303-tn.png ├── 18333fig0304-tn.png ├── 18333fig0305-tn.png ├── 18333fig0306-tn.png ├── 18333fig0307-tn.png ├── 18333fig0308-tn.png ├── 18333fig0309-tn.png ├── 18333fig0310-tn.png ├── 18333fig0311-tn.png ├── 18333fig0312-tn.png ├── 18333fig0313-tn.png ├── 18333fig0314-tn.png ├── 18333fig0315-tn.png ├── 18333fig0316-tn.png ├── 18333fig0317-tn.png ├── 18333fig0318-tn.png ├── 18333fig0319-tn.png ├── 18333fig0320-tn.png ├── 18333fig0321-tn.png ├── 18333fig0322-tn.png ├── 18333fig0323-tn.png ├── 18333fig0324-tn.png ├── 18333fig0325-tn.png ├── 18333fig0326-tn.png ├── 18333fig0327-tn.png ├── 18333fig0328-tn.png ├── 18333fig0329-tn.png ├── 18333fig0330-tn.png ├── 18333fig0331-tn.png ├── 18333fig0332-tn.png ├── 18333fig0333-tn.png ├── 18333fig0334-tn.png ├── 18333fig0335-tn.png ├── 18333fig0336-tn.png ├── 18333fig0337-tn.png ├── 18333fig0338-tn.png ├── 18333fig0339-tn.png ├── 18333fig0401-tn.png ├── 18333fig0402-tn.png ├── 18333fig0403-tn.png ├── 18333fig0404-tn.png ├── 18333fig0405-tn.png ├── 18333fig0406-tn.png ├── 18333fig0407-tn.png ├── 18333fig0408-tn.png ├── 18333fig0409-tn.png ├── 18333fig0410-tn.png ├── 18333fig0411-tn.png ├── 18333fig0412-tn.png ├── 18333fig0413-tn.png ├── 18333fig0414-tn.png ├── 18333fig0415-tn.png ├── 18333fig0501-tn.png ├── 18333fig0502-tn.png ├── 18333fig0503-tn.png ├── 18333fig0504-tn.png ├── 18333fig0505-tn.png ├── 18333fig0506-tn.png ├── 18333fig0507-tn.png ├── 18333fig0508-tn.png ├── 18333fig0509-tn.png ├── 18333fig0510-tn.png ├── 18333fig0511-tn.png ├── 18333fig0512-tn.png ├── 18333fig0513-tn.png ├── 18333fig0514-tn.png ├── 18333fig0515-tn.png ├── 18333fig0516-tn.png ├── 18333fig0517-tn.png ├── 18333fig0518-tn.png ├── 18333fig0519-tn.png ├── 18333fig0520-tn.png ├── 18333fig0521-tn.png ├── 18333fig0522-tn.png ├── 18333fig0523-tn.png ├── 18333fig0524-tn.png ├── 18333fig0525-tn.png ├── 18333fig0526-tn.png ├── 18333fig0527-tn.png ├── 18333fig0601-tn.png ├── 18333fig0701-tn.png ├── 18333fig0702-tn.png ├── 18333fig0703-tn.png ├── 18333fig0901-tn.png ├── 18333fig0902-tn.png ├── 18333fig0903-tn.png └── 18333fig0904-tn.png ├── .travis.yml ├── Gemfile ├── no-nb └── README ├── es ├── README ├── glosario-Benzirpi.txt └── NOTES ├── .gitignore ├── ru ├── README └── Glossary ├── fi └── NOTES ├── figures-dia ├── makeimages └── fig0310.dia ├── ar ├── README └── NOTES ├── ja ├── translation glossaries.txt ├── README.md └── 01-introduction │ └── 01-chapter1.markdown ├── makepdfs ├── summary.rb ├── latex ├── README ├── template.tex ├── config.yml └── makepdf ├── pl └── translation-guidelines.txt ├── ko ├── README └── 01-introduction │ └── 01-chapter1.markdown ├── README.md ├── th └── README.md ├── makeebooks ├── Rakefile ├── zh-tw └── 01-introduction │ └── 01-chapter1.markdown ├── zh └── 01-introduction │ └── 01-chapter1.markdown ├── it └── 06-git-tools │ └── 01-chapter6.markdown ├── de └── README.md └── pt-br └── figures-dia └── fig0501.dia /couchapp/.couchapprc: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /couchapp/_id: -------------------------------------------------------------------------------- 1 | _design/chacon 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.graffle binary 2 | -------------------------------------------------------------------------------- /fr/NOTES.fr-fr.markdown: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ca/README.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/ca/README.txt -------------------------------------------------------------------------------- /epub/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/epub/title.png -------------------------------------------------------------------------------- /ebooks/cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/ebooks/cover.png -------------------------------------------------------------------------------- /figures/18333fig0101-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0101-tn.png -------------------------------------------------------------------------------- /figures/18333fig0102-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0102-tn.png -------------------------------------------------------------------------------- /figures/18333fig0103-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0103-tn.png -------------------------------------------------------------------------------- /figures/18333fig0104-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0104-tn.png -------------------------------------------------------------------------------- /figures/18333fig0105-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0105-tn.png -------------------------------------------------------------------------------- /figures/18333fig0106-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0106-tn.png -------------------------------------------------------------------------------- /figures/18333fig0107-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0107-tn.png -------------------------------------------------------------------------------- /figures/18333fig0201-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0201-tn.png -------------------------------------------------------------------------------- /figures/18333fig0202-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0202-tn.png -------------------------------------------------------------------------------- /figures/18333fig0301-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0301-tn.png -------------------------------------------------------------------------------- /figures/18333fig0302-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0302-tn.png -------------------------------------------------------------------------------- /figures/18333fig0303-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0303-tn.png -------------------------------------------------------------------------------- /figures/18333fig0304-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0304-tn.png -------------------------------------------------------------------------------- /figures/18333fig0305-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0305-tn.png -------------------------------------------------------------------------------- /figures/18333fig0306-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0306-tn.png -------------------------------------------------------------------------------- /figures/18333fig0307-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0307-tn.png -------------------------------------------------------------------------------- /figures/18333fig0308-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0308-tn.png -------------------------------------------------------------------------------- /figures/18333fig0309-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0309-tn.png -------------------------------------------------------------------------------- /figures/18333fig0310-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0310-tn.png -------------------------------------------------------------------------------- /figures/18333fig0311-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0311-tn.png -------------------------------------------------------------------------------- /figures/18333fig0312-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0312-tn.png -------------------------------------------------------------------------------- /figures/18333fig0313-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0313-tn.png -------------------------------------------------------------------------------- /figures/18333fig0314-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0314-tn.png -------------------------------------------------------------------------------- /figures/18333fig0315-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0315-tn.png -------------------------------------------------------------------------------- /figures/18333fig0316-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0316-tn.png -------------------------------------------------------------------------------- /figures/18333fig0317-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0317-tn.png -------------------------------------------------------------------------------- /figures/18333fig0318-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0318-tn.png -------------------------------------------------------------------------------- /figures/18333fig0319-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0319-tn.png -------------------------------------------------------------------------------- /figures/18333fig0320-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0320-tn.png -------------------------------------------------------------------------------- /figures/18333fig0321-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0321-tn.png -------------------------------------------------------------------------------- /figures/18333fig0322-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0322-tn.png -------------------------------------------------------------------------------- /figures/18333fig0323-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0323-tn.png -------------------------------------------------------------------------------- /figures/18333fig0324-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0324-tn.png -------------------------------------------------------------------------------- /figures/18333fig0325-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0325-tn.png -------------------------------------------------------------------------------- /figures/18333fig0326-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0326-tn.png -------------------------------------------------------------------------------- /figures/18333fig0327-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0327-tn.png -------------------------------------------------------------------------------- /figures/18333fig0328-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0328-tn.png -------------------------------------------------------------------------------- /figures/18333fig0329-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0329-tn.png -------------------------------------------------------------------------------- /figures/18333fig0330-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0330-tn.png -------------------------------------------------------------------------------- /figures/18333fig0331-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0331-tn.png -------------------------------------------------------------------------------- /figures/18333fig0332-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0332-tn.png -------------------------------------------------------------------------------- /figures/18333fig0333-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0333-tn.png -------------------------------------------------------------------------------- /figures/18333fig0334-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0334-tn.png -------------------------------------------------------------------------------- /figures/18333fig0335-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0335-tn.png -------------------------------------------------------------------------------- /figures/18333fig0336-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0336-tn.png -------------------------------------------------------------------------------- /figures/18333fig0337-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0337-tn.png -------------------------------------------------------------------------------- /figures/18333fig0338-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0338-tn.png -------------------------------------------------------------------------------- /figures/18333fig0339-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0339-tn.png -------------------------------------------------------------------------------- /figures/18333fig0401-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0401-tn.png -------------------------------------------------------------------------------- /figures/18333fig0402-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0402-tn.png -------------------------------------------------------------------------------- /figures/18333fig0403-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0403-tn.png -------------------------------------------------------------------------------- /figures/18333fig0404-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0404-tn.png -------------------------------------------------------------------------------- /figures/18333fig0405-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0405-tn.png -------------------------------------------------------------------------------- /figures/18333fig0406-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0406-tn.png -------------------------------------------------------------------------------- /figures/18333fig0407-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0407-tn.png -------------------------------------------------------------------------------- /figures/18333fig0408-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0408-tn.png -------------------------------------------------------------------------------- /figures/18333fig0409-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0409-tn.png -------------------------------------------------------------------------------- /figures/18333fig0410-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0410-tn.png -------------------------------------------------------------------------------- /figures/18333fig0411-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0411-tn.png -------------------------------------------------------------------------------- /figures/18333fig0412-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0412-tn.png -------------------------------------------------------------------------------- /figures/18333fig0413-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0413-tn.png -------------------------------------------------------------------------------- /figures/18333fig0414-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0414-tn.png -------------------------------------------------------------------------------- /figures/18333fig0415-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0415-tn.png -------------------------------------------------------------------------------- /figures/18333fig0501-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0501-tn.png -------------------------------------------------------------------------------- /figures/18333fig0502-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0502-tn.png -------------------------------------------------------------------------------- /figures/18333fig0503-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0503-tn.png -------------------------------------------------------------------------------- /figures/18333fig0504-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0504-tn.png -------------------------------------------------------------------------------- /figures/18333fig0505-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0505-tn.png -------------------------------------------------------------------------------- /figures/18333fig0506-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0506-tn.png -------------------------------------------------------------------------------- /figures/18333fig0507-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0507-tn.png -------------------------------------------------------------------------------- /figures/18333fig0508-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0508-tn.png -------------------------------------------------------------------------------- /figures/18333fig0509-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0509-tn.png -------------------------------------------------------------------------------- /figures/18333fig0510-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0510-tn.png -------------------------------------------------------------------------------- /figures/18333fig0511-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0511-tn.png -------------------------------------------------------------------------------- /figures/18333fig0512-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0512-tn.png -------------------------------------------------------------------------------- /figures/18333fig0513-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0513-tn.png -------------------------------------------------------------------------------- /figures/18333fig0514-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0514-tn.png -------------------------------------------------------------------------------- /figures/18333fig0515-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0515-tn.png -------------------------------------------------------------------------------- /figures/18333fig0516-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0516-tn.png -------------------------------------------------------------------------------- /figures/18333fig0517-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0517-tn.png -------------------------------------------------------------------------------- /figures/18333fig0518-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0518-tn.png -------------------------------------------------------------------------------- /figures/18333fig0519-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0519-tn.png -------------------------------------------------------------------------------- /figures/18333fig0520-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0520-tn.png -------------------------------------------------------------------------------- /figures/18333fig0521-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0521-tn.png -------------------------------------------------------------------------------- /figures/18333fig0522-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0522-tn.png -------------------------------------------------------------------------------- /figures/18333fig0523-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0523-tn.png -------------------------------------------------------------------------------- /figures/18333fig0524-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0524-tn.png -------------------------------------------------------------------------------- /figures/18333fig0525-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0525-tn.png -------------------------------------------------------------------------------- /figures/18333fig0526-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0526-tn.png -------------------------------------------------------------------------------- /figures/18333fig0527-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0527-tn.png -------------------------------------------------------------------------------- /figures/18333fig0601-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0601-tn.png -------------------------------------------------------------------------------- /figures/18333fig0701-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0701-tn.png -------------------------------------------------------------------------------- /figures/18333fig0702-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0702-tn.png -------------------------------------------------------------------------------- /figures/18333fig0703-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0703-tn.png -------------------------------------------------------------------------------- /figures/18333fig0901-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0901-tn.png -------------------------------------------------------------------------------- /figures/18333fig0902-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0902-tn.png -------------------------------------------------------------------------------- /figures/18333fig0903-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0903-tn.png -------------------------------------------------------------------------------- /figures/18333fig0904-tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GArik/progit/HEAD/figures/18333fig0904-tn.png -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | rvm: 3 | - 1.9.3 4 | script: rake ci:check 5 | notifications: 6 | email: false -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'maruku', '0.6.1' 4 | gem 'redcarpet' 5 | gem 'rdiscount' 6 | -------------------------------------------------------------------------------- /no-nb/README: -------------------------------------------------------------------------------- 1 | Norsk oversettelse av boken Pro Git 2 | =================================== 3 | 4 | Oversatt av: David Roheim 5 | 6 | -------------------------------------------------------------------------------- /es/README: -------------------------------------------------------------------------------- 1 | # Traducción al español (España) 2 | 3 | Agradezco todo tipo de sugerencias y correcciones sobre mi traducción del libro Pro Git (http://progit.org/). 4 | -------------------------------------------------------------------------------- /couchapp/templates/foot.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | progit.*.pdf 2 | progit.*.mobi 3 | progit.*.epub 4 | progit.*.html 5 | progit-*.epub 6 | *.swp 7 | latex/* 8 | !latex/makepdf 9 | !latex/README 10 | !latex/template.tex 11 | !latex/config.yml 12 | epub/temp 13 | *~ 14 | .#* 15 | figures/* 16 | */*.session 17 | -------------------------------------------------------------------------------- /couchapp/Readme.md: -------------------------------------------------------------------------------- 1 | # Chacon, a Markdown Viewer for the Progit book 2 | 3 | ## Usage 4 | 5 | $ cd couchapp 6 | $ make en 7 | $ couchapp push . progit 8 | $ open http://127.0.0.1:5984/progit/_design/chacon/_show/chapter/01-chapter1 9 | 10 | ## Requirements 11 | 12 | GNU Make 13 | 14 | Couchapp >= 0.6.0 15 | 16 | $ easy_install -U couchapp 17 | 18 | -------------------------------------------------------------------------------- /ru/README: -------------------------------------------------------------------------------- 1 | Перевод Pro Git на русский язык 2 | =================================== 3 | 4 | Координация работы переводчиков осуществляется через wiki: 5 | 6 | https://github.com/GArik/progit/wiki 7 | 8 | Там находится словарь, FAQ и страничка статуса. 9 | 10 | FAQ: https://github.com/GArik/progit/wiki/FAQ 11 | Словарь: https://github.com/GArik/progit/wiki/Glossary 12 | Статус: https://github.com/GArik/progit/wiki/Status 13 | -------------------------------------------------------------------------------- /couchapp/shows/chapter.js: -------------------------------------------------------------------------------- 1 | function(doc, req) { 2 | //!json templates 3 | send(templates.head); 4 | var markdown = require("vendor/markdown/showdown"); 5 | 6 | var resolve_figures = function (text) { 7 | return text.replace(/Insert ([^\.]+).png/g, function(all, figure) { 8 | return '
'; 9 | }); 10 | }; 11 | 12 | send(markdown.toHtml(resolve_figures(doc.body))); 13 | send(templates.foot); 14 | } 15 | -------------------------------------------------------------------------------- /fi/NOTES: -------------------------------------------------------------------------------- 1 | Chapter 1 - Line 56: What is a proper finnish translation for the word "snapshot" in this case? Translated now as 'tilannekuvat'. 2 | Multiline: What is a proper finnish translation for the word "commit" in this case? Or do we need it, is permanen change (like it is now) enought to tell what it is about? 3 | Chapter "The Three Stages" ("Kolme tilaa") has mentioned the "staged" word, what is correct translation for this in finnish? Now translated as "lavastettu". 4 | Line 230: Translation for a word "Backports" 5 | -------------------------------------------------------------------------------- /figures-dia/makeimages: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Process all dia images to OUTFORMAT images. 4 | # Usage: makeimages [lang] 5 | # If localized image is available - uses it, else uses default one. 6 | 7 | OUTFORMAT=png 8 | 9 | path="." 10 | outpath="." 11 | 12 | for img in `find $path -name "*.dia"` 13 | do 14 | infile=$img 15 | if [[ -n $1 ]] 16 | then 17 | tst=../$1/figures-dia/${img#$path/} 18 | if [[ -f $tst ]] 19 | then 20 | infile=$tst 21 | fi 22 | fi 23 | outfile=$outpath/${img%.dia}.$OUTFORMAT 24 | dia $infile -e $outfile 25 | done 26 | -------------------------------------------------------------------------------- /ar/README: -------------------------------------------------------------------------------- 1 | محتويات كتاب احترف Git 2 | ======================= 3 | هذا هو الكود المصدري لكتاب احترف Git. هذا الكتاب مرخص تحت Creative Commons Attribution-Non Commercial-Share Alike 3.0. أتمنى أن تجد فائدة في هذا الكتاب. يمكنك الحصول على نسخة مطبوعة من الكتاب من Apress (لدعم الكاتب) من متجر أمازون: 4 | 5 | http://tinyurl.com/amazonprogit 6 | 7 | عثرت على خطأ؟ 8 | ======================= 9 | إذا عثرت على أي خطأ تقني أو في الترجمة أرجو منك مراسلتي وإعلامي بالأمر على: schacon at gmail dot com. 10 | 11 | 12 | الترجمة 13 | ======================= 14 | هذه هي الترجمة العربية لكتاب Pro Git (احترف Git). يمكنك المساعدة في ترجمة الكتاب عن طريق الذهاب الى صفحة المشروع على GitHub. 15 | -------------------------------------------------------------------------------- /epub/ProGit.css: -------------------------------------------------------------------------------- 1 | ul { 2 | margin: 20px; 3 | } 4 | 5 | ol { 6 | margin: 20px; 7 | } 8 | 9 | body pre { 10 | margin: 10px; 11 | font-weight: bold; 12 | } 13 | 14 | body pre2 { 15 | background-color: silver; 16 | padding: 10px; 17 | border-top-style: solid; 18 | border-left-style: solid; 19 | border-left-width: 1px; 20 | border-top-width: 1px; 21 | overflow-x: auto; /* Use horizontal scroller if needed; for Firefox 2, not needed in Firefox 3 */ 22 | white-space: pre-wrap; /* css-3 */ 23 | white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ 24 | white-space: -pre-wrap; /* Opera 4-6 */ 25 | white-space: -o-pre-wrap; /* Opera 7 */ 26 | /* width: 99%; */ 27 | word-wrap: break-word; /* Internet Explorer 5.5+ */ 28 | } -------------------------------------------------------------------------------- /ar/NOTES: -------------------------------------------------------------------------------- 1 | ملاحظات حول الترجمة 2 | ======================= 3 | 4 | فيما يلي قائمة بالمصطلحات الإنكليزية ومحاولتي لتعريبها، يمكنك المشاركة في تعديل هذه المصطلحات وإقتراح الأفضل إن أردت. 5 | 6 | * نظام إدارة الإصدارات = Version Control System. 7 | * أنظمة إدارة الإصدارات المحلية = Local Version Control Systems. 8 | * أنظمة إدارة الإصدارات المركزية = Centralized Version Control Systems. 9 | 10 | 11 | ملاحظة: ستجد الكلمة الإنكليزية الأصلية بعد ترجمتي المقترحة لها في سياق الكتاب أول مرة تظهر فيها الكلمة في كل فصل فقط (أو أكثر حسب الحاجة). 12 | 13 | يحتاج الى ترجمة 14 | ======================= 15 | 16 | فيما يلي قائمة بالمصطلحات التي لم استطع العثور على ترجمة صحيحة لها، إذا كان لديك أي إقتراح أرجو التغيير أو المراسة beshrkayali at gmail dot com. 17 | 18 | * ش 19 | -------------------------------------------------------------------------------- /ja/translation glossaries.txt: -------------------------------------------------------------------------------- 1 | # UTF-8でっせ 2 | (vt)store 格納 3 | (n)change 変更 4 | (n)modify 修正 5 | (vt)stage ステージする 6 | (n)staging area ステージング・エリア 7 | (n)GIT directory Gitディレクトリ 8 | (n)working directory 作業ディレクトリ 9 | (n)workflow ワークフロー 10 | (a)comitted コミット済 11 | (a)modified 修正済 12 | (a)staged ステージ済 13 | (n)non-linear development ノンリニア開発 14 | (n)chapter 章 15 | # カタカナ用語末尾の長音関連 16 | # 参考: マイクロソフト日本語スタイルガイド 17 | # http://www.microsoft.com/language/ja/jp/download.mspx 18 | # http://www.microsoft.com/japan/presspass/detail.aspx?newsid=3491 19 | (n)browser ブラウザー 20 | (n)computer コンピューター 21 | (n)community コミュニティ 22 | (n)data データ 23 | (n)database データベース 24 | (n)designer デザイナー 25 | (n)directory ディレクトリ 26 | (n)installer インストーラー 27 | (n)interface インターフェイス 28 | (n)member メンバー 29 | (n)nonlinear ノンリニア 30 | (n)programmer プログラマ 31 | (n)repository リポジトリ 32 | (n)server サーバー 33 | (n)user ユーザー 34 | -------------------------------------------------------------------------------- /makepdfs: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | baseDir=`dirname $0` 4 | outputDir=${baseDir}/pdf 5 | 6 | exclude=('figures' 'figures-dia' 'figures-source' 'latex' 'makepdfs' 'pdf' 'README') 7 | dirContent=`ls $baseDir` 8 | argString="" 9 | 10 | echo $i; 11 | 12 | for dir in $dirContent; do 13 | if [ -n $dir ]; then 14 | 15 | isLang=1 16 | for i in ${exclude[@]}; do 17 | if [ $i == $dir ]; then 18 | isLang=0 19 | fi 20 | done 21 | 22 | if [ $isLang -eq 1 ]; then 23 | if [ "$1" = "" ]; then 24 | argString="${argString} ${dir}" 25 | else 26 | for i in ${@}; do 27 | if [ $i = $dir ]; then 28 | argString="${argString} ${dir}" 29 | fi 30 | done 31 | fi 32 | fi 33 | fi 34 | done 35 | 36 | echo "Will generate pdf for the following languages:" 37 | echo " "$argString 38 | 39 | mkdir -p $outputDir 40 | 41 | echo 42 | echo "The generation process will start now." 43 | time ${baseDir}/latex/makepdf $argString 44 | 45 | echo 46 | echo 47 | echo "Done!" 48 | -------------------------------------------------------------------------------- /summary.rb: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env ruby 2 | # 3 | 4 | command = ARGV[0] 5 | exclude = ['figures', 'figures-dia', 'figures-source', 'couchapp', 'latex', 'pdf', 'epub', 'en', 'ebooks'] 6 | 7 | data = [] 8 | original_lines=`grep -r -h '^[^[:space:]#]' en/[0]* | grep -v '^Insert'| wc -l`.to_i 9 | Dir.glob("*").each do |dir| 10 | if !File.file?(dir) && !exclude.include?(dir) 11 | lines = `git diff-tree -r -p --diff-filter=M master:en master:#{dir} | grep '^-[^[:space:]#-]' | grep -v '^-Insert' | wc -l`.strip.to_i 12 | last_commit = `git log -1 --no-merges --format="%ar" #{dir}`.chomp 13 | authors = "" 14 | if command == 'authors' 15 | authors = `git shortlog --no-merges -s -n #{dir}`.chomp 16 | end 17 | data << [dir, lines, authors, last_commit] 18 | end 19 | end 20 | 21 | d = data.sort { |a, b| b[1] <=> a[1] } 22 | d.each do |dir, lines, authors, last| 23 | puts "#{dir.ljust(10)} - #{(lines*100)/original_lines}% (#{last})" 24 | if command == 'authors' 25 | puts "Authors: #{authors.split("\n").size}" 26 | puts authors 27 | puts 28 | end 29 | end 30 | -------------------------------------------------------------------------------- /latex/README: -------------------------------------------------------------------------------- 1 | PDF Version of Pro Git 2 | ====================== 3 | 4 | To get a PDF version of Pro Git in English, run `makepdf en` and a file called 5 | `progit.en.pdf` will appear in the root of the project. `makepdf` required 6 | pandoc and XeTeX as dependencies. 7 | 8 | * `config.yml`: this is a simple configuration file which allows you to 9 | specify language-specific customisations. 10 | * `template.tex`: this is the main LaTeX file which determines the style of the 11 | PDF version of the book. Its contents is run through the ERB templating 12 | language to include language-specific customisations from config.yml. 13 | 14 | 15 | For Windows 16 | =========== 17 | 18 | Windows build is tested with Pandoc 1.8 and MixTeX 2.9. Install MixTeX with all 19 | font options. Only `en` has been tested so far. To make it work, it needs some 20 | tweaks. 21 | 22 | * `pandoc` and `xelatex` binaries must be on the PATH 23 | * Change the default fonts in `config.yml` to something that exists in Windows. 24 | Example for working fonts: 25 | font: Latin Modern Roman 26 | mono: Courier 27 | bold: "{*}" 28 | -------------------------------------------------------------------------------- /couchapp/Makefile: -------------------------------------------------------------------------------- 1 | # TODO: research wildcard targets 2 | # TODO: DRY 3 | 4 | en: figures docs 5 | @for file in `ls ../en/*/*.markdown`; do \ 6 | filename=`basename -s .markdown $$file`; \ 7 | target=./_docs/$$filename; \ 8 | mkdir -p $$target; \ 9 | cp $$file $$target/body.markdown; \ 10 | echo $$filename > $$target/_id; \ 11 | done; 12 | 13 | de: figures docs 14 | @for file in `ls ../de/*/*.markdown`; do \ 15 | filename=`basename -s .markdown $$file`; \ 16 | target=./_docs/$$filename; \ 17 | mkdir -p $$target; \ 18 | cp $$file $$target/body.markdown; \ 19 | echo $$filename > $$target/_id; \ 20 | done; 21 | 22 | by: figures docs 23 | @for file in `ls ../by/*/*.markdown`; do \ 24 | filename=`basename -s .markdown $$file`; \ 25 | target=./_docs/$$filename; \ 26 | mkdir -p $$target; \ 27 | cp $$file $$target/body.markdown; \ 28 | echo $$filename > $$target/_id; \ 29 | done; 30 | 31 | # add your target language 32 | 33 | figures: 34 | mkdir -p _attachments/figures/ 35 | cp ../figures/* _attachments/figures/ 36 | 37 | docs: 38 | mkdir -p _docs 39 | 40 | clean: 41 | git clean -fdx 42 | -------------------------------------------------------------------------------- /ru/Glossary: -------------------------------------------------------------------------------- 1 | СЛОВАРЬ 2 | =========== 3 | 4 | vcs — система контроля версий 5 | repository — репозиторий 6 | directory — каталог 7 | 8 | alias — псевдоним 9 | branch — ветка 10 | commit — коммит 11 | committer — коммитер 12 | diff — дельта 13 | fast forward — перемотка 14 | fetch — извлекать 15 | hook — перехватчик 16 | merge — сливать 17 | push — отправить 18 | pull — получать 19 | rebase — перемещение 20 | script — сценарий | скрипт 21 | snapshot — снимок состояния 22 | staging area, stage, staged — индекс, индексировать, проиндексированный 23 | stash — прятать 24 | submodule — подмодуль 25 | tag, tagging — метка, выставление меток 26 | workflow — рабочий процесс 27 | killer feature — убойная функция 28 | 29 | 30 | СТИЛЬ ОФОРМЛЕНИЯ 31 | ==================== 32 | 33 | * Заголовки должны быть без верблюдов. Т.е. не “Определение Состояния Файлов”, 34 | а “Определение состояния файлов”, так принято в русскоязычной литературе. 35 | * Тире должно быть намного длиннее, чем дефис. Тире: ‘—’, дефис: ‘-’. 36 | * Для склонения импортных слов следует использовать ’. То есть “для git’а”. 37 | * Слово “вы” пишется с маленькой буквы. 38 | * Букву ё надо использовать 39 | -------------------------------------------------------------------------------- /es/glosario-Benzirpi.txt: -------------------------------------------------------------------------------- 1 | fetch recuperar 2 | merge fusionar, integrar 3 | pull recuperar e integrar 4 | push enviar, publicar 5 | rebase reorganizar 6 | staging area área de preparación 7 | snapshot instantánea, estado o situación en un determinado momento puntual 8 | commit confirmar cambios , almacenar 9 | checkout activar , extraer 10 | check out activar , extraer 11 | contributed aportado por otros 12 | contribution aportación 13 | maintaner gestor de mantenimiento 14 | cherry-pick entresacar 15 | blob binary large object.... gran objeto binario 16 | hook punto de enganche 17 | directory carpeta 18 | file archivo 19 | loose suelto (loose object => objeto suelto) 20 | SHA-1 value código SHA-1 SHA-1 es un protocolo criptográfico de "hash". Dado un archivo digital de cualquier longitud, crea un código representativo unívoco de longitud fija (en el caso de Git, de 40 caracteres). 21 | stage añadir al área de preparación stashing area <=> working area => staging area => commited storage 22 | stash guardado rápido (provisional) stashing area <=> working area => staging area => commited storage 23 | library biblioteca 24 | directory carpeta 25 | subdirectory subcarpeta 26 | superproject proyecto padre 27 | 28 | -------------------------------------------------------------------------------- /couchapp/templates/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Progit — By Scott Chacon 6 | 36 | 37 | 38 | 39 |
40 |
    41 |
  1. Getting Started
  2. 42 |
  3. Git Basics
  4. 43 |
  5. Git Branching
  6. 44 |
  7. Git on the Server
  8. 45 |
  9. Distributed Git
  10. 46 |
  11. Git Tools
  12. 47 |
  13. Customizing Git
  14. 48 |
  15. Git and Other Systems
  16. 49 |
  17. Git Internals
  18. 50 |
51 |
52 | -------------------------------------------------------------------------------- /pl/translation-guidelines.txt: -------------------------------------------------------------------------------- 1 | 2 | Here's a list of agreed translation of the main concepts. Every concepts has 3 | several translations sorted by accuracy. Generally prefer the first 4 | translations. 5 | 6 | 7 | version control system - system kontroli wersji 8 | 9 | revision control - śledzenie plików, śledzenie zmian 10 | 11 | snapshot - migawka, wersja plików 12 | 13 | workflow - schemat pracy, przepływ pracy 14 | 15 | commit - commit, zatwierdzenie 16 | 17 | staging area - przechowalnia 18 | 19 | staged - w przechowalni, śledzony 20 | 21 | unstage - usunąć z przechowalni 22 | 23 | contributor - współpracownik, współautor, uczestnik 24 | 25 | contribute - wgrać 26 | 27 | integrator - integrator 28 | 29 | maintainer - opiekun 30 | 31 | rebase - zmiana bazy 32 | 33 | dictator - dyktator 34 | 35 | lieutenant - porucznik 36 | 37 | commit message - komentarz do zmiany 38 | 39 | changeset - zestaw zmian 40 | 41 | fork - rozwidlenie 42 | 43 | cherry pick - pobrać część zmian, wybiórcze pobranie zmian 44 | 45 | namespace - przestrzeń nazw 46 | 47 | merge - scalenie, łączenie 48 | 49 | fast-forward - przesunięcie 50 | 51 | checkout - pobranie 52 | 53 | blob - obiekt binarny 54 | 55 | build - kompilacja, wersja 56 | 57 | reflog - reflog 58 | 59 | stash - schowek 60 | 61 | dirty state - zmieniony stan, zmodyfikowany stan 62 | 63 | submodule - moduł zależny, moduł zdalny, podmoduł 64 | 65 | subproject - podprojekt 66 | 67 | plumbing command - komenda potokowa 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /ko/README: -------------------------------------------------------------------------------- 1 | Pro Git 책의 내용 2 | ===================== 3 | 4 | 이 저장소는 Pro Git의 source code이고 라이센스는 Creative Commons Attribution-Non Commercial-Share Alike 3.0를 따름니다. 필자는 여러분이 즐겁게 git을 배웠으면 좋겠습니다. 만약 Amazon에서 책을 구입해주신다면 저와 Apress는 깊은 감사를 드릴 것입니다: 5 | 6 | http://tinyurl.com/amazonprogit 7 | 8 | Ebook 만드는 법 9 | ===================== 10 | 11 | 페도라에서는 다음과 같이 하면 됩니다: 12 | 13 | $ yum install ruby calibre rubygems ruby-devel rubygem-ruby-debug 14 | $ gem install rdiscount 15 | $ FORMAT=epub ./makeebooks ko # FORMAT이 없으면 mobi파일이 생성됩니다. 16 | 17 | Mac에서는 먼저 Calibre를 내려받아 설치하고 `ebook-convert` 명령을 실행경로에 넣어 줘야 합니다. 예를 들어 `~/bin/`을 실행경로로 사용하고 있다면 다음과 같이합니다: 18 | 19 | $ ln -s /Applications/calibre.app/Contents/MacOS/ebook-convert ~/bin/ebook-convert 20 | 21 | 그리고 gem을 설치하고 만들면 됩니다: 22 | 23 | $ sudo gem install rdiscount ruby-debug 24 | $ ./makeebooks en # will produce a mobi 25 | 26 | Pdf 만드는 법 27 | ===================== 28 | 29 | Mac에서는 먼저 Pandoc과 MacTex 패키지를 설치합니다. pdf를 빌드하려면 xetex가 필요한데 MacTex가 가장 쉽습니다. MacTex(2011 패키지 1.8G)는 용량이 크지만 전부 설치합니다. 30 | 31 | 그리고 makepdf명령으로 만들 수 있습니다: 32 | 33 | $ ./makepdfs ko 34 | 35 | 오류 36 | ===================== 37 | 38 | 틀린 부분이나 개선해야 할 부분이 있으면 주저 말고 저에게 메일을 보내주세요. 39 | (schacon at gmail dot com) 40 | 41 | 번역 42 | ===================== 43 | 44 | 이 책을 번역해서 알려주시면 제가 progit.org에 번역본을 올릴 것입니다. 적당히(이탈리아어로 번역한다면 `it`라는 디렉토리를 만든다) 하위 디렉토리를 만들고 번역을 완성하고 나서 필자에게 pull 요청을 해주세요. 45 | 46 | 역자 정보 47 | ===================== 48 | 49 | 번역, 박창우(Changwoo Park), pismute at gmail dot com, https://github.com/pismute 50 | 번역, 이성환(Sean Lee), lethee at gmail dot comt, https://github.com/lethee 51 | -------------------------------------------------------------------------------- /ja/README.md: -------------------------------------------------------------------------------- 1 | 書籍「Pro Git」のコンテンツ 2 | =========================== 3 | 4 | (トップディレクトリにあるREADMEの日本語訳です) 5 | 6 | これは、書籍「Pro Git」のコンテンツのソースコードです。 7 | Creative Commons Attribution-Non Commercial-Share Alike 3.0 license のもとで公開 8 | しています。お楽しみください。本書が Git を学ぶ手助けとなることを期待します。また、 9 | Apress や私を支援してくださる意味でも、ぜひ書籍版を Amazon からご購入ください。 10 | 11 | http://tinyurl.com/amazonprogit 12 | 13 | 訳注: 上のtinyurlは、amazon.comのアフィリエイトIDつきのURLにリダイレクトされます。 14 | 15 | このコンテンツは以下のURLでも公開されており、翻訳版も10ヶ国語分公開されています。 16 | 17 | http://git-scm.com/book/ 18 | 19 | Ebookのつくりかた 20 | ===================== 21 | 22 | Fedora なら、たとえばこのようにします。 23 | 24 | $ yum install ruby calibre rubygems ruby-devel rubygem-ruby-debug rubygem-rdiscount 25 | $ gem install rdiscount 26 | $ makeebooks en # これで mobi ファイルができあがります 27 | 28 | Mac OSなら、このようにできます。 29 | 30 | 1. rubyとrubygems をインストールします。 31 | 2. `$ gem install rdiscount` 32 | 3. Calibre for MacOSをダウンロードし、コマンドラインツールをインストールします。 33 | 4. `$ makeebooks zh` #こうするとmobiファイルができあがります。 34 | 35 | 不具合 36 | ===================== 37 | 技術的な間違いやその他の修正を要する点を発見した場合は、[issueを作成](https://github.com/progit/progit/issues)してください。 38 | そうすればメンテナーの誰かが確認してくれるでしょう。 39 | 40 | 訳注: 当然、issueは英語で書いてください :-) 日本語訳に関する指摘は、日本語版の 41 | 翻訳に参加しているメンバーの誰かにメッセージを送っていただけるとありがたいです。 42 | 43 | 翻訳 44 | ===================== 45 | この本を翻訳してくだされば、その翻訳を git-scm.com のサイトで公開させて 46 | いただきます。このプロジェクトの適切なサブディレクトリ( [ISO 639](http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) で命名してください。)に翻訳を保存し、 47 | pull requestを送ってください。 48 | 49 | 訳注: 日本語訳はjaサブディレクトリを使用してください。 50 | 51 | pull requestの送り方 52 | ===================== 53 | - 翻訳ファイルの文字コードはUTF-8にしてください。 54 | - 原文の変更と翻訳の変更、pull requestは分けてください。 55 | - 翻訳の変更をpull requestにして送る場合、pull requestのタイトルとコミットメッセージに国別の接頭詞をつけてください。 例) [ja] Update chapter 2. 56 | - 翻訳の変更は、マージ時にコンフリクトが発生しないよう注意してください。メンテナーはコンフリクトの解消を行いません。 57 | - ファイルが変更されてもPDF/電子書籍への変換、git-scm.comの更新がうまくいくよう、可能な限り確認してください。 58 | 59 | -------------------------------------------------------------------------------- /fr/NOTES.fr-fr.md: -------------------------------------------------------------------------------- 1 | Notes on the french translation process 2 | ======================================= 3 | 4 | These notes document the process of translating the book into 5 | french. This is mostly about the choice of words and expressions and 6 | should not be of any interest to non-french readers or translators. 7 | 8 | Lexique 9 | ======= 10 | 11 | Repository 12 | ---------- 13 | 14 | Dépôt 15 | 16 | Check in 17 | -------- 18 | 19 | Dépôt 20 | 21 | To check in 22 | ----------- 23 | 24 | Déposer, mettre en dépôt, faire un dépôt. 25 | 26 | Ex. 27 | To check a file in => Déposer un fichier 28 | When checking a directory in [...] => Lorsqu'on met un repertoire en dépôt 29 | 30 | Check out 31 | --------- 32 | 33 | Retrait 34 | 35 | To check out 36 | ------------ 37 | 38 | Retirer, récupérer (parfois rapatrier est une bonne alternative) 39 | 40 | To commit 41 | --------- 42 | 43 | Consigner 44 | 45 | Stage area 46 | ---------- 47 | 48 | Zone d'attente 49 | 50 | To stage 51 | -------- 52 | 53 | Mettre en attente 54 | 55 | Eviter _mettre en zone d'attente_ 56 | 57 | To unstage 58 | ---------- 59 | 60 | 61 | 62 | Change 63 | ------ 64 | 65 | Modification (à préférer à changement) 66 | 67 | stash 68 | ----- 69 | 70 | Remise 71 | 72 | To stash 73 | -------- 74 | 75 | Remiser 76 | 77 | Checksum 78 | -------- 79 | 80 | Somme de contrôle 81 | 82 | Hash 83 | ---- 84 | 85 | Empreinte 86 | 87 | Alternatives: signature, hachage (correct mais à éviter) 88 | 89 | Workflow 90 | -------- 91 | 92 | Processus 93 | 94 | Alternative: scénario 95 | 96 | Snapshot 97 | -------- 98 | 99 | Instantané 100 | 101 | Alternative: image, parfois, le choix de la traduction litérale 'photographie' est supérieur (rare) 102 | 103 | Diff 104 | ---- 105 | 106 | Diff 107 | 108 | To track 109 | -------- 110 | 111 | Suivre 112 | 113 | untracked 114 | --------- 115 | 116 | non-suivi 117 | 118 | unmodified 119 | ---------- 120 | 121 | non-modifié 122 | 123 | To update 124 | --------- 125 | 126 | Mettre à jour 127 | 128 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build Status](https://secure.travis-ci.org/progit/progit.png?branch=master)](https://travis-ci.org/progit/progit) 2 | 3 | # Pro Git Book Contents 4 | 5 | This is the source code for the Pro Git book contents. It is licensed under 6 | the Creative Commons Attribution-Non Commercial-Share Alike 3.0 license. I 7 | hope you enjoy it, I hope it helps you learn Git, and I hope you'll support 8 | Apress and me by purchasing a print copy of the book at Amazon: 9 | 10 | http://tinyurl.com/amazonprogit 11 | 12 | It is also available online at: 13 | 14 | http://git-scm.com/book/ 15 | 16 | and fully translated in 10 languages. 17 | 18 | # Making Ebooks 19 | 20 | On Fedora (16 and later) you can run something like this:: 21 | 22 | $ yum install ruby calibre rubygems ruby-devel rubygem-ruby-debug rubygem-rdiscount 23 | $ makeebooks en # will produce a mobi 24 | 25 | On MacOS you can do like this:: 26 | 27 | 1. INSTALL ruby and rubygems 28 | 2. `$ gem install rdiscount` 29 | 3. DOWNLOAD Calibre for MacOS and install command line tools. You'll need some dependencies to generate a PDF: 30 | * pandoc: http://johnmacfarlane.net/pandoc/installing.html 31 | * xelatex: http://tug.org/mactex/ 32 | 4. `$ makeebooks zh` #will produce a mobi 33 | 34 | # Errata 35 | 36 | If you see anything that is technically wrong or otherwise in need of 37 | correction, please [open an issue](https://github.com/progit/progit/issues/new) and one of the maintainers will take a look. 38 | 39 | 40 | # Translation 41 | 42 | If you wish to translate the book, your work will be put up on the 43 | git-scm.com site. Please put your translation into the appropriate 44 | subdirectory of this project, using the 45 | [ISO 639](http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) 46 | and send a pull request. 47 | 48 | # Sending a pull request 49 | 50 | * Be careful to use UTF-8 encoding in your files. 51 | * Do not mix changes to the original english with translations in a single pull request. 52 | * If your pull request changes a translation, prefix your pull request and commits'messages with the ISO 639 code, e.g. `[de] Update chapter 2`. 53 | * Make sure the translation changes can be automatically merged. The maintainers can not make the merge manually if there are some conflicts. 54 | * Make as sure as possible that the changes work correctly for publishing to pdf, ebooks and the git-scm.com website -------------------------------------------------------------------------------- /es/NOTES: -------------------------------------------------------------------------------- 1 | # Palabras que me crean regomeyo 2 | 3 | - Backport: No encuentro una traducción adecuada. 4 | - Branch/Branching: Lo traduzco como *rama*/*ramificación*, pero pongo entre () el término original. 5 | - Checkin: No encuentro una traducción adecuada. 6 | - Checkout: No encuentro una traducción adecuada. 7 | - Checksum: Lo traduzco como *suma de comprobación* a regañadientes, pongo entre () el término original. 8 | - Commit/Committed: Lo traduzco como *confirmar*/*confirmado*, pero pongo entre () el término original. 9 | - Diff: Lo traduzco como *diferencia*. 10 | - Fork: Lo traduzco como *bifurcación*, pero pongo entre () el término original. 11 | - Hook: Lo traduzco como *gancho* a regañadientes, pongo entre () el término original. 12 | - Kernel: La traducción habitual es *núcleo*, así que la usaré. 13 | - Manpage: Lo traduzco como *página del manual*, pero pongo entre () el término original. 14 | - Merge: Lo traduzco como *unión*, pero pongo entre () el término original. 15 | - Rebase: No encuentro una traducción adecuada. 16 | - Pull: Lo traduzco como *recibir*, pero pongo entre () el término original. No quiero usar *descargar* o *bajar*, porque parece que hace referencia a entornos cliente/servidor. 17 | - Push: Lo traduzco como *mandar*, pero pongo entre () el término original. No quiero usar *subir*, porque parece que hace referencia a entornos cliente/servidor. 18 | - Remote: Lo traduzco como *repositorio remoto* o *remoto*. 19 | - Snapshot: Lo traduzco como *instantánea*. 20 | - Stage/Staged: Lo traduzco como *preparar*/*preparado*, pero pongo entre () el término original. 21 | - Staging area: Parece ser un término militar. Se refiere a una localización temporal donde se reúnen recursos antes de un ataque o invasión. Lo traduzco como *área de preparación*, pero pongo entre () el término original. 22 | - Track/Tracking: Lo traduzco como *seguir*/*seguimiento*. 23 | 24 | 25 | # Anotaciones sobre las anotaciones [afgomez] 26 | 27 | - No creo que sea necesario poner entre parentesis los términos originales de "rama" y "unión". Es una traduccion lo suficientemente clara como para no necesitarlos. 28 | - A lo largo del texto se utilizan guiones '-' para indicar aclaraciones en el texto. En Español el signo correcto es la raya ('—', — en HTML), y debe ir siempre cerrado, por lo que se han modificado en el texto. 29 | Más información: http://es.wikipedia.org/wiki/Raya_%28puntuaci%C3%B3n%29 -------------------------------------------------------------------------------- /th/README.md: -------------------------------------------------------------------------------- 1 | [![Build Status](https://secure.travis-ci.org/progit/progit.png?branch=master)](https://travis-ci.org/progit/progit) 2 | 3 | # เนื้อหาภายในหนังสือ Pro Git 4 | 5 | ภายในนี้คือต้นฉบับของเนื้อหาภายใน Pro Git ทั้งหมด เนื้อหาในหนังสือ Pro Git ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์เวอร์ชัน 3.0 ชนิด "อ้างอิงแหล่งที่มา ห้ามนำไปใช้เพื่อการค้า และให้อนุญาตต่อไปแบบเดียวกัน" 6 | เราหวังว่าหนังสือเล่มนี้จะช่วยให้เรียนรู้การใช้ Git ได้สะดวกขึ้น คุณสามารถสนับสนุนเราและสำนักพิมพ์ Apress ได้โดยสั่งซื้อหนังสือเล่มนี้ผ่าน Amazon 7 | 8 | http://tinyurl.com/amazonprogit 9 | 10 | หรือสามารถเข้าถึงที่: 11 | 12 | http://git-scm.com/book/ 13 | 14 | # การสร้าง Ebooks 15 | 16 | บนระบบปฏิบัติการ Fedora เวอร์ชัน 16 ขึ้นไป สามารถใช้คำสั่งด้านล่างนี้เพื่อสร้าง ebook ได้ 17 | 18 | $ yum install ruby calibre rubygems ruby-devel rubygem-ruby-debug rubygem-rdiscount 19 | $ makeebooks en # will produce a mobi 20 | 21 | ในระบบปฏิบัติการ MacOS สามารถทำตามขั้นตอนดังนี้ 22 | 23 | 1. ติดตั้ง ruby และ rubygems 24 | 2. `$ gem install rdiscount` 25 | 3. ดาวน์โหลดและติดตั้งโปรแกรม Calibre, command line tools และโปรแกรมสำหรับสร้างไฟล์ PDF: 26 | * pandoc: http://johnmacfarlane.net/pandoc/installing.html 27 | * xelatex: http://tug.org/mactex/ 28 | 4. `$ makeebooks th` # จะได้ไฟล์ที่มี extension `.mobi` 29 | 30 | # ข้อผิดพลาด 31 | 32 | หากพบข้อผิดพลาดภายในหนังสือหรือพบจุดที่ต้องแก้ไข กรุณาแจ้งปัญหาผ่านระบบ issue ของ GitHub โดยการ[สร้าง issue](https://github.com/progit/progit/issues/new) 33 | หลังจากสร้าง issue แล้ว ผู้ดูแลจะเข้ามารับเรื่องและดำเนินการต่อไป 34 | 35 | 36 | # การแปลหนังสือ 37 | 38 | หากต้องการแปลเนื้อหาภายในหนังสือ คุณสามารถแปลเนื้อหาภายในโฟลเดอร์ย่อยที่ตรงกับภาษาที่แปล ชื่อของโฟลเดอร์ย่อยจะใช้รหัสภาษาแบบ [ISO 639](http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) 39 | เมื่อแปลเสร็จเรียบร้อยแล้ว ขอให้ส่ง pull request กลับมายัง repository เดิม 40 | 41 | # การส่ง pull request 42 | 43 | * ขอให้แน่ใจว่า encoding ของไฟล์เป็น UTF-8 44 | * โปรดแยกการ pull request หากคุณแก้ไขเนื้อหาที่เป็นภาษาหลักของหนังสือ และเนื้อหาที่แปลจากภาษาหลัก 45 | * หากแปลเนื้อหาภายในหนังสือ ขอให้เขียน commit message โดยให้มีรหัสของภาษาตาม ISO 639 ที่ครอบด้วยวงเล็บแบบก้ามปู ตามด้วยสิ่งที่เปลี่ยนแปลง เช่น `[de] Update chapter 2` 46 | * ตรวจสอบการ conflict ด้วยทุกครั้ง เนื่องจากเมื่อเกิด conflict ผู้ดูแลจะไม่รวมด้วยมือ 47 | * ขอให้แน่ใจว่าสิ่งที่แก้ไขสามารถแปลงเป็น PDF, ebook และสามารถนำขึ้นเว็บไซต์ git-scm.com ได้โดยไม่มีปัญหาใด ๆ 48 | -------------------------------------------------------------------------------- /fr/README.md: -------------------------------------------------------------------------------- 1 | # Effort de traduction française # 2 | 3 | ## Dépôt de référence ## 4 | 5 | Le dépot de référence de la traduction française est situé ici : 6 | https://github.com/progit-fr/progit 7 | 8 | C'est le dépôt de fusion des travaux sur la branche fr, avant de lancer les requêtes de tirage sur le dépôt principal Progit. 9 | 10 | ## Liste de diffusion ## 11 | 12 | Notre liste de diffusion est ici: http://groups.google.com/group/progit-fr 13 | 14 | Si vous travaillez ou souhaitez travailler sur la traduction française de Progit, faites-nous le savoir, de sorte à ne pas dupliquer le travail. 15 | 16 | ## Workflow ## 17 | 18 | Pour simplifier la gestion et utiliser pleinement les capacités de Git et Github, la manière la plus directe de collaborer consiste à faire un fork sur Github du dépôt progit-fr/progit sur votre propre compte pour y générer vos modifications, si possible sur une branche thématique. 19 | 20 | Ensuite, il suffit de lancer une requête de tirage pour nous avertir que les modifications peuvent être revues et intégrées. 21 | 22 | # Références pour la traduction # 23 | 24 | ## Fichier glossaire ## 25 | 26 | Le fichier fr/glossaire-git.adoc tente de rassembler les traductions choisies pour les termes spécifiques à Git. Si d'autres termes nécessitent une uniformisation, il ne faut pas hésiter à les y ajouter. De même, il est toujours possible de changer les termes déjà renseignés si une meilleure traduction est proposée. 27 | 28 | L'uniformisation de la traduction par le respect de ce glossaire est une tâche permanente d'amélioration de la qualité finale du texte. 29 | 30 | ## Glossaires généraux sur internet ## 31 | 32 | Les glossaires de traduction informatiques disponibles sur Internet, sans être des références dogmatiques donnent des indications sur les termes les plus utilisés dans les documents français sur l'informatique. 33 | 34 | * http://glossaire.traduc.org/ 35 | * http://www.dglf.culture.gouv.fr/cogeter/16-03-99-internet-listes.html 36 | * http://deschamp.free.fr/exinria/RETIF/ 37 | 38 | ## Typographie française ## 39 | 40 | La version française du livre se veut un document valant un document écrit nativement en français. À ce titre, la traduction doit suivre autant que possible les règles de typographie française en vigueur. 41 | 42 | Voici ci-dessous quelques liens : 43 | 44 | * http://www.dsi.univ-paris5.fr/typo.html 45 | * http://jacques-andre.fr/faqtypo/lessons.pdf 46 | -------------------------------------------------------------------------------- /fr/glossaire-git.adoc: -------------------------------------------------------------------------------- 1 | Glossaire de Git 2 | ================ 3 | 4 | :Auteur: Emmanuel Trillaud 5 | :Email: 6 | :Date: 11/02/10 15:04 7 | :Revision: 2 8 | 9 | Glossaire de l'outil de gestion de version Git créé à partir des traductions de 10 | 11 | * git-gui, http://repo.or.cz/w/git-gui.git[Sources] 12 | * gitk, http://git.kernel.org/?p=gitk/gitk.git;a=summary[Sources] 13 | * du « Git Community Book » http://book.git-scm.com/[en], http://alx.github.com/gitbook/[fr] et 14 | * du livre « Progit » http://progit.org/book/[en] 15 | 16 | Autre doc utile 17 | 18 | * gitglossary(7) 19 | 20 | Convention du glossaire 21 | un « ? » à côté d'un mot signifie que la traduction proposée est discutable 22 | « ctx » sert à indiquer un contexte 23 | 24 | .Objets Git 25 | * object -> objet 26 | - loose object -> 27 | * Tree (Object) -> Arbre 28 | * Commit (Objet) -> Commit 29 | * commit -> valider / validation (pourait être "soumission" / soumettre)(une autre traduction propose consigner / consigne) 30 | * Tag (Object) -> Étiquette 31 | - annotated -> étiquette annotée 32 | - ligthweigt tag -> étiquette légère 33 | * Blob (Object) -> Blob 34 | * refs -> références 35 | 36 | .Spécifique à Git 37 | * HEAD -> fichier HEAD, HEAD 38 | * detached (head)-> 39 | * refspec -> spécification de références 40 | * Plumbing -> plomberie 41 | * Porcelain -> porcelaine 42 | * index -> 43 | * staging area -> zone d'attente 44 | 45 | .VCS 46 | * version -> révision 47 | * working directory -> répertoire de travail 48 | * working tree -> arbre de travail 49 | * snapshot -> instantané 50 | * history -> historique/journal 51 | * fast-forward (ctx merge) -> avance rapide 52 | - fast-forward reference -> avance rapide 53 | * repository -> dépôt 54 | * diff -> diff 55 | * patch -> patch (traduction officielle : "retouche" ou "correctif" ; en Canadien, "rustine") 56 | 57 | .SHA-1 58 | * hash -> empreinte 59 | * checksum -> somme de contrôle 60 | * digest -> empreinte 61 | * key -> clé 62 | * SHA-1 -> empreinte SHA-1 63 | 64 | .Actions/Commandes 65 | Si le mot fait référence à la commande, on ne traduit pas. Par contre, 66 | si on fait référence à l'action, on peut traduire. 67 | 68 | * checkout -> extraction 69 | * checkin -> archivage 70 | * branch(es) -> branches 71 | - remote branches -> branche distante 72 | * remote -> distant 73 | a remote -> un dépôt distant 74 | * pull -> tirer ("retirer" est peut-être mieux)(ou "récupérer") 75 | * fetch -> récupérer 76 | * push -> pousser (pourquoi pas "publier")(+1) 77 | * stash -> remiser 78 | * add -> ajouter 79 | * log -> journal 80 | * gc -> 81 | - garbage collector -> ramasse-miettes 82 | * reset -> réinitialiser 83 | - hard reset -> 84 | - soft reset -> 85 | - mixed reset -> 86 | * bisect -> bissecter 87 | * archive -> archiver 88 | * cherry-pick -> sélectionner (a été préféré à "cueillir")(vu au chapitre 5: "picorer") 89 | * cherry-picking -> sélection (préféré à "cueillette") 90 | * clean -> nettoyer 91 | * clone -> cloner 92 | * To merge (a branch) -> fusionner 93 | * To merge (a change) -> incorporer 94 | - a merge -> une fusion 95 | * to diff -> comparer 96 | * rebase -> rebaser 97 | * revert -> défaire 98 | * packfile -> 99 | * to pack -> compacter 100 | * topic branch -> branche thématique 101 | 102 | .Divers 103 | * hex -> hexa 104 | * hook -> crochet 105 | * namespace -> espace de noms 106 | * Content-addressable filesystem -> système de fichier adressable par le contenu 107 | * DAG (Direct Acyclic Graph) -> Graphe orienté acyclique 108 | * pattern -> motif 109 | -------------------------------------------------------------------------------- /makeebooks: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # encoding: utf-8 3 | # This script convers markdown book to one of the serveral e-book 4 | # formats supported with calibre (http://calibre-ebook.com) 5 | # 6 | # Samples: 7 | # 8 | # Build e-book for amazon kindle for english and russian languages 9 | # $ ruby makeebooks en ru 10 | # or 11 | # $ FORMAT=mobi ruby makeebooks en ru 12 | # 13 | # Build e-book in 'epub' format for russian only 14 | # $ FORMAT=epub ruby makeebooks ru 15 | 16 | require 'rubygems' 17 | require 'rdiscount' 18 | require 'fileutils' 19 | include FileUtils 20 | 21 | def figures(lang,&block) 22 | begin 23 | Dir["figures/18333*.png"].each do |file| 24 | cp(file, file.sub(/18333fig0(\d)0?(\d+)\-tn/, '\1.\2')) 25 | end 26 | Dir["#{lang}/figures/*.png"].each do |file| 27 | cp(file,"figures") 28 | end 29 | Dir["#{lang}/figures-dia/*.dia"].each do |file| 30 | png_dest= file.sub(/.*fig0(\d)0?(\d+).dia/, 'figures/\1.\2.png') 31 | system("dia -e #{png_dest} #{file}") 32 | end 33 | block.call 34 | ensure 35 | Dir["figures/18333*.png"].each do |file| 36 | rm(file.gsub(/18333fig0(\d)0?(\d+)\-tn/, '\1.\2')) 37 | end 38 | end 39 | end 40 | 41 | 42 | if ARGV.length == 0 43 | puts "you need to specify at least one language. For example: makeebooks en" 44 | exit 45 | end 46 | 47 | format = ENV['FORMAT'] || 'mobi' 48 | puts "using .#{format} (you can change it via FORMAT environment variable. try 'mobi' or 'epub')" 49 | 50 | ARGV.each do |lang| 51 | figures (lang) do 52 | puts "convert content for '#{lang}' language" 53 | 54 | figure_title = 'Figure' 55 | book_title = 'Pro Git - professional version control' 56 | authors = 'Scott Chacon' 57 | comments = 'licensed under the Creative Commons Attribution-Non Commercial-Share Alike 3.0 license' 58 | if lang == 'ko' 59 | figure_title = '그림' 60 | elsif lang == 'ja' 61 | figure_title = '図' 62 | elsif lang == 'ru' 63 | figure_title = 'Рисунок' 64 | book_title = 'Pro Git — профессиональный контроль версий' 65 | authors = 'Скот Чакон' 66 | comments = 'Лицензия: Creative Commons Attribution-Non Commercial-Share Alike 3.0 license' 67 | elsif lang == 'es' 68 | figure_title = 'Figura' 69 | elsif lang == 'it' 70 | figure_title = 'Figura' 71 | comments = 'distribuito sotto licenza Creative Commons Attribution-Non Commercial-Share Alike 3.0' 72 | elsif lang == 'zh' 73 | figure_title = '图' 74 | elsif lang == 'zh-tw' 75 | figure_title = '圖' 76 | elsif lang == 'pt-br' 77 | figure_title = 'Figura' 78 | elsif lang == 'pl' 79 | figure_title = 'Rysunek' 80 | book_title = 'Pro Git — profesjonalna kontrola wersji' 81 | comments = 'udostępnione na licencji Creative Commons Attribution-Non Commercial-Share Alike 3.0 license' 82 | elsif lang == 'cs' 83 | figure_title = 'Obrázek' 84 | book_title = 'Pro Git — profesionální správa verzí' 85 | comments = 'Licence: Creative Commons Attribution-Non Commercial-Share Alike 3.0 license' 86 | end 87 | 88 | book_content = %(#{book_title}) 89 | dir = File.expand_path(File.join(File.dirname(__FILE__), lang)) 90 | Dir[File.join(dir, '**', '*.markdown')].sort.each do |input| 91 | puts "processing #{input}" 92 | content = File.read(input) 93 | content.gsub!(/Insert\s18333fig\d+\.png\s*\n.*?(\d{1,2})-(\d{1,2})\. (.*)/, '![\1.\2 \3](figures/\1.\2.png "\1.\2 \3")') 94 | book_content << RDiscount.new(content).to_html 95 | end 96 | book_content << "" 97 | 98 | File.open("progit.#{lang}.html", 'w') do |output| 99 | output.write(book_content) 100 | end 101 | 102 | $ebook_convert_cmd = ENV['ebook_convert_path'].to_s 103 | if $ebook_convert_cmd.empty? 104 | $ebook_convert_cmd = `which ebook-convert`.chomp 105 | end 106 | if $ebook_convert_cmd.empty? 107 | mac_osx_path = '/Applications/calibre.app/Contents/MacOS/ebook-convert' 108 | $ebook_convert_cmd = mac_osx_path 109 | end 110 | 111 | system($ebook_convert_cmd, "progit.#{lang}.html", "progit.#{lang}.#{format}", 112 | '--cover', 'ebooks/cover.png', 113 | '--authors', authors, 114 | '--comments', comments, 115 | '--level1-toc', '//h:h1', 116 | '--level2-toc', '//h:h2', 117 | '--level3-toc', '//h:h3', 118 | '--language', lang) 119 | end 120 | end 121 | -------------------------------------------------------------------------------- /latex/template.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper]{book} 2 | \usepackage[ 3 | %urlbordercolor = {1 1 1}, 4 | %linkbordercolor = {1 1 1}, 5 | %citebordercolor = {1 1 1}, 6 | urlcolor = blue, 7 | colorlinks = true, 8 | citecolor = black, 9 | linkcolor = black]{hyperref} 10 | \usepackage{graphicx} 11 | \usepackage{xltxtra} 12 | \usepackage{fancyhdr} 13 | \usepackage{booktabs} 14 | \usepackage{indentfirst} 15 | \usepackage{framed,color} 16 | \usepackage{caption} 17 | \usepackage{longtable} 18 | \captionsetup{font=bf,position=below} 19 | 20 | \usepackage{ctable} 21 | 22 | \definecolor{shadecolor}{gray}{0.90} 23 | 24 | \setromanfont[Mapping=tex-text,BoldFont=<%= config['bold'] %>]{<%= config['font'] %>} 25 | \setmonofont[Scale=.85]{<%= config['mono'] %>} 26 | 27 | \XeTeXlinebreaklocale{<%= lang %>} 28 | <%= config['langrule'] %> 29 | 30 | \settowidth{\parindent}{<%= config['indent'] %>} 31 | 32 | \title{Pro Git} 33 | \author{Scott Chacon} 34 | 35 | \makeatletter 36 | \let\savedauthor=\@author 37 | \let\savedtitle=\@title 38 | \def\imgwidth{.6\linewidth} 39 | \def\maxwidth{\ifdim\Gin@nat@width>\imgwidth\imgwidth 40 | \else\Gin@nat@width\fi} 41 | \makeatother 42 | 43 | \title{\textbf{\savedtitle}} 44 | \author{\textbf{\savedauthor}\thanks{<%= config['thanks'] %>}} 45 | \def\w3cdtfymd{\the\year-\ifnum\month<10 0\fi\the\month-\ifnum\day<10 0\fi\the\day} 46 | \date{\w3cdtfymd} 47 | \renewcommand{\thefootnote}{\fnsymbol{footnote}} 48 | 49 | \makeatletter 50 | \setlength\headheight{12\p@} 51 | \setlength\headsep {.25in} 52 | \setlength\topskip {10\p@} 53 | \setlength\footskip{.35in} 54 | \setlength\textwidth{400\p@} 55 | 56 | \setlength\@tempdima{\paperheight} 57 | \addtolength\@tempdima{-2in} 58 | \divide\@tempdima\baselineskip 59 | \@tempcnta=\@tempdima 60 | \setlength\textheight{\@tempcnta\baselineskip} 61 | \addtolength\textheight{\topskip} 62 | 63 | \setlength\@tempdima {\paperwidth} 64 | \addtolength\@tempdima {-\textwidth} 65 | \setlength\oddsidemargin {\paperwidth} 66 | \addtolength\oddsidemargin {-2.35in} 67 | \addtolength\oddsidemargin {-\textwidth} 68 | \setlength\marginparwidth {0pt} 69 | \@settopoint\oddsidemargin 70 | \@settopoint\marginparwidth 71 | \setlength\evensidemargin {\paperwidth} 72 | \addtolength\evensidemargin{-2.35in} 73 | \addtolength\evensidemargin{-\textwidth} 74 | \@settopoint\evensidemargin 75 | 76 | \setlength\topmargin{\paperheight} 77 | \addtolength\topmargin{-2in} 78 | \addtolength\topmargin{-\headheight} 79 | \addtolength\topmargin{-\headsep} 80 | \addtolength\topmargin{-\textheight} 81 | \addtolength\topmargin{-\footskip} % this might be wrong! 82 | \addtolength\topmargin{-.5\topmargin} 83 | \@settopoint\topmargin 84 | \makeatother 85 | 86 | \fancypagestyle{plain}{\fancyhf{}\fancyfoot[LE,RO]{\footnotesize\textbf\thepage}} 87 | \pagestyle{plain} 88 | 89 | \renewcommand{\headrulewidth}{0pt} 90 | \renewcommand{\footrulewidth}{0pt} 91 | 92 | \newcounter{img}[chapter] 93 | \renewcommand{\theimg}{\thechapter.\arabic{img}} 94 | \newcommand{\img}[1]{\begin{figure}[ht!] 95 | \refstepcounter{img} 96 | \label{img:\theimg} 97 | \centering\IfFileExists{figures/\theimg.pdf}{\includegraphics[width=\maxwidth]{figures/\theimg.pdf}}{\includegraphics[width=\maxwidth]{figures/\theimg.png}} 98 | 99 | \caption{#1} 100 | \end{figure}} 101 | 102 | \newcounter{tab}[chapter] 103 | \renewcommand{\thetab}{\thechapter.\arabic{tab}} 104 | 105 | \newcommand{\prechap}{<%= config['prechap'] %>} 106 | \newcommand{\postchap}{<%= config['postchap'] %>} 107 | \newcommand{\presect}{<%= config['presect'] %>} 108 | \newcommand{\postsect}{<%= config['postsect'] %>} 109 | \renewcommand{\chaptermark}[1]{\markboth{\textbf{\prechap \thechapter \postchap}\hspace*{1ex}#1}{}} 110 | \renewcommand{\sectionmark}[1]{\markright{\textbf{\presect \thesection \postsect}\hspace*{1ex}#1}} 111 | \newcommand{\chap}[1]{\newpage\thispagestyle{empty}\chapter{#1}\label{chap:\thechapter}} 112 | \newcommand{\chapref}[1]{\hyperref[chap:#1]{\prechap #1\postchap}} 113 | \newcommand{\imgref}[1]{\hyperref[img:#1]{<%= config['fig'] %>#1}} 114 | \newcommand{\tabref}[1]{\hyperref[tab:#1]{<%= config['tab'] %>#1}} 115 | \newcommand{\e}[1]{$ \times 10^{#1}$} 116 | \renewcommand{\contentsname}{<%= config['con'] %>} 117 | \renewcommand{\figurename}{<%= config['fig'] %>} 118 | \renewcommand{\tablename}{<%= config['tab'] %>} 119 | 120 | \makeatletter 121 | \def\@makechapterhead#1{% 122 | \vspace*{50\p@}% 123 | {\parindent \z@ \raggedright \normalfont 124 | \ifnum \c@secnumdepth >\m@ne 125 | \if@mainmatter 126 | \huge\bfseries \prechap \thechapter \postchap 127 | \par\nobreak 128 | \vskip 20\p@ 129 | \fi 130 | \fi 131 | \interlinepenalty\@M 132 | \Huge \bfseries #1\par\nobreak 133 | \vskip 40\p@ 134 | }} 135 | \makeatother 136 | 137 | \linespread{1.3} 138 | 139 | \begin{document} 140 | \frontmatter 141 | \maketitle 142 | \thispagestyle{empty} 143 | \setcounter{tocdepth}{4} 144 | \tableofcontents\newpage\thispagestyle{empty} 145 | 146 | \mainmatter 147 | \fancyhf{} 148 | \fancyhead[LE]{{\small\leftmark}} 149 | \fancyhead[RO]{{\small\rightmark}} 150 | \fancyhead[RE,LO]{{\small\savedauthor\hspace*{1ex}\textbf{\savedtitle}}} 151 | \fancyfoot[LE,RO]{\small\textbf\thepage} 152 | \pagestyle{fancy} 153 | 154 | <%= latex %> 155 | \end{document} 156 | -------------------------------------------------------------------------------- /latex/config.yml: -------------------------------------------------------------------------------- 1 | default: 2 | font: Helvetica 3 | bold: "{* Bold}" 4 | mono: Andale Mono 5 | prechap: "Chapter " 6 | postchap: "" 7 | presect: "Section " 8 | postsect: "" 9 | dql: "“" 10 | dqr: "”" 11 | con: "Contents" 12 | fig: "Figure " 13 | tab: "Table " 14 | indent: "\\qquad" 15 | thanks: "This is the PDF file for the Pro Git book contents. It is licensed under the Creative Commons Attribution-Non Commercial-Share Alike 3.0 license. I hope you enjoy it, I hope it helps you learn Git, and I hope you'll support Apress and me by purchasing a print copy of the book at Amazon: \\url{http://tinyurl.com/amazonprogit}" 16 | zh: 17 | langrule: "\\XeTeXlinebreakskip=0em plus 0.1em minus 0.01em\n\\XeTeXlinebreakpenalty=0" 18 | font: AR PL UMing CN 19 | bold: AR PL UKai CN 20 | mono: AR PL UKai CN 21 | prechap: "第" 22 | postchap: "章" 23 | presect: "" 24 | postsect: "节" 25 | con: "目录" 26 | fig: "图 " 27 | tab: "表 " 28 | indent: "文" 29 | zh-tw: 30 | langrule: "\\XeTeXlinebreakskip=0em plus 0.1em minus 0.01em\n\\XeTeXlinebreakpenalty=0" 31 | font: AR PL UMing TW 32 | bold: AR PL UKai TW 33 | mono: AR PL UKai TW 34 | prechap: "第" 35 | postchap: "章" 36 | presect: "" 37 | postsect: "節" 38 | dql: "『" 39 | dqr: "』" 40 | con: "目錄" 41 | fig: "圖 " 42 | tab: "表 " 43 | indent: "文" 44 | ja: 45 | langrule: "\\XeTeXlinebreakskip=0em plus 0.1em minus 0.01em\n\\XeTeXlinebreakpenalty=0" 46 | # font: Japan 47 | # font: Sazanami Mincho 48 | font: IPAPMincho 49 | bold: VL PGothic 50 | # bold: Sazanami Gothic 51 | # bold: IPAPGothic 52 | mono: VL Gothic 53 | prechap: "第" 54 | postchap: "章" 55 | presect: "" 56 | postsect: "節" 57 | dql: "『" 58 | dqr: "』" 59 | con: "目次" 60 | fig: "図" 61 | tab: "表" 62 | indent: "あ" 63 | thanks: "これは、書籍 Pro Git のPDF版です。クリエイティブ・コモンズ 表示 - 非営利 - 継承 3.0(CC BY-NC-SA 3.0)ライセンスの下に提供されています。Git を学ぶ際の助けになれば幸いです。もし役にたったなら、書籍の方もぜひよろしくお願いします。 \\url{http://tinyurl.com/amazonprogit}\\newline Pro Git 日本語版電子書籍(PDF/EPUB/MOBI)を \\url{http://progit-ja.github.io/} で公開しています。誤訳の指摘、訳文の改善提案、その他ご意見がありましたら、そちらからお願いいたします。また、Pro Git 日本語版の翻訳、改善にご尽力いただいた皆さんに、厚く御礼申し上げます。" 64 | ru: 65 | prechap: "Глава " 66 | presect: "Раздел " 67 | con: "Содержание" 68 | fig: "Рисунок " 69 | tab: "Таблица " 70 | dql: "«" 71 | dqr: "»" 72 | langrule: "\\frenchspacing" 73 | thanks: "Это PDF-версия книги Pro Git. Текст книги находится под лицензией Creative Commons Attribution-Non Commercial-Share Alike 3.0. Надеемся, она вам понравится и поможет изучить Git. Если хотите, можете поддержать автора и Apress, купив бумажную версию книги на английском языке на Amazon: \\url{http://tinyurl.com/amazonprogit}.\\newline На сайте перевода книги на русский язык, расположенного по адресу \\url{https://github.com/GArik/progit/wiki}, можно проверить наличие новых версий книги, оставить сообщение об ошибке в тексте, а также скачать книгу в других форматах." 74 | cs: 75 | prechap: "Kapitola " 76 | presect: "Oddíl " 77 | dql: "„" 78 | dqr: "“" 79 | fig: "Obrázek " 80 | tab: "Tabulka " 81 | fr: 82 | prechap: "Chapitre " 83 | presect: "Section " 84 | fig: "figure " 85 | tab: "Tableau " 86 | font: Linux Libertine 87 | mono: Courier New 88 | con: "Table des matières" 89 | langrule: "\\frenchspacing\\usepackage{fontspec}\n\\fontspec[Ligatures={Common}]{Linux Libertine}\n" 90 | thanks: "Ce fichier PDF est la traduction française du livre Pro Git. Il est publié sous license Creative Commons Attribution-Non Commercial-Share Alike 3.0. J'espère que vous l'apprécierez, qu'il vous permettra d'apprendre à utiliser Git et que vous aiderez Apress en achetant le livre original sur Amazon : \\url{http://tinyurl.com/amazonprogit}" 91 | dql: "«\\," 92 | dqr: "\\,»" 93 | es: 94 | prechap: "Capítulo " 95 | presect: "Sección " 96 | fig: "Figura " 97 | tab: "Tabla " 98 | con: "Contenidos " 99 | mk: 100 | fig: "Слика" 101 | con: "Содржина" 102 | prechap: "Поглавје" 103 | presect: "Секција" 104 | dql: "„" 105 | dqr: "“" 106 | tab: "Табела" 107 | no-nb: 108 | dql: "«" 109 | dqr: "»" 110 | thanks: "Dette er PDF filen for innholdet til boken Pro Git. Den er lisensiert under Creative Commons Attribution-Non Commercial-Share Alike 3.0 lisensen. Jeg håper du vil ha nytte av den, jeg håper den vil hjelpe deg til å lære Git, og jeg håper du vil støtte Apress og meg ved å kjøpe en kopi av denne boken hos Amazon: \\url{http://tinyurl.com/amazonprogit}" 111 | de: 112 | langrule: "\\frenchspacing" 113 | dql: "„" 114 | dqr: "“" 115 | ko: 116 | langrule: "\\XeTeXlinebreakskip=0em plus 0.1em minus 0.01em\n\\XeTeXlinebreakpenalty=0" 117 | font: NanumMyeongjo 118 | bold: "{* Bold}" 119 | mono: NanumGothicCoding 120 | prechap: "" 121 | postchap: "장" 122 | presect: "" 123 | postsect: "절" 124 | indent: " " 125 | con: "목차" 126 | fig: "그림" 127 | tab: "표" 128 | thanks: "지금 보시는 문서는 Pro Git 책에 대한 PDF 파일입니다. 본 문서는 Creative Commons 저작자표시-비영리조건-동일조건변경허락 3.0(Creative Commons Attribution-Non Commercial-Share Alike 3.0) 라이센스를 따릅니다. 여러분이 Git을 이해하는데 도움이 되기를 희망합니다. 종이로 출판된 책을 Amazon 웹사이트 \\url{http://tinyurl.com/amazonprogit} 에서 구입하여 저를 비롯한 Apress에도 도움을 주시기를 기대하겠습니다.\\newline한국어 번역은 박창우(pismute@gmail.com), 이성환(lethee@gmail.com)이 하였습니다. 오역 등의 개선 사항은 역자의 메일로 보내주시거나 한국어 번역 게시판에 \\url{https://github.com/dogfeet/progit/issues} 남겨주시기 바랍니다. 직접 개선해서 패치나 Pull Request를 보내주셔도 됩니다." 129 | be: 130 | prechap: "Глава " 131 | presect: "Раздзел " 132 | con: "Змест" 133 | fig: "Малюнак " 134 | tab: "Табліца " 135 | pl: 136 | prechap: "Rozdział " 137 | presect: "Dział " 138 | con: "Spis treści" 139 | fig: "Rysunek " 140 | tab: "Tabela " 141 | indent: "\\qquad" 142 | thanks: "Jest to plik PDF z zawartością książki Pro Git. Rozpowszechniana jest ona na licencji Creative Commons Attribution-Non Commercial-Share Alike 3.0. Mam nadzieję, że spodoba Ci się, że pomoże nauczyć się Gita, oraz mam nadzieję, że wesprzesz wydawnictwo Apress oraz mnie poprzez kupno papierowej wersji tej książki na Amazon: \\url{http://tinyurl.com/amazonprogit}" 143 | -------------------------------------------------------------------------------- /latex/makepdf: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # -*- coding: utf-8 -*- 3 | require 'fileutils' 4 | require 'erb' 5 | require 'yaml' 6 | 7 | include FileUtils 8 | 9 | $here = File.expand_path(File.dirname(__FILE__)) 10 | $root = File.join($here, '..') 11 | $outDir = File.join($root, 'pdf') 12 | 13 | def figures(lang,&block) 14 | begin 15 | Dir["#$root/figures/18333*.png"].each do |file| 16 | cp(file, file.sub(/18333fig0(\d)0?(\d+)\-tn/, '\1.\2')) 17 | end 18 | Dir["#$root/#{lang}/figures-dia/*.dia"].each do |file| 19 | eps_dest= file.sub(/.*fig0(\d)0?(\d+).dia/, '\1.\2.eps') 20 | system("dia -t eps-pango -e #$root/figures/#{eps_dest} #{file}") 21 | system("epstopdf #$root/figures/#{eps_dest}") 22 | end 23 | cp(Dir["#$root/#{lang}/figures/*.png"],"#$root/figures") 24 | cp(Dir["#$root/#{lang}/figures/*.pdf"],"#$root/figures") 25 | block.call 26 | ensure 27 | Dir["#$root/figures/18333*.png"].each do |file| 28 | rm(file.gsub(/18333fig0(\d)0?(\d+)\-tn/, '\1.\2')) 29 | end 30 | rm(Dir["#$root/figures/*.pdf"]) 31 | rm(Dir["#$root/figures/*.eps"]) 32 | end 33 | end 34 | 35 | def usage 36 | puts <' 79 | s /(\n\n)\t(http:\/\/[A-Za-z0-9\/\%\&\=\-\_\\\.\(\)\#]+)\n([^\t]|\t\n)/, '\1<\2>\1' 80 | 81 | # Match table in markdown and change them to pandoc's markdown tables 82 | s /(\n(\n\t([^\t\n]+)\t([^\t\n]+))+\n\n)/ do 83 | first_col=20 84 | t = $1.gsub /(\n?)\n\t([^\t\n]+)\t([^\t\n]+)/ do 85 | if $1=="\n" 86 | # This is the header, need to add the dash line 87 | $1 << "\n " << $2 << " "*(first_col-$2.length) << $3 << 88 | "\n " << "-"*18 << " " << "-"*$3.length 89 | else 90 | # Table row : format the first column as typewriter and align 91 | $1 << "\n `" << $2 << "`" + " "*(first_col-$2.length-2) << $3 92 | end 93 | end 94 | t << "\n" 95 | end 96 | 97 | # Process figures 98 | s /Insert\s18333fig\d+\.png\s*\n.*?\d{1,2}-\d{1,2}\. (.*)/, 'FIG: \1' 99 | end 100 | end 101 | 102 | def post_pandoc(string, config) 103 | replace(string) do 104 | space = /\s/ 105 | 106 | # Reformat for the book documentclass as opposed to article 107 | s '\section', '\chap' 108 | s '\sub', '\\' 109 | s /SUBSUBSECTION: (.*)/, '\subsubsection{\1}' 110 | s /PARAGRAPH: (.*)/, '\paragraph{\1}' 111 | 112 | # Enable proper cross-reference 113 | s /#{config['fig'].gsub(space, '\s')}\s*(\d+)\-\-(\d+)/, '\imgref{\1.\2}' 114 | s /#{config['tab'].gsub(space, '\s')}\s*(\d+)\-\-(\d+)/, '\tabref{\1.\2}' 115 | s /#{config['prechap'].gsub(space, '\s')}\s*(\d+)(\s*)#{config['postchap'].gsub(space, '\s')}/, '\chapref{\1}\2' 116 | 117 | # Miscellaneous fixes 118 | s /FIG: (.*)/, '\img{\1}' 119 | s '\begin{enumerate}[1.]', '\begin{enumerate}' 120 | s /(\w)--(\w)/, '\1-\2' 121 | s /``(.*?)''/, "#{config['dql']}\\1#{config['dqr']}" 122 | 123 | # Typeset the maths in the book with TeX 124 | s '\verb!p = (n(n-1)/2) * (1/2^160))!', '$p = \frac{n(n-1)}{2} \times \frac{1}{2^{160}}$)' 125 | s '2\^{}80', '$2^{80}$' 126 | s /\sx\s10\\\^\{\}(\d+)/, '\e{\1}' 127 | 128 | # Convert inline-verbatims into \texttt (which is able to wrap) 129 | s /\\verb(\W)(.*?)\1/ ,'\\texttt{\2}' 130 | 131 | # Style ctables 132 | s /ctable\[pos = H, center, botcap\]\{..\}/ , 'ctable[pos = ht!, caption = ~ ,width = 130mm, center, botcap]{lX}' 133 | 134 | # Shaded verbatim block 135 | s /(\\begin\{verbatim\}.*?\\end\{verbatim\})/m, '\begin{shaded}\1\end{shaded}' 136 | end 137 | end 138 | 139 | ARGV.delete_if{|arg| $DEBUG = true if arg == '-d' or arg == '--debug'} 140 | languages = ARGV.select{|arg| File.directory?("#$root/#{arg}")} 141 | usage if languages.empty? 142 | 143 | $config = YAML.load_file("#$here/config.yml") 144 | template = ERB.new(File.read("#$here/template.tex")) 145 | 146 | missing = ['pandoc', 'xelatex'].reject{|command| command_exists?(command)} 147 | unless missing.empty? 148 | puts "Missing dependencies: #{missing.join(', ')}." 149 | puts "Install these and try again." 150 | exit 151 | end 152 | 153 | languages.each do |lang| 154 | figures(lang) do 155 | config = $config['default'].merge($config[lang]) rescue $config['default'] 156 | 157 | puts "#{lang}:" 158 | markdown = Dir["#$root/#{lang}/*/*.markdown"].sort.map do |file| 159 | File.read(file) 160 | end.join("\n\n") 161 | 162 | print "\tParsing markdown... " 163 | latex = IO.popen('pandoc -p --no-wrap -f markdown -t latex', 'w+') do |pipe| 164 | pipe.write(pre_pandoc(markdown, config)) 165 | pipe.close_write 166 | post_pandoc(pipe.read, config) 167 | end 168 | puts "done" 169 | 170 | print "\tCreating main.tex for #{lang}... " 171 | dir = "#$here/#{lang}" 172 | mkdir_p(dir) 173 | File.open("#{dir}/main.tex", 'w') do |file| 174 | file.write(template.result(binding)) 175 | end 176 | puts "done" 177 | 178 | abort = false 179 | 180 | puts "\tRunning XeTeX:" 181 | cd($root) 182 | 3.times do |i| 183 | print "\t\tPass #{i + 1}... " 184 | IO.popen("xelatex -output-directory=\"#{dir}\" \"#{dir}/main.tex\" 2>&1") do |pipe| 185 | unless $DEBUG 186 | if $_[0..1]=='! ' 187 | puts "failed with:\n\t\t\t#{$_.strip}" 188 | puts "\tConsider running this again with --debug." 189 | abort = true 190 | end while pipe.gets and not abort 191 | else 192 | STDERR.print while pipe.gets rescue abort = true 193 | end 194 | end 195 | break if abort 196 | puts "done" 197 | end 198 | 199 | unless abort 200 | print "\tMoving output to progit.#{lang}.pdf... " 201 | mv("#{dir}/main.pdf", "#$root/progit.#{lang}.pdf") 202 | puts "done" 203 | end 204 | end 205 | end 206 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | # encoding: UTF-8 2 | 3 | require 'rake/clean' 4 | require 'redcarpet' 5 | 6 | $lang = ENV['language'] 7 | $lang ||= 'en' 8 | 9 | namespace :epub do 10 | TMP_DIR = File.join('epub', 'temp', $lang) 11 | INDEX_FILEPATH = File.join(TMP_DIR, 'progit.html') 12 | TARGET_FILEPATH = "progit-#{$lang}.epub" 13 | 14 | SOURCE_FILES = FileList.new(File.join($lang, '0*', '*.markdown')).sort 15 | CONVERTED_MK_FILES = SOURCE_FILES.pathmap(File.join(TMP_DIR, '%f')) 16 | HTML_FILES = CONVERTED_MK_FILES.ext('html') 17 | 18 | desc "generate EPUB ebook (add language=xx to build lang xx)" 19 | task :generate => :check 20 | task :generate => TARGET_FILEPATH 21 | 22 | desc "check whether all the required tools are installed" 23 | task :check do 24 | begin 25 | require 'maruku' 26 | found_maruku = true 27 | rescue LoadError 28 | found_maruku = false 29 | end 30 | 31 | $ebook_convert_cmd = ENV['ebook_convert_path'].to_s 32 | if $ebook_convert_cmd.empty? 33 | $ebook_convert_cmd = `which ebook-convert`.chomp 34 | end 35 | if $ebook_convert_cmd.empty? 36 | mac_osx_path = '/Applications/calibre.app/Contents/MacOS/ebook-convert' 37 | $ebook_convert_cmd = mac_osx_path 38 | end 39 | found_calibre = File.executable?($ebook_convert_cmd) 40 | 41 | if !found_maruku 42 | puts 'EPUB generation requires the Maruku gem.' 43 | puts ' On Ubuntu call "sudo apt-get install libmaruku-ruby".' 44 | end 45 | if !found_calibre 46 | puts 'EPUB generation requires Calibre.' 47 | puts ' On Ubuntu call "sudo apt-get install calibre".' 48 | end 49 | 50 | if !found_calibre || !found_maruku then exit 1 end 51 | end 52 | 53 | directory TMP_DIR 54 | 55 | rule '.html' => '.mk' do |t| 56 | require 'maruku' 57 | 58 | mk_filename = t.source 59 | html_filename = t.name 60 | puts "Converting #{mk_filename} -> #{html_filename}" 61 | 62 | mk_file = File.open(mk_filename, 'r') do |mk| 63 | html_file = File.open(html_filename, 'w') do |html| 64 | code = Maruku.new(mk.read.encode("UTF-8")).to_html 65 | code.gsub!(/^( src_for_converted do |t| 78 | src_filename = t.source 79 | dest_filename = t.name 80 | puts "Processing #{src_filename} -> #{dest_filename}" 81 | 82 | figures_dir = "../../../figures" 83 | 84 | dest_file = File.open(dest_filename, 'w') 85 | src_file = File.open(src_filename, 'r') 86 | until src_file.eof? 87 | line = src_file.readline 88 | 89 | matches = line.match /^\s*Insert\s(.*)/ 90 | if matches 91 | image_path = matches[1] 92 | real_image_path = image_path.pathmap("#{figures_dir}/%X-tn%x") 93 | 94 | next_line = src_file.readline.chomp 95 | 96 | line = "![#{next_line}](#{real_image_path} \"#{next_line}\")\n" 97 | end 98 | 99 | dest_file << line 100 | end 101 | src_file.close 102 | dest_file.close 103 | end 104 | 105 | file INDEX_FILEPATH => TMP_DIR 106 | file INDEX_FILEPATH => HTML_FILES do 107 | index_file = File.open(INDEX_FILEPATH, 'w') do |file| 108 | file << '' 109 | file << "\n" 110 | file << '' 112 | file << "\n" 113 | file << "" 114 | file << '' 115 | file << 'Pro Git - professional version control' 116 | file << '' 117 | file << '' 118 | file << "\n" 119 | 120 | HTML_FILES.each do |chapter_file| 121 | file << File.open(chapter_file).read 122 | file << "\n" 123 | end 124 | 125 | file << '' 126 | file << "\n" 127 | end 128 | end 129 | 130 | file TARGET_FILEPATH => INDEX_FILEPATH do 131 | opts = [ 132 | '--language', $lang, 133 | '--authors', 'Scott Chacon', 134 | '--comments', 'Licensed under the Creative Commons Attribution-Non Commercial-Share Alike 3.0 license', 135 | 136 | '--cover', 'epub/title.png', 137 | '--extra-css', 'epub/ProGit.css', 138 | 139 | '--chapter', '//h:h1', 140 | '--level1-toc', '//h:h1', 141 | '--level2-toc', '//h:h2', 142 | '--level3-toc', '//h:h3', 143 | ] 144 | 145 | sh $ebook_convert_cmd, INDEX_FILEPATH, TARGET_FILEPATH, *opts 146 | end 147 | 148 | CLEAN.push(*CONVERTED_MK_FILES) 149 | CLEAN.push(*HTML_FILES) 150 | CLEAN << INDEX_FILEPATH 151 | CLEAN << TMP_DIR 152 | CLOBBER << TARGET_FILEPATH 153 | end 154 | 155 | namespace :pdf do 156 | desc "generate a pdf" 157 | task :generate do 158 | system("ruby makepdfs") 159 | end 160 | end 161 | 162 | class StderrDecorator 163 | def <<(x) 164 | $stderr<< "#{x}" 165 | if x.match /REXML/ 166 | raise "" 167 | end 168 | end 169 | end 170 | 171 | namespace :ci do 172 | 173 | desc "Continuous Integration" 174 | task :check do 175 | require 'maruku' 176 | langs = FileList.new('??')+FileList.new('??-??') 177 | if ENV['debug'] && $lang 178 | langs = [$lang] 179 | else 180 | excluded_langs = [ 181 | ] 182 | excluded_langs.each do |lang| 183 | puts "excluding #{lang}: known to fail" 184 | end 185 | langs -= excluded_langs 186 | end 187 | error_code = false 188 | chapter_figure = { 189 | "01-introduction" => 7, 190 | "02-git-basics" => 2, 191 | "03-git-branching" => 39, 192 | "04-git-server" => 15, 193 | "05-distributed-git" => 27, 194 | "06-git-tools" => 1, 195 | "07-customizing-git" => 3, 196 | "08-git-and-other-scms" => 0, 197 | "09-git-internals" => 4} 198 | langs.each do |lang| 199 | print "processing #{lang} " 200 | mark = '' 201 | source_files = FileList.new(File.join(lang, '0*', '*.markdown')).sort 202 | source_files.each do |mk_filename| 203 | mk_file = File.open(mk_filename, 'r') do |mk| 204 | mark+= mk.read.encode("UTF-8") 205 | end 206 | src_file = File.open(mk_filename, 'r') 207 | figure_count = 0 208 | until src_file.eof? 209 | line = src_file.readline 210 | matches = line.match /^#/ 211 | if matches 212 | if line.match /^(#+).*#[[:blank:]]+$/ 213 | print "\nBadly formatted title in #{mk_filename}: #{line}\n" 214 | error_code = true 215 | end 216 | end 217 | if line.match /^\s*Insert\s(.*)/ 218 | figure_count = figure_count + 1 219 | end 220 | end 221 | # This extraction is a bit contorted, because the pl translation renamed 222 | # the files, so the match is done on the directories. 223 | tab_fig_count = chapter_figure[File.basename(File.dirname(mk_filename))] 224 | expected_figure_count = tab_fig_count ? tab_fig_count:0 225 | if figure_count > expected_figure_count 226 | print "\nToo many figures declared in #{mk_filename}\n" 227 | error_code = true 228 | end 229 | end 230 | begin 231 | code = Maruku.new(mark, :on_error => :raise, :error_stream => StderrDecorator.new) 232 | print "OK\n" 233 | rescue 234 | print "KO\n" 235 | print $! 236 | error_code = true 237 | end 238 | end 239 | fail "At least one language conversion failed" if error_code 240 | end 241 | 242 | end 243 | -------------------------------------------------------------------------------- /couchapp/vendor/mustache.js/mustache.js: -------------------------------------------------------------------------------- 1 | /* 2 | Shameless port of http://github.com/defunkt/mustache 3 | by Jan Lehnardt , 4 | Alexander Lang , 5 | Sebastian Cohnen 6 | 7 | Thanks @defunkt for the awesome code. 8 | 9 | See http://github.com/defunkt/mustache for more info. 10 | */ 11 | 12 | var Mustache = function() { 13 | var Renderer = function() {}; 14 | 15 | Renderer.prototype = { 16 | otag: "{{", 17 | ctag: "}}", 18 | pragmas: {}, 19 | buffer: [], 20 | pragmas_implemented: { 21 | "IMPLICIT-ITERATOR": true 22 | }, 23 | 24 | render: function(template, context, partials, in_recursion) { 25 | // fail fast 26 | if(template.indexOf(this.otag) == -1) { 27 | if(in_recursion) { 28 | return template; 29 | } else { 30 | this.send(template); 31 | return; 32 | } 33 | } 34 | 35 | if(!in_recursion) { 36 | this.buffer = []; 37 | } 38 | 39 | template = this.render_pragmas(template); 40 | var html = this.render_section(template, context, partials); 41 | if(in_recursion) { 42 | return this.render_tags(html, context, partials, in_recursion); 43 | } 44 | 45 | this.render_tags(html, context, partials, in_recursion); 46 | }, 47 | 48 | /* 49 | Sends parsed lines 50 | */ 51 | send: function(line) { 52 | if(line != "") { 53 | this.buffer.push(line); 54 | } 55 | }, 56 | 57 | /* 58 | Looks for %PRAGMAS 59 | */ 60 | render_pragmas: function(template) { 61 | // no pragmas 62 | if(template.indexOf(this.otag + "%") == -1) { 63 | return template; 64 | } 65 | 66 | var that = this; 67 | var regex = new RegExp(this.otag + "%([\\w_-]+) ?([\\w]+=[\\w]+)?" 68 | + this.ctag); 69 | return template.replace(regex, function(match, pragma, options) { 70 | if(!that.pragmas_implemented[pragma]) { 71 | throw({message: "This implementation of mustache doesn't understand the '" 72 | + pragma + "' pragma"}); 73 | } 74 | that.pragmas[pragma] = {}; 75 | if(options) { 76 | var opts = options.split("="); 77 | that.pragmas[pragma][opts[0]] = opts[1]; 78 | } 79 | return ""; 80 | // ignore unknown pragmas silently 81 | }); 82 | }, 83 | 84 | /* 85 | Tries to find a partial in the global scope and render it 86 | */ 87 | render_partial: function(name, context, partials) { 88 | if(!partials || !partials[name]) { 89 | throw({message: "unknown_partial '" + name + "'"}); 90 | } 91 | if(typeof(context[name]) != "object") { 92 | return partials[name]; 93 | } 94 | return this.render(partials[name], context[name], partials, true); 95 | }, 96 | 97 | /* 98 | Renders boolean and enumerable sections 99 | */ 100 | render_section: function(template, context, partials) { 101 | if(template.indexOf(this.otag + "#") == -1) { 102 | return template; 103 | } 104 | var that = this; 105 | // CSW - Added "+?" so it finds the tighest bound, not the widest 106 | var regex = new RegExp(this.otag + "\\#(.+)" + this.ctag + 107 | "\\s*([\\s\\S]+?)" + this.otag + "\\/\\1" + this.ctag + "\\s*", "mg"); 108 | 109 | // for each {{#foo}}{{/foo}} section do... 110 | return template.replace(regex, function(match, name, content) { 111 | var value = that.find(name, context); 112 | if(that.is_array(value)) { // Enumerable, Let's loop! 113 | return that.map(value, function(row) { 114 | return that.render(content, that.merge(context, 115 | that.create_context(row)), partials, true); 116 | }).join(""); 117 | } else if(value) { // boolean section 118 | return that.render(content, context, partials, true); 119 | } else { 120 | return ""; 121 | } 122 | }); 123 | }, 124 | 125 | /* 126 | Replace {{foo}} and friends with values from our view 127 | */ 128 | render_tags: function(template, context, partials, in_recursion) { 129 | // tit for tat 130 | var that = this; 131 | 132 | var new_regex = function() { 133 | return new RegExp(that.otag + "(=|!|>|\\{|%)?([^\/#]+?)\\1?" + 134 | that.ctag + "+", "g"); 135 | }; 136 | 137 | var regex = new_regex(); 138 | var lines = template.split("\n"); 139 | for (var i=0; i < lines.length; i++) { 140 | lines[i] = lines[i].replace(regex, function(match, operator, name) { 141 | switch(operator) { 142 | case "!": // ignore comments 143 | return match; 144 | case "=": // set new delimiters, rebuild the replace regexp 145 | that.set_delimiters(name); 146 | regex = new_regex(); 147 | return ""; 148 | case ">": // render partial 149 | return that.render_partial(name, context, partials); 150 | case "{": // the triple mustache is unescaped 151 | return that.find(name, context); 152 | default: // escape the value 153 | return that.escape(that.find(name, context)); 154 | } 155 | }, this); 156 | if(!in_recursion) { 157 | this.send(lines[i]); 158 | } 159 | } 160 | 161 | if(in_recursion) { 162 | return lines.join("\n"); 163 | } 164 | }, 165 | 166 | set_delimiters: function(delimiters) { 167 | var dels = delimiters.split(" "); 168 | this.otag = this.escape_regex(dels[0]); 169 | this.ctag = this.escape_regex(dels[1]); 170 | }, 171 | 172 | escape_regex: function(text) { 173 | // thank you Simon Willison 174 | if(!arguments.callee.sRE) { 175 | var specials = [ 176 | '/', '.', '*', '+', '?', '|', 177 | '(', ')', '[', ']', '{', '}', '\\' 178 | ]; 179 | arguments.callee.sRE = new RegExp( 180 | '(\\' + specials.join('|\\') + ')', 'g' 181 | ); 182 | } 183 | return text.replace(arguments.callee.sRE, '\\$1'); 184 | }, 185 | 186 | /* 187 | find `name` in current `context`. That is find me a value 188 | from the view object 189 | */ 190 | find: function(name, context) { 191 | name = this.trim(name); 192 | if(typeof context[name] === "function") { 193 | return context[name].apply(context); 194 | } 195 | if(context[name] !== undefined) { 196 | return context[name]; 197 | } 198 | // silently ignore unkown variables 199 | return ""; 200 | }, 201 | 202 | // Utility methods 203 | 204 | /* 205 | Does away with nasty characters 206 | */ 207 | escape: function(s) { 208 | return ((s == null) ? "" : s).toString().replace(/[&"<>\\]/g, function(s) { 209 | switch(s) { 210 | case "&": return "&"; 211 | case "\\": return "\\\\";; 212 | case '"': return '\"';; 213 | case "<": return "<"; 214 | case ">": return ">"; 215 | default: return s; 216 | } 217 | }); 218 | }, 219 | 220 | /* 221 | Merges all properties of object `b` into object `a`. 222 | `b.property` overwrites a.property` 223 | */ 224 | merge: function(a, b) { 225 | var _new = {}; 226 | for(var name in a) { 227 | if(a.hasOwnProperty(name)) { 228 | _new[name] = a[name]; 229 | } 230 | }; 231 | for(var name in b) { 232 | if(b.hasOwnProperty(name)) { 233 | _new[name] = b[name]; 234 | } 235 | }; 236 | return _new; 237 | }, 238 | 239 | // by @langalex, support for arrays of strings 240 | create_context: function(_context) { 241 | if(this.is_object(_context)) { 242 | return _context; 243 | } else if(this.pragmas["IMPLICIT-ITERATOR"]) { 244 | var iterator = this.pragmas["IMPLICIT-ITERATOR"].iterator || "."; 245 | var ctx = {}; 246 | ctx[iterator] = _context; 247 | return ctx; 248 | } 249 | }, 250 | 251 | is_object: function(a) { 252 | return a && typeof a == "object"; 253 | }, 254 | 255 | is_array: function(a) { 256 | return Object.prototype.toString.call(a) === '[object Array]'; 257 | }, 258 | 259 | /* 260 | Gets rid of leading and trailing whitespace 261 | */ 262 | trim: function(s) { 263 | return s.replace(/^\s*|\s*$/g, ""); 264 | }, 265 | 266 | /* 267 | Why, why, why? Because IE. Cry, cry cry. 268 | */ 269 | map: function(array, fn) { 270 | if (typeof array.map == "function") { 271 | return array.map(fn); 272 | } else { 273 | var r = []; 274 | var l = array.length; 275 | for(var i=0;i 251 | $ git --help 252 | $ man git- 253 | 254 | 例如:讀者可以下列命令取得config命令的手冊 255 | 256 | $ git help config 257 | 258 | 這些命令對讀者是很有幫助的,因為讀者可在任意地方取得它們,即使已離線。 259 | 若手冊及這本書不足以幫助讀者,且讀者需要更進一步的協助。 讀者可試著進入Freenode IRC伺服器(irc.freenode.net)的`#git`或`#github`頻道。 這些頻道平時都有上百位對Git非常瞭解的高手而且通常樂意協助。 260 | 261 | ## 總結 ## 262 | 263 | 目前讀者應該對於Git有一些基本的瞭解,而且知道它與其它集中式版本控制系統的不同,其中有些可能是讀者正在使用的。 讀者的系統現在也應該有一套可動作的Git且已設定好讀者個人的識別資料。 現在正是學習一些Git基本操作的好時機。 264 | -------------------------------------------------------------------------------- /zh/01-introduction/01-chapter1.markdown: -------------------------------------------------------------------------------- 1 | # 起步 # 2 | 3 | 本章介绍开始使用 Git 前的相关知识。我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置好,可以正常开始开发工作。读完本章,你就会明白为什么 Git 会如此流行,为什么你应该立即开始使用它。 4 | 5 | ## 关于版本控制 ## 6 | 7 | 什么是版本控制?我为什么要关心它呢?版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。在本书所展示的例子中,我们仅对保存着软件源代码的文本文件作版本控制管理,但实际上,你可以对任何类型的文件进行版本控制。 8 | 9 | 如果你是位图形或网页设计师,可能会需要保存某一幅图片或页面布局文件的所有修订版本(这或许是你非常渴望拥有的功能)。采用版本控制系统(VCS)是个明智的选择。有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态。你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。但额外增加的工作量却微乎其微。 10 | 11 | ### 本地版本控制系统 ### 12 | 13 | 许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的好处就是简单。不过坏处也不少:有时候会混淆所在的工作目录,一旦弄错文件丢了数据就没法撤销恢复。 14 | 15 | 为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异(见图 1-1)。 16 | 17 | Insert 18333fig0101.png 18 | 图 1-1. 本地版本控制系统 19 | 20 | 其中最流行的一种叫做 rcs,现今许多计算机系统上都还看得到它的踪影。甚至在流行的 Mac OS X 系统上安装了开发者工具包之后,也可以使用 rcs 命令。它的工作原理基本上就是保存并管理文件补丁(patch)。文件补丁是一种特定格式的文本文件,记录着对应文件修订前后的内容变化。所以,根据每次修订后的补丁,rcs 可以通过不断打补丁,计算出各个版本的文件内容。 21 | 22 | ### 集中化的版本控制系统 ### 23 | 24 | 接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作?于是,集中化的版本控制系统( Centralized Version Control Systems,简称 CVCS )应运而生。这类系统,诸如 CVS,Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法(见图 1-2)。 25 | 26 | Insert 18333fig0102.png 27 | 图 1-2. 集中化的版本控制系统 28 | 29 | 这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说。现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。 30 | 31 | 事分两面,有好有坏。这么做最显而易见的缺点是中央服务器的单点故障。如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。要是中央服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录,而被客户端偶然提取出来的保存在本地的某些快照数据就成了恢复数据的希望。但这样的话依然是个问题,你不能保证所有的数据都已经有人事先完整提取出来过。本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。 32 | 33 | ### 分布式版本控制系统 ### 34 | 35 | 于是分布式版本控制系统( Distributed Version Control System,简称 DVCS )面世了。在这类系统中,像 Git,Mercurial,Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份(见图 1-3)。 36 | 37 | Insert 18333fig0103.png 38 | 图 1-3. 分布式版本控制系统 39 | 40 | 更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。 41 | 42 | ## Git 简史 ## 43 | 44 | 同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。到 2002 年,整个项目组开始启用分布式版本控制系统 BitKeeper 来管理和维护代码。 45 | 46 | 到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了免费使用 BitKeeper 的权力。这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds )不得不吸取教训,只有开发一套属于自己的版本控制系统才不至于重蹈覆辙。他们对新的系统制订了若干目标: 47 | 48 | * 速度 49 | * 简单的设计 50 | * 对非线性开发模式的强力支持(允许上千个并行开发的分支) 51 | * 完全分布式 52 | * 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量) 53 | 54 | 自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。它的速度飞快,极其适合管理大项目,它还有着令人难以置信的非线性分支管理系统(见第三章),可以应付各种复杂的项目开发需求。 55 | 56 | ## Git 基础 ## 57 | 58 | 那么,简单地说,Git 究竟是怎样的一个系统呢?请注意,接下来的内容非常重要,若是理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余。在开始学习 Git 的时候,请不要尝试把各种概念和其他版本控制系统(诸如 Subversion 和 Perforce 等)相比拟,否则容易混淆每个操作的实际意义。Git 在保存和处理各种信息的时候,虽然操作起来的命令形式非常相近,但它与其他版本控制系统的做法颇为不同。理解这些差异将有助于你准确地使用 Git 提供的各种工具。 59 | 60 | ### 直接记录快照,而非差异比较 ### 61 | 62 | Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统(CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容,请看图 1-4。 63 | 64 | Insert 18333fig0104.png 65 | 图 1-4. 其他系统在每个版本中记录着各个文件的具体差异 66 | 67 | Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。Git 的工作方式就像图 1-5 所示。 68 | 69 | Insert 18333fig0105.png 70 | 图 1-5. Git 保存每次更新时的文件快照 71 | 72 | 这是 Git 同其他系统的重要区别。它完全颠覆了传统版本控制的套路,并对各个环节的实现方式作了新的设计。Git 更像是个小型的文件系统,但它同时还提供了许多以此为基础的超强工具,而不只是一个简单的 VCS。稍后在第三章讨论 Git 分支管理的时候,我们会再看看这样的设计究竟会带来哪些好处。 73 | 74 | ### 近乎所有操作都是本地执行 ### 75 | 76 | 在 Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网。但如果用 CVCS 的话,差不多所有操作都需要连接网络。因为 Git 在本地磁盘上就保存着所有当前项目的历史更新,所以处理起来速度飞快。 77 | 78 | 举个例子,如果要浏览项目的历史更新摘要,Git 不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看。所以任何时候你都可以马上翻阅,无需等待。如果想要看当前版本的文件和一个月前的版本之间有何差异,Git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。 79 | 80 | 用 CVCS 的话,没有网络或者断开 VPN 你就无法做任何事情。但用 Git 的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,等到了有网络的时候再上传到远程仓库。同样,在回家的路上,不用连接 VPN 你也可以继续工作。换作其他版本控制系统,这么做几乎不可能,抑或非常麻烦。比如 Perforce,如果不连到服务器,几乎什么都做不了(译注:默认无法发出命令 `p4 edit file` 开始编辑文件,因为 Perforce 需要联网通知系统声明该文件正在被谁修订。但实际上手工修改文件权限可以绕过这个限制,只是完成后还是无法提交更新。);如果是 Subversion 或 CVS,虽然可以编辑文件,但无法提交更新,因为数据库在网络上。看上去好像这些都不是什么大问题,但实际体验过之后,你就会惊喜地发现,这其实是会带来很大不同的。 81 | 82 | ### 时刻保持数据完整性 ### 83 | 84 | 在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git 一无所知。这项特性作为 Git 的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。 85 | 86 | Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串。该字串由 40 个十六进制字符(0-9 及 a-f)组成,看起来就像是: 87 | 88 | 24b9da6552252987aa493b52f8696cd6d3b00373 89 | 90 | Git 的工作完全依赖于这类指纹字串,所以你会经常看到这样的哈希值。实际上,所有保存在 Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。 91 | 92 | ### 多数操作仅添加数据 ### 93 | 94 | 常用的 Git 操作大多仅仅是把数据添加到数据库。因为任何一种不可逆的操作,比如删除数据,都会使回退或重现历史版本变得困难重重。在别的 VCS 中,若还未提交更新,就有可能丢失或者混淆一些修改的内容,但在 Git 里,一旦提交快照之后就完全不用担心丢失数据,特别是养成定期推送到其他仓库的习惯的话。 95 | 96 | 这种高可靠性令我们的开发工作安心不少,尽管去做各种试验性的尝试好了,再怎样也不会弄丢数据。至于 Git 内部究竟是如何保存和恢复数据的,我们会在第九章讨论 Git 内部原理时再作详述。 97 | 98 | ### 文件的三种状态 ### 99 | 100 | 好,现在请注意,接下来要讲的概念非常重要。对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。 101 | 102 | 由此我们看到 Git 管理项目时,文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库。 103 | 104 | Insert 18333fig0106.png 105 | 图 1-6. 工作目录,暂存区域,以及本地仓库 106 | 107 | 每个项目都有一个 Git 目录(译注:如果 `git clone` 出来的话,就是其中 `.git` 的目录;如果 `git clone --bare` 的话,新建的目录本身就是 Git 目录。),它是 Git 用来保存元数据和对象数据库的地方。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。 108 | 109 | 从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录。这些文件实际上都是从 Git 目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。 110 | 111 | 所谓的暂存区域只不过是个简单的文件,一般都放在 Git 目录中。有时候人们会把这个文件叫做索引文件,不过标准说法还是叫暂存区域。 112 | 113 | 基本的 Git 工作流程如下: 114 | 115 | 1. 在工作目录中修改某些文件。 116 | 2. 对修改后的文件进行快照,然后保存到暂存区域。 117 | 3. 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中。 118 | 119 | 所以,我们可以从文件所处的位置来判断状态:如果是 Git 目录中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。到第二章的时候,我们会进一步了解其中细节,并学会如何根据文件状态实施后续操作,以及怎样跳过暂存直接提交。 120 | 121 | ## 安装 Git ## 122 | 123 | 是时候动手尝试下 Git 了,不过得先安装好它。有许多种安装方式,主要分为两种,一种是通过编译源代码来安装;另一种是使用为特定平台预编译好的安装包。 124 | 125 | ### 从源代码安装 ### 126 | 127 | 若是条件允许,从源代码安装有很多好处,至少可以安装最新的版本。Git 的每个版本都在不断尝试改进用户体验,所以能通过源代码自己编译安装最新版本就再好不过了。有些 Linux 版本自带的安装包更新起来并不及时,所以除非你在用最新的 distro 或者 backports,那么从源代码安装其实该算是最佳选择。 128 | 129 | Git 的工作需要调用 curl,zlib,openssl,expat,libiconv 等库的代码,所以需要先安装这些依赖工具。在有 yum 的系统上(比如 Fedora)或者有 apt-get 的系统上(比如 Debian 体系),可以用下面的命令安装: 130 | 131 | $ yum install curl-devel expat-devel gettext-devel \ 132 | openssl-devel zlib-devel 133 | 134 | $ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \ 135 | libz-dev libssl-dev 136 | 137 | 之后,从下面的 Git 官方站点下载最新版本源代码: 138 | 139 | http://git-scm.com/download 140 | 141 | 然后编译并安装: 142 | 143 | $ tar -zxf git-1.7.2.2.tar.gz 144 | $ cd git-1.7.2.2 145 | $ make prefix=/usr/local all 146 | $ sudo make prefix=/usr/local install 147 | 148 | 现在已经可以用 `git` 命令了,用 `git` 把 Git 项目仓库克隆到本地,以便日后随时更新: 149 | 150 | $ git clone git://git.kernel.org/pub/scm/git/git.git 151 | 152 | ### 在 Linux 上安装 ### 153 | 154 | 如果要在 Linux 上安装预编译好的 Git 二进制安装包,可以直接用系统提供的包管理工具。在 Fedora 上用 yum 安装: 155 | 156 | $ yum install git-core 157 | 158 | 在 Ubuntu 这类 Debian 体系的系统上,可以用 apt-get 安装: 159 | 160 | $ apt-get install git 161 | 162 | ### 在 Mac 上安装 ### 163 | 164 | 在 Mac 上安装 Git 有两种方式。最容易的当属使用图形化的 Git 安装工具,界面如图 1-7,下载地址在: 165 | 166 | http://code.google.com/p/git-osx-installer 167 | 168 | Insert 18333fig0107.png 169 | 图 1-7. Git OS X 安装工具 170 | 171 | 另一种是通过 MacPorts (`http://www.macports.org`) 安装。如果已经装好了 MacPorts,用下面的命令安装 Git: 172 | 173 | $ sudo port install git-core +svn +doc +bash_completion +gitweb 174 | 175 | 这种方式就不需要再自己安装依赖库了,Macports 会帮你搞定这些麻烦事。一般上面列出的安装选项已经够用,要是你想用 Git 连接 Subversion 的代码仓库,还可以加上 +svn 选项,具体将在第八章作介绍。(译注:还有一种是使用 homebrew(`https://github.com/mxcl/homebrew`):`brew install git`。) 176 | 177 | ### 在 Windows 上安装 ### 178 | 179 | 在 Windows 上安装 Git 同样轻松,有个叫做 msysGit 的项目提供了安装包,可以到 GitHub 的页面上下载 exe 安装文件并运行: 180 | 181 | http://msysgit.github.com/ 182 | 183 | 完成安装之后,就可以使用命令行的 `git` 工具(已经自带了 ssh 客户端)了,另外还有一个图形界面的 Git 项目管理工具。 184 | 185 | ## 初次运行 Git 前的配置 ## 186 | 187 | 一般在新的系统上,我们都需要先配置下自己的 Git 工作环境。配置工作只需一次,以后升级时还会沿用现在的配置。当然,如果需要,你随时可以用相同的命令修改已有的配置。 188 | 189 | Git 提供了一个叫做 git config 的工具(译注:实际是 `git-config` 命令,只不过可以通过 `git` 加一个名字来呼叫此命令。),专门用来配置或读取相应的工作环境变量。而正是由这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方: 190 | 191 | * `/etc/gitconfig` 文件:系统中对所有用户都普遍适用的配置。若使用 `git config` 时用 ` --system` 选项,读写的就是这个文件。 192 | * `~/.gitconfig` 文件:用户目录下的配置文件只适用于该用户。若使用 `git config` 时用 ` --global` 选项,读写的就是这个文件。 193 | * 当前项目的 git 目录中的配置文件(也就是工作目录中的 `.git/config` 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 `.git/config` 里的配置会覆盖 `/etc/gitconfig` 中的同名变量。 194 | 195 | 在 Windows 系统上,Git 会找寻用户主目录下的 `.gitconfig` 文件。主目录即 `$HOME` 变量指定的目录,一般都是 `C:\Documents and Settings\$USER`。此外,Git 还会尝试找寻 `/etc/gitconfig` 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。 196 | 197 | ### 用户信息 ### 198 | 199 | 第一个要配置的是你个人的用户名称和电子邮件地址。这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录: 200 | 201 | $ git config --global user.name "John Doe" 202 | $ git config --global user.email johndoe@example.com 203 | 204 | 如果用了 `--global` 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 `--global` 选项重新配置即可,新的设定保存在当前项目的 `.git/config` 文件里。 205 | 206 | ### 文本编辑器 ### 207 | 208 | 接下来要设置的是默认使用的文本编辑器。Git 需要你输入一些额外消息的时候,会自动调用一个外部文本编辑器给你用。默认会使用操作系统指定的默认编辑器,一般可能会是 Vi 或者 Vim。如果你有其他偏好,比如 Emacs 的话,可以重新设置: 209 | 210 | $ git config --global core.editor emacs 211 | 212 | ### 差异分析工具 ### 213 | 214 | 还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话: 215 | 216 | $ git config --global merge.tool vimdiff 217 | 218 | Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的输出信息。当然,你也可以指定使用自己开发的工具,具体怎么做可以参阅第七章。 219 | 220 | ### 查看配置信息 ### 221 | 222 | 要检查已有的配置信息,可以使用 `git config --list` 命令: 223 | 224 | $ git config --list 225 | user.name=Scott Chacon 226 | user.email=schacon@gmail.com 227 | color.status=auto 228 | color.branch=auto 229 | color.interactive=auto 230 | color.diff=auto 231 | ... 232 | 233 | 有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 `/etc/gitconfig` 和 `~/.gitconfig`),不过最终 Git 实际采用的是最后一个。 234 | 235 | 也可以直接查阅某个环境变量的设定,只要把特定的名字跟在后面即可,像这样: 236 | 237 | $ git config user.name 238 | Scott Chacon 239 | 240 | ## 获取帮助 ## 241 | 242 | 想了解 Git 的各式工具该怎么用,可以阅读它们的使用帮助,方法有三: 243 | 244 | $ git help 245 | $ git --help 246 | $ man git- 247 | 248 | 比如,要学习 config 命令可以怎么用,运行: 249 | 250 | $ git help config 251 | 252 | 我们随时都可以浏览这些帮助信息而无需连网。不过,要是你觉得还不够,可以到 Frenode IRC 服务器(irc.freenode.net)上的 `#git` 或 `#github` 频道寻求他人帮助。这两个频道上总有着上百号人,大多都有着丰富的 git 知识,并且乐于助人。 253 | 254 | ## 小结 ## 255 | 256 | 至此,你该对 Git 有了点基本认识,包括它和以前你使用的 CVCS 之间的差别。现在,在你的系统上应该已经装好了 Git,设置了自己的名字和电邮。接下来让我们继续学习 Git 的基础知识。 257 | -------------------------------------------------------------------------------- /couchapp/vendor/markdown/showdown.js: -------------------------------------------------------------------------------- 1 | /* 2 | A A L Source code at: 3 | T C A 4 | T K B 5 | */ 6 | 7 | var Showdown={}; 8 | Showdown.converter=function(){ 9 | var _1; 10 | var _2; 11 | var _3; 12 | var _4=0; 13 | this.makeHtml=function(_5){ 14 | _1=new Array(); 15 | _2=new Array(); 16 | _3=new Array(); 17 | _5=_5.replace(/~/g,"~T"); 18 | _5=_5.replace(/\$/g,"~D"); 19 | _5=_5.replace(/\r\n/g,"\n"); 20 | _5=_5.replace(/\r/g,"\n"); 21 | _5="\n\n"+_5+"\n\n"; 22 | _5=_6(_5); 23 | _5=_5.replace(/^[ \t]+$/mg,""); 24 | _5=_7(_5); 25 | _5=_8(_5); 26 | _5=_9(_5); 27 | _5=_a(_5); 28 | _5=_5.replace(/~D/g,"$$"); 29 | _5=_5.replace(/~T/g,"~"); 30 | return _5; 31 | }; 32 | var _8=function(_b){ 33 | var _b=_b.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|\Z)/gm,function(_c,m1,m2,m3,m4){ 34 | m1=m1.toLowerCase(); 35 | _1[m1]=_11(m2); 36 | if(m3){ 37 | return m3+m4; 38 | }else{ 39 | if(m4){ 40 | _2[m1]=m4.replace(/"/g,"""); 41 | } 42 | } 43 | return ""; 44 | }); 45 | return _b; 46 | }; 47 | var _7=function(_12){ 48 | _12=_12.replace(/\n/g,"\n\n"); 49 | var _13="p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del"; 50 | var _14="p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math"; 51 | _12=_12.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm,_15); 52 | _12=_12.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm,_15); 53 | _12=_12.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,_15); 54 | _12=_12.replace(/(\n\n[ ]{0,3}[ \t]*(?=\n{2,}))/g,_15); 55 | _12=_12.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,_15); 56 | _12=_12.replace(/\n\n/g,"\n"); 57 | return _12; 58 | }; 59 | var _15=function(_16,m1){ 60 | var _18=m1; 61 | _18=_18.replace(/\n\n/g,"\n"); 62 | _18=_18.replace(/^\n/,""); 63 | _18=_18.replace(/\n+$/g,""); 64 | _18="\n\n~K"+(_3.push(_18)-1)+"K\n\n"; 65 | return _18; 66 | }; 67 | var _9=function(_19){ 68 | _19=_1a(_19); 69 | var key=_1c("
"); 70 | _19=_19.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm,key); 71 | _19=_19.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm,key); 72 | _19=_19.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm,key); 73 | _19=_1d(_19); 74 | _19=_1e(_19); 75 | _19=_1f(_19); 76 | _19=_7(_19); 77 | _19=_20(_19); 78 | return _19; 79 | }; 80 | var _21=function(_22){ 81 | _22=_23(_22); 82 | _22=_24(_22); 83 | _22=_25(_22); 84 | _22=_26(_22); 85 | _22=_27(_22); 86 | _22=_28(_22); 87 | _22=_11(_22); 88 | _22=_29(_22); 89 | _22=_22.replace(/ +\n/g,"
\n"); 90 | return _22; 91 | }; 92 | var _24=function(_2a){ 93 | var _2b=/(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|)/gi; 94 | _2a=_2a.replace(_2b,function(_2c){ 95 | var tag=_2c.replace(/(.)<\/?code>(?=.)/g,"$1`"); 96 | tag=_2e(tag,"\\`*_"); 97 | return tag; 98 | }); 99 | return _2a; 100 | }; 101 | var _27=function(_2f){ 102 | _2f=_2f.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,_30); 103 | _2f=_2f.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,_30); 104 | _2f=_2f.replace(/(\[([^\[\]]+)\])()()()()()/g,_30); 105 | return _2f; 106 | }; 107 | var _30=function(_31,m1,m2,m3,m4,m5,m6,m7){ 108 | if(m7==undefined){ 109 | m7=""; 110 | } 111 | var _39=m1; 112 | var _3a=m2; 113 | var _3b=m3.toLowerCase(); 114 | var url=m4; 115 | var _3d=m7; 116 | if(url==""){ 117 | if(_3b==""){ 118 | _3b=_3a.toLowerCase().replace(/ ?\n/g," "); 119 | } 120 | url="#"+_3b; 121 | if(_1[_3b]!=undefined){ 122 | url=_1[_3b]; 123 | if(_2[_3b]!=undefined){ 124 | _3d=_2[_3b]; 125 | } 126 | }else{ 127 | if(_39.search(/\(\s*\)$/m)>-1){ 128 | url=""; 129 | }else{ 130 | return _39; 131 | } 132 | } 133 | } 134 | url=_2e(url,"*_"); 135 | var _3e=""; 142 | return _3e; 143 | }; 144 | var _26=function(_3f){ 145 | _3f=_3f.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,_40); 146 | _3f=_3f.replace(/(!\[(.*?)\]\s?\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,_40); 147 | return _3f; 148 | }; 149 | var _40=function(_41,m1,m2,m3,m4,m5,m6,m7){ 150 | var _49=m1; 151 | var _4a=m2; 152 | var _4b=m3.toLowerCase(); 153 | var url=m4; 154 | var _4d=m7; 155 | if(!_4d){ 156 | _4d=""; 157 | } 158 | if(url==""){ 159 | if(_4b==""){ 160 | _4b=_4a.toLowerCase().replace(/ ?\n/g," "); 161 | } 162 | url="#"+_4b; 163 | if(_1[_4b]!=undefined){ 164 | url=_1[_4b]; 165 | if(_2[_4b]!=undefined){ 166 | _4d=_2[_4b]; 167 | } 168 | }else{ 169 | return _49; 170 | } 171 | } 172 | _4a=_4a.replace(/"/g,"""); 173 | url=_2e(url,"*_"); 174 | var _4e="\""+_4a+"\"";"+_21(m1)+""); 184 | }); 185 | _4f=_4f.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm,function(_52,m1){ 186 | return _1c("

"+_21(m1)+"

"); 187 | }); 188 | _4f=_4f.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm,function(_54,m1,m2){ 189 | var _57=m1.length; 190 | return _1c(""+_21(m2)+""); 191 | }); 192 | return _4f; 193 | }; 194 | var _58; 195 | var _1d=function(_59){ 196 | _59+="~0"; 197 | var _5a=/^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm; 198 | if(_4){ 199 | _59=_59.replace(_5a,function(_5b,m1,m2){ 200 | var _5e=m1; 201 | var _5f=(m2.search(/[*+-]/g)>-1)?"ul":"ol"; 202 | _5e=_5e.replace(/\n{2,}/g,"\n\n\n"); 203 | var _60=_58(_5e); 204 | _60=_60.replace(/\s+$/,""); 205 | _60="<"+_5f+">"+_60+"\n"; 206 | return _60; 207 | }); 208 | }else{ 209 | _5a=/(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g; 210 | _59=_59.replace(_5a,function(_61,m1,m2,m3){ 211 | var _65=m1; 212 | var _66=m2; 213 | var _67=(m3.search(/[*+-]/g)>-1)?"ul":"ol"; 214 | var _66=_66.replace(/\n{2,}/g,"\n\n\n"); 215 | var _68=_58(_66); 216 | _68=_65+"<"+_67+">\n"+_68+"\n"; 217 | return _68; 218 | }); 219 | } 220 | _59=_59.replace(/~0/,""); 221 | return _59; 222 | }; 223 | _58=function(_69){ 224 | _4++; 225 | _69=_69.replace(/\n{2,}$/,"\n"); 226 | _69+="~0"; 227 | _69=_69.replace(/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm,function(_6a,m1,m2,m3,m4){ 228 | var _6f=m4; 229 | var _70=m1; 230 | var _71=m2; 231 | if(_70||(_6f.search(/\n{2,}/)>-1)){ 232 | _6f=_9(_72(_6f)); 233 | }else{ 234 | _6f=_1d(_72(_6f)); 235 | _6f=_6f.replace(/\n$/,""); 236 | _6f=_21(_6f); 237 | } 238 | return "
  • "+_6f+"
  • \n"; 239 | }); 240 | _69=_69.replace(/~0/g,""); 241 | _4--; 242 | return _69; 243 | }; 244 | var _1e=function(_73){ 245 | _73+="~0"; 246 | _73=_73.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,function(_74,m1,m2){ 247 | var _77=m1; 248 | var _78=m2; 249 | _77=_79(_72(_77)); 250 | _77=_6(_77); 251 | _77=_77.replace(/^\n+/g,""); 252 | _77=_77.replace(/\n+$/g,""); 253 | _77="
    "+_77+"\n
    "; 254 | return _1c(_77)+_78; 255 | }); 256 | _73=_73.replace(/~0/,""); 257 | return _73; 258 | }; 259 | var _1c=function(_7a){ 260 | _7a=_7a.replace(/(^\n+|\n+$)/g,""); 261 | return "\n\n~K"+(_3.push(_7a)-1)+"K\n\n"; 262 | }; 263 | var _23=function(_7b){ 264 | _7b=_7b.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,function(_7c,m1,m2,m3,m4){ 265 | var c=m3; 266 | c=c.replace(/^([ \t]*)/g,""); 267 | c=c.replace(/[ \t]*$/g,""); 268 | c=_79(c); 269 | return m1+""+c+""; 270 | }); 271 | return _7b; 272 | }; 273 | var _79=function(_82){ 274 | _82=_82.replace(/&/g,"&"); 275 | _82=_82.replace(//g,">"); 277 | _82=_2e(_82,"*_{}[]\\",false); 278 | return _82; 279 | }; 280 | var _29=function(_83){ 281 | _83=_83.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g,"$2"); 282 | _83=_83.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g,"$2"); 283 | return _83; 284 | }; 285 | var _1f=function(_84){ 286 | _84=_84.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm,function(_85,m1){ 287 | var bq=m1; 288 | bq=bq.replace(/^[ \t]*>[ \t]?/gm,"~0"); 289 | bq=bq.replace(/~0/g,""); 290 | bq=bq.replace(/^[ \t]+$/gm,""); 291 | bq=_9(bq); 292 | bq=bq.replace(/(^|\n)/g,"$1 "); 293 | bq=bq.replace(/(\s*
    [^\r]+?<\/pre>)/gm,function(_88,m1){
    294 | var pre=m1;
    295 | pre=pre.replace(/^  /mg,"~0");
    296 | pre=pre.replace(/~0/g,"");
    297 | return pre;
    298 | });
    299 | return _1c("
    \n"+bq+"\n
    "); 300 | }); 301 | return _84; 302 | }; 303 | var _20=function(_8b){ 304 | _8b=_8b.replace(/^\n+/g,""); 305 | _8b=_8b.replace(/\n+$/g,""); 306 | var _8c=_8b.split(/\n{2,}/g); 307 | var _8d=new Array(); 308 | var end=_8c.length; 309 | for(var i=0;i=0){ 312 | _8d.push(str); 313 | }else{ 314 | if(str.search(/\S/)>=0){ 315 | str=_21(str); 316 | str=str.replace(/^([ \t]*)/g,"

    "); 317 | str+="

    "; 318 | _8d.push(str); 319 | } 320 | } 321 | } 322 | end=_8d.length; 323 | for(var i=0;i=0){ 325 | var _91=_3[RegExp.$1]; 326 | _91=_91.replace(/\$/g,"$$$$"); 327 | _8d[i]=_8d[i].replace(/~K\d+K/,_91); 328 | } 329 | } 330 | return _8d.join("\n\n"); 331 | }; 332 | var _11=function(_92){ 333 | _92=_92.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&"); 334 | _92=_92.replace(/<(?![a-z\/?\$!])/gi,"<"); 335 | return _92; 336 | }; 337 | var _25=function(_93){ 338 | _93=_93.replace(/\\(\\)/g,_94); 339 | _93=_93.replace(/\\([`*_{}\[\]()>#+-.!])/g,_94); 340 | return _93; 341 | }; 342 | var _28=function(_95){ 343 | _95=_95.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,"
    $1"); 344 | _95=_95.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,function(_96,m1){ 345 | return _98(_a(m1)); 346 | }); 347 | return _95; 348 | }; 349 | var _98=function(_99){ 350 | function char2hex(ch){ 351 | var _9b="0123456789ABCDEF"; 352 | var dec=ch.charCodeAt(0); 353 | return (_9b.charAt(dec>>4)+_9b.charAt(dec&15)); 354 | } 355 | var _9d=[function(ch){ 356 | return "&#"+ch.charCodeAt(0)+";"; 357 | },function(ch){ 358 | return "&#x"+char2hex(ch)+";"; 359 | },function(ch){ 360 | return ch; 361 | }]; 362 | _99="mailto:"+_99; 363 | _99=_99.replace(/./g,function(ch){ 364 | if(ch=="@"){ 365 | ch=_9d[Math.floor(Math.random()*2)](ch); 366 | }else{ 367 | if(ch!=":"){ 368 | var r=Math.random(); 369 | ch=(r>0.9?_9d[2](ch):r>0.45?_9d[1](ch):_9d[0](ch)); 370 | } 371 | } 372 | return ch; 373 | }); 374 | _99=""+_99+""; 375 | _99=_99.replace(/">.+:/g,"\">"); 376 | return _99; 377 | }; 378 | var _a=function(_a3){ 379 | _a3=_a3.replace(/~E(\d+)E/g,function(_a4,m1){ 380 | var _a6=parseInt(m1); 381 | return String.fromCharCode(_a6); 382 | }); 383 | return _a3; 384 | }; 385 | var _72=function(_a7){ 386 | _a7=_a7.replace(/^(\t|[ ]{1,4})/gm,"~0"); 387 | _a7=_a7.replace(/~0/g,""); 388 | return _a7; 389 | }; 390 | var _6=function(_a8){ 391 | _a8=_a8.replace(/\t(?=\t)/g," "); 392 | _a8=_a8.replace(/\t/g,"~A~B"); 393 | _a8=_a8.replace(/~B(.+?)~A/g,function(_a9,m1,m2){ 394 | var _ac=m1; 395 | var _ad=4-_ac.length%4; 396 | for(var i=0;i<_ad;i++){ 397 | _ac+=" "; 398 | } 399 | return _ac; 400 | }); 401 | _a8=_a8.replace(/~A/g," "); 402 | _a8=_a8.replace(/~B/g,""); 403 | return _a8; 404 | }; 405 | var _2e=function(_af,_b0,_b1){ 406 | var _b2="(["+_b0.replace(/([\[\]\\])/g,"\\$1")+"])"; 407 | if(_b1){ 408 | _b2="\\\\"+_b2; 409 | } 410 | var _b3=new RegExp(_b2,"g"); 411 | _af=_af.replace(_b3,_94); 412 | return _af; 413 | }; 414 | var _94=function(_b4,m1){ 415 | var _b6=m1.charCodeAt(0); 416 | return "~E"+_b6+"E"; 417 | }; 418 | }; 419 | var conv = new Showdown.converter(); 420 | exports.toHtml = conv.makeHtml; 421 | -------------------------------------------------------------------------------- /ko/01-introduction/01-chapter1.markdown: -------------------------------------------------------------------------------- 1 | # 시작하기 # 2 | 3 | 이 장에서 설명하는 것은 Git을 처음 접하는 사람에게 필요한 내용이다. 먼저 버전 관리 도구에 대한 이해와 Git을 설치하는 방법을 설명하고 마지막으로 Git 서버를 설정하고 사용하는 방법을 설명한다. 이 장을 다 읽고 나면 Git 탄생 배경, Git을 사용하는 이유, Git을 설정하고 사용하는 방법을 터득하게 될 것이다. 4 | 5 | ## 버전 관리란? ## 6 | 7 | 버전 관리는 무엇이고 우리는 왜 이것을 알아야 할까? 버전 관리 시스템은 파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템이다. 이 책에서는 버전 관리하는 예제로 소스 코드만 보여주지만, 실제로 거의 모든 컴퓨터 파일의 버전을 관리할 수 있다. 8 | 9 | 그래픽 디자이너나 웹 디자이너도 버전 관리 시스템(VCS - Version Control System)을 사용할 수 있다. VCS로 이미지나 레이아웃의 버전(변경 이력 혹은 수정 내용)을 관리하는 것은 매우 현명하다. VCS를 사용하면 각 파일을 이전 상태로 되돌릴 수 있고, 프로젝트를 통째로 이전 상태로 되돌릴 수 있고, 시간에 따라 수정 내용을 비교해 볼 수 있고, 누가 문제를 일으켰는지도 추적할 수 있고, 누가 언제 만들어낸 이슈인지도 알 수 있다. VCS를 사용하면 파일을 잃어버리거나 잘못 고쳤을 때도 쉽게 복구할 수 있다. 이런 모든 장점을 큰 노력 없이 이용할 수 있다. 10 | 11 | ### 로컬 버전 관리 시스템 ### 12 | 13 | 많은 사람은 버전을 관리하기 위해 디렉토리로 파일을 복사하는 방법을 쓴다(똑똑한 사람이라면 디렉토리 이름에 시간을 넣을 거다). 이 방법은 간단하므로 자주 사용한다. 그렇지만, 정말 뭔가가 잘못되기 쉽다. 작업하던 디렉토리를 지워버리거나, 실수로 파일을 잘못 고칠 수도 있고, 잘못 복사할 수도 있다. 14 | 15 | 이런 이유로 프로그래머들은 오래전에 로컬 VCS라는 걸 만들었다. 이 VCS는 아주 간단한 데이터베이스를 사용해서 파일의 변경 정보를 관리했다. 16 | 17 | Insert 18333fig0101.png 18 | 그림 1-1 로컬 버전 관리 다이어그램 19 | 20 | 많이 쓰는 VCS 도구 중에 rcs라고 부르는 것이 있는데 오늘날까지도 아직 많은 회사가 사용하고 있다. Mac OS X 운영체제에서도 개발 도구를 설치하면 RCS가 함께 설치된다. RCS는 기본적으로 Patch Set(파일에서 변경되는 부분)을 관리한다. 이 Patch Set은 특별한 형식의 파일로 저장한다. 그리고 일련의 Patch Set을 적용해서 모든 파일을 특정 시점으로 되돌릴 수 있다. 21 | 22 | ### 중앙집중식 버전 관리 시스템 ### 23 | 24 | 프로젝트를 진행하다 보면 다른 개발자와 함께 작업해야 하는 경우가 많다. 이럴 때 생기는 문제를 해결하기 위해 CVCS(중앙집중식 VCS)가 개발됐다. CVS, Subversion, Perforce 같은 시스템은 파일을 관리하는 서버가 별도로 있고 클라이언트가 중앙 서버에서 파일을 받아서 사용(Checkout)한다. 수년 동안 이러한 시스템들이 많은 사랑을 받았다. 25 | 26 | Insert 18333fig0102.png 27 | 그림 1-2 중앙집중식 버전 관리(CVCS) 다이어그램 28 | 29 | CVCS 환경은 로컬 VCS에 비해 장점이 많다. 프로젝트에 참여한 사람이면 누가 무엇을 하고 있는지 알 수 있다. 관리자는 누가 무엇을 할 수 있는지 꼼꼼하게 관리할 수 있다. 모든 클라이언트의 로컬 데이터베이스를 관리하는 것보다 VCS 하나를 관리하기가 훨씬 쉽다. 30 | 31 | 그러나 CVCS 환경은 몇 가지 치명적인 결점이 있다. 가장 대표적인 것이 중앙 서버에 발생한 문제다. 만약 서버가 한 시간 동안 다운되면 그동안 아무도 다른 사람과 협업할 수 없고 사람들이 하는 일을 백업할 방법도 없다. 그리고 중앙 데이터베이스가 있는 하드디스크에 문제가 생기면 프로젝트의 모든 히스토리를 잃는다. 물론 사람마다 하나씩 가진 스냅샷은 괜찮다. 로컬 VCS 시스템도 이와 비슷한 결점이 있고 이런 문제가 발생하면 모든 것을 잃는다. 32 | 33 | ### 분산 버전 관리 시스템 ### 34 | 35 | DVCS(분산 버전 관리 시스템)을 설명할 차례다. Git, Mecurial, Bazaar, Darcs 같은 DVCS에서는 클라이언트가 파일의 마지막 스냅샷을 Checkout하지 않는다. 그냥 저장소를 전부 복제한다. 서버에 문제가 생기면 이 복제물로 다시 작업을 시작할 수 있다. 클라이언트 중에서 아무거나 골라도 서버를 복원할 수 있다. 모든 Checkout은 모든 데이터를 가진 진정한 백업이다. 36 | 37 | Insert 18333fig0103.png 38 | 그림 1-3 분산 버전 관리 시스템(DVCS) 다이어그램 39 | 40 | 게다가 대부분의 DVCS 환경에서는 리모트 저장소가 존재한다. 리모트 저장소가 많을 수도 있다. 그래서 사람들은 동시에 다양한 그룹과 다양한 방법으로 협업할 수 있다. 계층 모델 같은 중앙집중식 시스템으로는 할 수 없는 몇 가지 워크플로우를 사용할 수 있다. 41 | 42 | ## 짧게 보는 Git의 역사 ## 43 | 44 | 인생을 살다 보면 여러 가지 일들이 벌어지듯이 Git의 삶 또한 창조적인 파괴와 모순 속에서 시작되었다. 리눅스 커널은 굉장히 규모가 큰 오픈소스 프로젝트다. 리눅스 커널의 일생에서 대부분 시절은 패치와 단순 압축 파일로만 관리했다. 2002년에 드디어 리눅스 커널은 BitKeeper라고 불리는 상용 DVCS를 사용하기 시작했다. 45 | 46 | 2005년에 커뮤니티가 만드는 리눅스 커널과 이익을 추구하는 회사가 개발한 BitKeeper의 관계는 틀어졌다. BitKeeper의 무료 사용이 제고된 것이다. 이 사건은 리눅스 개발 커뮤니티(특히 리눅스 창시자 리누스 토발즈)가 자체 도구를 만드는 계기가 됐다. Git은 BitKeeper를 사용하면서 배운 교훈을 기초로 아래와 같은 목표를 세웠다: 47 | 48 | * 빠른 속도 49 | * 단순한 구조 50 | * 비선형적인 개발(수천 개의 동시 다발적인 브랜치) 51 | * 완벽한 분산 52 | * 리눅스 커널 같은 대형 프로젝트에도 유용할 것(속도나 데이터 크기 면에서) 53 | 54 | Git은 2005년 탄생하고 나서 아직도 초기 목표를 그대로 유지하고 있다. 그러면서도 사용하기 쉽게 진화하고 성숙했다. Git은 미친 듯이 빨라서 대형 프로젝트에 사용하기도 좋다. Git은 동시다발적인 브랜치에도 끄떡없는 슈퍼 울트라 브랜칭 시스템이다(*3장* 참고). 55 | 56 | ## Git 기초 ## 57 | 58 | Git의 핵심은 뭘까? 이 질문은 Git을 이해하는데 굉장히 중요하다. Git이 무엇이고 어떻게 동작하는지 이해한다면 쉽게 Git을 효과적으로 사용할 수 있다. Git을 배우려면 Subversion이나 Perforce 같은 다른 VCS를 사용하던 경험을 지워버려야 한다. Git은 미묘하게 달라서 다른 VCS에서 쓰던 개념으로는 헷갈릴 거다. 사용자 인터페이스는 매우 비슷하지만, 정보를 취급하는 방식이 다르다. 이런 차이점을 이해하면 Git을 사용하는 것이 어렵지 않다. 59 | 60 | ### 델타가 아니라 스냅샷 ### 61 | 62 | Subversion과 Subversion 비슷한 놈들과 Git의 가장 큰 차이점은 데이터를 다루는 방법에 있다. 큰 틀에서 봤을 때 대부분의 VCS 시스템이 관리하는 정보는 파일들의 목록이다. CVS, Subversion, Perforce, Bazaar 등의 시스템은 파일의 집합으로 정보를 관리한다. 각 파일의 변화를 그림 1-4처럼 시간순으로 관리한다. 63 | 64 | Insert 18333fig0104.png 65 | 그림 1-4 각 파일에 대한 변화(델타)를 저장하는 시스템들 66 | 67 | Git은 이런 식으로 데이터를 저장하지도 취급하지도 않는다. 대신 Git의 데이터는 파일 시스템의 스냅샷이라 할 수 있으며 크기가 아주 작다. Git은 커밋하거나 프로젝트의 상태를 저장할 때마다 파일이 존재하는 그 순간을 중요하게 여긴다. 파일이 달라지지 않았으면 Git은 성능을 위해서 파일을 저장하지 않는다. 단지 이전 상태의 파일에 대한 링크만 저장한다. Git은 그림 1-5처럼 동작한다. 68 | 69 | Insert 18333fig0105.png 70 | 그림 1-5 Git은 시간순으로 프로젝트의 스냅샷을 저장한다 71 | 72 | 이것이 Git이 다른 VCS와 구분되는 점이다. 이점 때문에 Git는 다른 시스템들이 과거로부터 답습해왔던 버전 컨트롤의 개념과 다르다는 것이고 많은 부분을 새로운 관점에서 바라본다. Git은 강력한 도구를 지원하는 작은 파일시스템이다. Git은 단순한 VCS가 아니다. 이제 3장에서 설명할 Git 브랜치를 사용하면 얻게 되는 이득이 무엇인지 설명한다. 73 | 74 | ### 거의 모든 명령을 로컬에서 실행 ### 75 | 76 | 거의 모든 명령이 로컬 파일과 데이터만 사용하기 때문에 네트워크에 있는 다른 컴퓨터는 필요 없다. 대부분의 명령어가 네트워크의 속도에 영향을 받는 CVCS에 익숙하다면 Git이 매우 놀라울 것이다. Git의 이런 특징에서 나오는 미칠듯한 속도는 오직 Git느님만이 구사할 수 있는 초인적인 능력이다. 프로젝트의 모든 히스토리가 로컬 디스크에 있기 때문에 모든 명령을 순식간에 실행된다. 77 | 78 | 예를 들어 Git은 프로젝트의 히스토리를 조회할 때 서버 없이 조회한다. 그냥 로컬 데이터베이스에서 히스토리를 읽어서 보여 준다. 그래서 눈 깜짝할 사이에 히스토리를 조회할 수 있다. 어떤 파일의 현재 버전과 한 달 전의 상태를 비교해보고 싶을 때도 Git은 그냥 한 달 전의 파일과 지금의 파일을 로컬에서 찾는다. 파일을 비교하기 위해 리모트에 있는 서버에 접근하고 나서 예전 버전을 가져올 필요가 없다. 79 | 80 | 즉 오프라인 상태에서도 비교할 수 있다. 비행기나 기차 등에서 작업하고 네트워크에 접속하고 있지 않아도 커밋할 수 있다. 다른 VCS 시스템에서는 불가능한 일이다. Perforce는 서버에 연결할 수 없을 때 할 수 있는 일이 별로 없다. Subversion이나 CVS에서도 마찬가지다. 데이터베이스에 접근할 수 없어서 파일을 편집할 수는 있지만, 커밋할 수 없다. 매우 사소해 보이지만 실제로 이 상황에 부닥쳐보면 느껴지는 차이가 매우 크다. 81 | 82 | ### Git의 무결성 ### 83 | 84 | Git은 모든 데이터를 저장하기 전에 체크섬(또는 해시)을 구하고 그 체크섬으로 데이터를 관리한다. 체크섬 없이 어떠한 파일이나 디렉토리도 변경할 수 없다. 체크섬은 Git에서 사용하는 가장 기본적인(Atomic) 데이터 단위이자 Git의 기본 철학이다. Git 없이는 체크섬을 다룰 수 없어서 파일의 상태도 알 수 없고 심지어 데이터를 잃어버릴 수도 없다. 85 | 86 | Git은 SHA-1 해시를 사용하여 체크섬을 만든다. 만든 체크섬은 40자 길이의 16진수 문자열이다. 파일의 내용이나 디렉토리 구조를 이용하여 체크섬을 구한다. SHA-1은 아래처럼 생겼다: 87 | 88 | 24b9da6552252987aa493b52f8696cd6d3b00373 89 | 90 | Git은 모든 것을 해시로 식별하기 때문에 이런 값은 여기저기서 보인다. 실제로 Git은 파일을 이름으로 저장하지 않고 해당 파일의 해시로 저장한다. 91 | 92 | ### Git은 데이터를 추가할 뿐 ### 93 | 94 | Git으로 무얼 하든 데이터를 추가한다. 되돌리거나 데이터를 삭제할 방법이 없다. 다른 VCS처럼 Git도 커밋하지 않으면 변경사항을 잃어버릴 수 있다. 하지만, 일단 스냅샷을 커밋하고 나면 데이터를 잃어버리기 어렵다. 95 | 96 | Git을 사용하면 프로젝트가 심각하게 망가질 걱정 없이 매우 즐겁게 여러 가지 실험을 해 볼 수 있다. *9장*을 보면 Git이 데이터를 어떻게 저장하고 손실을 어떻게 복구해야 할지 알 수 있다. 97 | 98 | ### 세 가지 상태 ### 99 | 100 | 이 부분은 중요하기에 집중해서 읽어야 한다. Git을 공부하기 위해 반드시 짚고 넘어가야 할 부분이다. Git은 파일을 Committed, Modified, Staged 이렇게 세 가지 상태로 관리한다. Committed란 데이터가 로컬 데이터베이스에 안전하게 저장됐다는 것을 의미한다. Modified는 수정한 파일을 아직 로컬 데이터베이스에 커밋하지 않은 것을 말한다. Staged란 현재 수정한 파일을 곧 커밋할 것이라고 표시한 상태를 의미한다. 101 | 102 | 이 세 가지 상태는 Git 프로젝트의 세 가지 단계와 연결돼 있다. Git 디렉토리, 워킹 디렉토리, Staging Area 이렇게 세 가지 단계를 이해하고 넘어가자. 103 | 104 | Insert 18333fig0106.png 105 | 그림 1-6 워킹 디렉토리, Staging Area, Git 디렉토리 106 | 107 | Git 디렉토리는 Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳을 말한다. Git 디렉토리가 Git의 핵심이다. 다른 컴퓨터에 있는 저장소를 Clone 할 때 Git 디렉토리가 만들어진다. 108 | 109 | 워킹 디렉토리는 프로젝트의 특정 버전을 Checkout한 것이다. Git 디렉토리는 지금 작업하는 디스크에 있고 그 디렉토리에 압축된 데이터베이스에서 파일을 가져와서 워킹 디렉토리를 만든다. 110 | 111 | Staging Area는 Git 디렉토리에 있다. 단순한 파일이고 곧 커밋할 파일에 대한 정보를 저장한다. 종종 인덱스라고 불리기도 하지만, Staging Area라는 명칭이 표준이 되어가고 있다. 112 | 113 | Git으로 하는 일은 기본적으로 아래와 같다: 114 | 115 | - 워킹 디렉토리에서 파일을 수정한다. 116 | - Staging Area에 파일을 Stage해서 커밋할 스냅샷을 만든다. 117 | - Staging Area에 있는 파일들을 커밋해서 Git 디렉토리에 영구적인 스냅샷으로 저장한다. 118 | 119 | Git 디렉토리에 있는 파일들은 Committed 상태이다. 파일을 수정하고 Staging Area에 추가했다면 Staged이다. 그리고 Checkout하고 나서 수정했지만, 아직 Staging Area에 추가하지 않았으면 Modified이다. *2장*에서 이 상태에 대해 좀 더 자세히 배운다. 특히 Staging Area를 어떻게 이용하는지 혹은 아예 생략하는 방법도 설명한다. 120 | 121 | ## Git 설치 ## 122 | 123 | Git을 사용하려면 우선 설치해야 한다. 다양한 방법으로 Git을 설치할 수 있지만 두 가지 방법이 가장 일반적이다. 하나는 소스코드로 컴파일하여 설치하는 방법이고 다른 하나는 각 운영체제(혹은 플랫폼)의 패키지를 사용하여 설치하는 방법이다. 124 | 125 | ### 소스코드로 설치하기 ### 126 | 127 | 소스코드로 설치하면 Git의 가장 최신 버전을 설치할 수 있기 때문에 컴파일하여 설치할 시간이 있으면 소스코드로 Git을 설치하는 것이 좋다. Git은 계속 UI를 개선하고 있기 때문에 최신 버전을 사용하면 좋은 기능을 빨리 사용할 수 있다. 리눅스 패키지는 보통 최신 버전이 아니고 예전 버전이다. 그래서 Backport를 사용하거나 소스코드로 설치하는 것도 좋은 대안이다. 128 | 129 | Git을 설치하려면 아래와 같은 라이브러리들이 필요하다. Git은 curl, zlib, openssl, expat, libiconv를 필요로 한다. 예를 들어 Fedora처럼 yum을 사용하는 시스템이나 apt-get이 있는 데비안류 시스템이면 아래 명령어를 실행하여 의존 패키지를 설치할 수 있다: 130 | 131 | $ yum install curl-devel expat-devel gettext-devel \ 132 | openssl-devel zlib-devel 133 | 134 | $ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \ 135 | libz-dev libssl-dev 136 | 137 | 필요한 라이브러리를 모두 설치하고 다음 단계를 진행한다. Git 웹 사이트에서 최신 스냅샷을 가져온다: 138 | 139 | http://git-scm.com/download 140 | 141 | 그리고 컴파일하고 설치한다: 142 | 143 | $ tar -zxf git-1.7.2.2.tar.gz 144 | $ cd git-1.7.2.2 145 | $ make prefix=/usr/local all 146 | $ sudo make prefix=/usr/local install 147 | 148 | 설치한 다음부터는 Git을 사용하여 Git 소스코드를 수정할 수 있다: 149 | 150 | $ git clone git://git.kernel.org/pub/scm/git/git.git 151 | 152 | ### 리눅스에 설치 ### 153 | 154 | 리눅스에서 패키지로 Git을 설치할 때에는 보통 각 배포판에서 사용하는 패키지 관리도구를 사용하여 설치한다. Fedora에서는 아래와 같이 한다: 155 | 156 | $ yum install git-core 157 | 158 | Ubuntu같은 데비안류 배포판에서는 apt-get을 사용한다: 159 | 160 | $ apt-get install git 161 | 162 | ### Mac에 설치하기 ### 163 | 164 | Mac에 Git을 쉽게 설치하는 방법은 두 가지가 있다. GUI 인스톨러가 가장 쉽게 사용할 수 있다. Google Code 페이지에서 내려받는다: 165 | 166 | http://code.google.com/p/git-osx-installer 167 | 168 | Insert 18333fig0107.png 169 | 그림 1-7 OS X Git 인스톨러 170 | 171 | MacPorts(`http://www.macports.org`)를 사용하는 방법도 있다. MacPorts가 설치돼 있으면 아래와 같이 Git을 설치한다: 172 | 173 | $ sudo port install git-core +svn +doc +bash_completion +gitweb 174 | 175 | 이제 설치는 했다. 만약 Subversion 저장소를 Git과 함께 사용해야 하면 svn도 필요하다. 176 | 177 | ### 윈도에 설치 ### 178 | 179 | 윈도에서도 Git을 쉽게 설치할 수 있다. 그저 구글 코드 페이지에서 msysGit 인스톨러를 내려받고 실행하면 된다: 180 | 181 | http://msysgit.github.com/ 182 | 183 | 설치가 완료되면 CLI 프로그램과 GUI 프로그램을 둘 다 사용할 수 있다. CLI 프로그램에는 SSH 클라이언트가 포함돼 있기 때문에 유용하다. 184 | 185 | ## Git 최초 설정 ## 186 | 187 | Git을 설치하고 나면 Git의 사용 환경을 적절하게 설정해 주어야 한다. 한 번만 설정하면 된다. 설정한 내용은 Git을 업그레이드해도 유지된다. 언제든지 다시 바꿀 수 있는 명령어가 있다. 188 | 189 | 'git config'라는 도구로 설정 내용을 확인하고 변경할 수 있다. Git은 이 설정에 따라 동작한다. 이때 사용하는 설정 파일은 세 가지나 된다. 190 | 191 | * `/etc/gitconfig` 파일: 시스템의 모든 사용자와 모든 저장소에 적용되는 설정이다. `git config --system` 옵션으로 이 파일을 읽고 쓸 수 있다. 192 | * `~/.gitconfig` 파일: 특정 사용자에게만 적용되는 설정이다. `git config --global` 옵션으로 이 파일을 읽고 쓸 수 있다. 193 | * `.git/config`: 이 파일은 Git 디렉토리에 있고 특정 저장소(혹은 현재 작업 중인 프로젝트)에만 적용된다. 각 설정은 역순으로 우선시 된다. 그래서 `.git/config`가 `/etc/gitconfig`보다 우선한다. 194 | 195 | 윈도용 Git은 `$HOME` 디렉토리(`C:\Documents and Settings\$USER`)에 있는 `.gitconfig` 파일을 찾는다. msysGit에도 /etc/gitconfig 파일이 있다. 경로는 MSys 루트에 따른 상대 경로다. 인스톨러로 msysGit을 설치할 때 설치 경로를 선택할 수 있다. 196 | 197 | ### 사용자 정보 ### 198 | 199 | Git을 설치하고 나서 가장 먼저 해야 하는 것은 사용자 이름과 이메일 주소를 설정하는 것이다. Git은 커밋할 때마다 이 정보를 사용한다. 한 번 커밋한 후에는 정보를 변경할 수 없다: 200 | 201 | $ git config --global user.name "John Doe" 202 | $ git config --global user.email johndoe@example.com 203 | 204 | 다시 말하자면 `--global` 옵션으로 설정한 것은 딱 한 번만 하면 된다. 해당 시스템에서 해당 사용자가 사용할 때에는 이 정보를 사용한다. 만약 프로젝트마다 다른 이름과 이메일 주소를 사용하고 싶으면 `--global` 옵션을 빼고 명령을 실행한다. 205 | 206 | ### 편집기 ### 207 | 208 | 사용자 정보를 설정하고 나면 Git에서 사용할 텍스트 편집기를 고른다. 기본적으로 Git은 시스템의 기본 편집기를 사용하고 보통 Vi나 Vim이다. 하지만, Emacs 같은 다른 텍스트 편집기를 사용할 수 있고 아래와 같이 실행하면 된다: 209 | 210 | $ git config --global core.editor emacs 211 | 212 | ### Diff 도구 ### 213 | 214 | Merge 충돌을 해결하기 위해 사용하는 Diff 도구를 설정할 수 있다. vimdiff를 사용하고 싶으면 아래와 같이 실행한다: 215 | 216 | $ git config --global merge.tool vimdiff 217 | 218 | 이렇게 kdiff3, tkdiff, meld, xxdif, emerge, vimdiff, gvimdiff, ecmerge, opendiff를 사용할 수 있다. 물론 다른 도구도 사용할 수 있다. 자세한 내용은 *7장*에서 다룬다. 219 | 220 | ### 설정 확인 ### 221 | 222 | `git config --list` 명령을 실행하면 설정한 모든 것을 보여준다: 223 | 224 | $ git config --list 225 | user.name=Scott Chacon 226 | user.email=schacon@gmail.com 227 | color.status=auto 228 | color.branch=auto 229 | color.interactive=auto 230 | color.diff=auto 231 | ... 232 | 233 | Git은 같은 키를 여러 파일(`/etc/gitconfig`와 `~/.gitconfig` 같은)에서 읽기 때문에 같은 키가 여러개 있을 수도 있다. 이러면 Git은 나중 값을 사용한다. 234 | 235 | `git config {key}` 명령으로 Git이 특정 Key에 대해 어떤 값을 사용하는지 확인할 수 있다: 236 | 237 | $ git config user.name 238 | Scott Chacon 239 | 240 | ## 도움말 보기 ## 241 | 242 | 명령어에 대한 도움말이 필요할 때 도움말을 보는 방법은 세 가지다: 243 | 244 | $ git help 245 | $ git --help 246 | $ man git- 247 | 248 | 예를 들어 아래와 같이 실행하면 config 명령에 대한 도움말을 볼 수 있다: 249 | 250 | $ git help config 251 | 252 | 도움말은 언제 어디서나 볼 수 있다. 오프라인으로도 볼 수 있다. 도움말과 이 책으로 부족하면 다른 사람의 도움을 받는 것이 필요하다. Freenode IRC 서버(irc.freenode.net)에 있는 `#git`이나 `#github` 채널로 찾아가라. 이 채널에는 보통 수백 명의 사람이 접속해 있다. 이 사람들은 모두 Git에 대해 잘 알고 있다. 기꺼이 도와줄 것이다. 253 | 254 | ## 요약 ## 255 | 256 | 우리는 Git이 무엇이고 지금까지 사용해 온 다른 CVCS와 어떻게 다른지 배웠다. 시스템에 Git을 설치하고 사용자 정보도 설정했다. 다음 장에서는 Git의 사용법을 배운다. 257 | -------------------------------------------------------------------------------- /it/06-git-tools/01-chapter6.markdown: -------------------------------------------------------------------------------- 1 | # Git Tools # 2 | 3 | Fin'ora sono stati imparati la maggior parte dei comandi giornalieri a i 4 | workflow che potrebbero essere necessari a gestire e mantenere un repository Git 5 | per il controllo del codice sorgente. 6 | Sono state compiute le attività di base per il tracciamento e il commit dei 7 | file, ed è stato sfruttato il potere della *staging area* e argomenti leggeri il 8 | *branching* (ramificazione) e il *merge*. 9 | 10 | Ora verrà esplorato un numero di cose veramente potenti che Git può fare che non 11 | vengono necessariamente usate di base quotidianamente ma che potrebbero servire 12 | ad un certo punto. 13 | 14 | ## Selezione della revisione ## 15 | 16 | Git permette di specificare determinati *commit* o una serie di *commit* in 17 | diversi modi. 18 | Non sono necessariamente evidenti ma può essere d'aiuto conoscerli. 19 | 20 | ### Singola revisione ### 21 | 22 | E' possibile ovviamente riferirsi a un *commit* tramite l'hash SHA-1 che viene 23 | dato, ma ci sono modi più alla portata degli umani per riferirsi ai *commit*. 24 | Questa sezione delinea i diversi modi con cui ci si può riferire ad un singolo 25 | commit. 26 | 27 | ### SHA breve ### 28 | 29 | Git è abbastanza intelligente da capire a quale *commit* ci si riferisce se si 30 | fornisce i primi caratteri, purché il codice SHA-1 sia di almeno quattro 31 | caratteri e univoco - solo un oggetto nel *repository* corrente inizia con quel 32 | SHA-1 parziale. 33 | 34 | Per esempio, per vedere uno specifico *commit*, supponiamo che venga eseguito un 35 | comando 'git log' e venga identificato un *commit* dove sono state aggiunte 36 | certe funzionalità: 37 | 38 | $ git log 39 | commit 734713bc047d87bf7eac9674765ae793478c50d3 40 | Author: Scott Chacon 41 | Date: Fri Jan 2 18:32:33 2009 -0800 42 | 43 | fixed refs handling, added gc auto, updated tests 44 | 45 | commit d921970aadf03b3cf0e71becdaab3147ba71cdef 46 | Merge: 1c002dd... 35cfb2b... 47 | Author: Scott Chacon 48 | Date: Thu Dec 11 15:08:43 2008 -0800 49 | 50 | Merge commit 'phedders/rdocs' 51 | 52 | commit 1c002dd4b536e7479fe34593e72e6c6c1819e53b 53 | Author: Scott Chacon 54 | Date: Thu Dec 11 14:58:32 2008 -0800 55 | 56 | added some blame and merge stuff 57 | 58 | In questo caso, scegliamo '1c002dd....' Se viene eseguito 'git show' su quel 59 | *commit*, i seguenti comandi sono equivalenti (assumendo che le versioni più 60 | corte siano univoche): 61 | 62 | $ git show 1c002dd4b536e7479fe34593e72e6c6c1819e53b 63 | $ git show 1c002dd4b536e7479f 64 | $ git show 1c002d 65 | 66 | Git riesce a capire una corta, univoca abbreviazione del valore SHA-1. Se viene 67 | passato '--abbrev-commit' al comando 'git-log', l'*output* userà valori più 68 | corti ma li manterrà unici; in maniera predefinita utilizza sette caratteri ma 69 | se necessario ne userà di più per mantenere il codice SHA-1 univoco: 70 | 71 | $ git log --abbrev-commit --pretty=oneline 72 | ca82a6d changed the version number 73 | 085bb3b removed unnecessary test code 74 | a11bef0 first commit 75 | 76 | Generalmente, da otto a dieci caratteri sono più che sufficienti per essere 77 | univoci all'interno di un progetto. 78 | Uno dei progetti Git più grandi, il kernel Linux, inizia a necessitare 12 79 | caratteri, dei 40 possibili, per rimanere univoco. 80 | 81 | ### Una breve nota su SHA-1 ### 82 | 83 | Un sacco di gente si preoccupa ad un certo punto che, per una qualche casualità, 84 | potrebbe avere due oggetti nel proprio *repository* che abbiano lo stesso hash 85 | SHA-1. Cosa accadrebbe a quel punto? 86 | 87 | Se capita di fare il *commit* di un oggetto che ha lo stesso SHA-1 di un oggetto 88 | precedente nel proprio *repository*, Git noterà il precedente oggetto già 89 | presente nel database Git e lo riterrà già scritto. 90 | Provando ad ottenere informazioni su quell'oggetto nuovamente ad un certo punto, 91 | verranno sempre restituiti i dati del primo oggetto. 92 | 93 | Ad ogni modo, è necessario essere consapevoli di quanto ridicolmente improbabile 94 | sia questo scenario. Il codice SHA-1 riassunto è di 20 bytes o 160 bits. Il 95 | numero casuale di oggetti necessari per assicurare un 50% di una singola 96 | collisione è di circa 2^80 (la formula per determinare la probabilità di 97 | collisione è `p = (n(n-1)/2) * (1/2^160))`. 2^80 è 1.2 x 10^24 o un milione di 98 | miliardi di miliardi. E' 1,200 volte il numero di granelli di sabbia sulla 99 | terra. 100 | 101 | Ecco un esempio per dare un'idea di cosa ci vorrebbe per ottenere una collisione 102 | SHA-1. Se tutti i 6.5 miliardi di esseri umani sulla Terra stessero 103 | programmando, e ogni secondo, ognuno stesse producendo codice che fosse 104 | equivalente all'intera storia del kernel Linux (1 milione di oggetti Git) e se 105 | lo stesse caricando su un enorme *repository* Git, ci vorrebbero 5 anni per 106 | contenere abbastanza oggetti in quel *repository* da avere il 50% di possibilità 107 | di una singola collisione di oggetti SHA-1. Esiste una probabilità più alta che 108 | ogni membro del team venga attaccato e ucciso dai lupi in situazioni 109 | indipendenti durante la stessa notte. 110 | 111 | ### Riferimenti al *branch* ### 112 | 113 | La strada più diretta per specificare un *commit* richiede che punti ad un 114 | riferimento di un *branch*. A quel punto potrebbe essere usato il nome del 115 | *branch* in qualsiasi comando Git che richiede un oggetto *commit* o un valore 116 | SHA-1. Per esempio, se si vuole mostrare l'ultimo oggetto *commit* di un 117 | *branch*, i seguenti comandi sono equivalenti, ammesso che il *branch* 'topic1' 118 | punti a 'ca82a6d': 119 | 120 | $ git show ca82a6dff817ec66f44342007202690a93763949 121 | $ git show topic1 122 | 123 | Se si vuole vedere a quale specifico SHA un *branch* punta, o se si vuole vedere 124 | a cosa si riduce ognuno di questi esempi in termini di SHA, si può usare un 125 | *plumbing tool* di Git chiamato 'rev-parse'. Nel Capitolo 9 ci sono più informazioni 126 | sui *plumbing tool*; sostanzialmente, 'rev-parse' esiste per operazioni di basso 127 | livello e non è concepito per essere usato in operazioni quotidiane. Comunque, 128 | può essere d'aiuto a volte quanto c'è bisogno di vedere cosa succede realmente. 129 | A quel punto si può lanciare 'rev-parse' sul proprio *branch*. 130 | 131 | $ git rev-parse topic1 132 | ca82a6dff817ec66f44342007202690a93763949 133 | 134 | ### RefLog ### 135 | 136 | Una delle cose che Git fa mentre si lavora è tenere un reflog - un log sui 137 | riferimenti di *HEAD* e *branch* degli ultimi mesi. 138 | 139 | E' possibile vedere il reflog usando il comando 'git reflog': 140 | 141 | $ git reflog 142 | 734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated 143 | d921970... HEAD@{1}: merge phedders/rdocs: Merge made by recursive. 144 | 1c002dd... HEAD@{2}: commit: added some blame and merge stuff 145 | 1c36188... HEAD@{3}: rebase -i (squash): updating HEAD 146 | 95df984... HEAD@{4}: commit: # This is a combination of two commits. 147 | 1c36188... HEAD@{5}: rebase -i (squash): updating HEAD 148 | 7e05da5... HEAD@{6}: rebase -i (pick): updating HEAD 149 | 150 | Ogni volta che il *branch* è aggiornato, Git registra l'informazione in questa 151 | lista temporanea. Si possono specificare anche *commit* più vecchi. Se si vuole 152 | vedere il quinto valore precedente della *HEAD* del proprio *repository*, si può 153 | usare il riferimento '@{n}' che si vede nel *output* di reflog: 154 | 155 | $ git show HEAD@{5} 156 | 157 | Si può anche usare questa sintassi per vedere dove era un *branch* una certa 158 | quantità di tempo fa. Per esempio, per vedere dov'era il 'master' *branch* ieri, 159 | si può scrivere: 160 | 161 | $ git show master@{yesterday} 162 | 163 | Questo mostra dove era il *branch* ieri. Questa tecnica funziona solo per i dati 164 | che sono ancora nel *reflog*, non è possibile usarla per vedere *commit* più 165 | vecchi di qualche mese. 166 | 167 | Per vedere le informazioni del *reflog* formattate come il '*git log*', si può 168 | lanciare il comando 'git log -g': 169 | 170 | $ git log -g master 171 | commit 734713bc047d87bf7eac9674765ae793478c50d3 172 | Reflog: master@{0} (Scott Chacon ) 173 | Reflog message: commit: fixed refs handling, added gc auto, updated 174 | Author: Scott Chacon 175 | Date: Fri Jan 2 18:32:33 2009 -0800 176 | 177 | fixed refs handling, added gc auto, updated tests 178 | 179 | commit d921970aadf03b3cf0e71becdaab3147ba71cdef 180 | Reflog: master@{1} (Scott Chacon ) 181 | Reflog message: merge phedders/rdocs: Merge made by recursive. 182 | Author: Scott Chacon 183 | Date: Thu Dec 11 15:08:43 2008 -0800 184 | 185 | Merge commit 'phedders/rdocs' 186 | 187 | E' importante notare che l'informazione del *reflog* è strettamente locale - è 188 | un log di cosa è stato fatto nel proprio *repository*. I riferimenti non saranno 189 | uguali nella copia del *repository* tenuta da qualcun altro. 190 | Lanciare 'git show HEAD@{2.months-ago}' funzionerà solo se il progetto è stato 191 | clonato almeno due mesi fa - se è stato clonato cinque minuti prima non verrà 192 | restituito alcun risultato. 193 | 194 | ### Riferimenti di discendenza ### 195 | 196 | L'altro modo per specificare un *commit* è attraverso la sua discendenza. Se 197 | viene posizionato un `^` alla fine di un riferimento, Git lo interpreta come il 198 | genitore di quel determinato *commit*. 199 | Supponiamo che si guardi la lista delle modifiche effettuate nel progetto: 200 | 201 | $ git log --pretty=format:'%h %s' --graph 202 | * 734713b fixed refs handling, added gc auto, updated tests 203 | * d921970 Merge commit 'phedders/rdocs' 204 | |\ 205 | | * 35cfb2b Some rdoc changes 206 | * | 1c002dd added some blame and merge stuff 207 | |/ 208 | * 1c36188 ignore *.gem 209 | * 9b29157 add open3_detach to gemspec file list 210 | 211 | E' possibile vedere il precedente *commit* specificando `HEAD^`, che significa 212 | "il genitore di HEAD": 213 | 214 | $ git show HEAD^ 215 | commit d921970aadf03b3cf0e71becdaab3147ba71cdef 216 | Merge: 1c002dd... 35cfb2b... 217 | Author: Scott Chacon 218 | Date: Thu Dec 11 15:08:43 2008 -0800 219 | 220 | Merge commit 'phedders/rdocs' 221 | 222 | Si può anche specificare un numero dopo `^` - per esempio, `d921970^2` significa 223 | "il secondo genitore di d921870." Questa sintassi è utile per fare il *merge* di 224 | *commit* che hanno più di un genitore. 225 | Il primo genitore è il *branch* dove ci si trova al momento del *merge*, e il 226 | secondo è il *commit* sul *branch* di cui è stato fatto il *merge*: 227 | 228 | $ git show d921970^ 229 | commit 1c002dd4b536e7479fe34593e72e6c6c1819e53b 230 | Author: Scott Chacon 231 | Date: Thu Dec 11 14:58:32 2008 -0800 232 | 233 | added some blame and merge stuff 234 | 235 | $ git show d921970^2 236 | commit 35cfb2b795a55793d7cc56a6cc2060b4bb732548 237 | Author: Paul Hedderly 238 | Date: Wed Dec 10 22:22:03 2008 +0000 239 | 240 | Some rdoc changes 241 | 242 | Un altro modo per specificare la discendenza è `~`. Anche questo si riferisce al 243 | primo genitore, quindi `HEAD~` e `HEAD^` sono equivalenti. La differenza si nota 244 | quando viene specificato un numero. 245 | `HEAD~2` significa "il primo genitore del primo genitore", o "il nonno" - 246 | attraversa i primi genitori il numero di volte specificato. Per esempio, nella 247 | lista mostrata precedentemente, `HEAD~3` sarebbe 248 | 249 | $ git show HEAD~3 250 | commit 1c3618887afb5fbcbea25b7c013f4e2114448b8d 251 | Author: Tom Preston-Werner 252 | Date: Fri Nov 7 13:47:59 2008 -0500 253 | 254 | ignore *.gem 255 | 256 | Potrebbe essere anche scritto come `HEAD^^^`, che è sempre il primo genitore del 257 | primo genitore del primo genitore: 258 | 259 | $ git show HEAD^^^ 260 | commit 1c3618887afb5fbcbea25b7c013f4e2114448b8d 261 | Author: Tom Preston-Werner 262 | Date: Fri Nov 7 13:47:59 2008 -0500 263 | 264 | ignore *.gem 265 | 266 | E' possibile anche combinare queste sintassi - si può prendere il secondo 267 | genitore del precedente riferimento (assumendo che si tratti di un *merge 268 | commit*) usando `HEAD~3^2`, e così via. 269 | -------------------------------------------------------------------------------- /ja/01-introduction/01-chapter1.markdown: -------------------------------------------------------------------------------- 1 | # 使い始める # 2 | 3 | この章は、Gitを使い始めることに関してになります。まずはバージョン管理システムの背景に触れ、その後にGitをあなたのシステムで動かす方法、そしてGitで作業を始めるための設定方法について説明します。この章を読み終えるころには、なぜGitが広まっているか、なぜGitを使うべきなのか、それをするための準備が全て整っているだろうということを、あなたはきっと理解しているでしょう。 4 | 5 | ## バージョン管理に関して ## 6 | 7 | バージョン管理とは何でしょうか、また、なぜそれを気にする必要があるのでしょうか? 8 | バージョン管理とは、変更を一つのファイル、もしくは時間を通じたファイルの集合に記録するシステムで、そのため後で特定バージョンを呼び出すことができます。現実にはコンピューター上のほとんどあらゆるファイルのタイプでバージョン管理を行なう事ができますが、本書の中の例では、バージョン管理されるファイルとして、ソフトウェアのソースコードを利用します。 9 | 10 | もしあなたが、グラフィックス・デザイナー、もしくはウェブ・デザイナーであって、(あなたが最も確実に望んでいるであろう)画像もしくはレイアウトの全てのバージョンを管理したいのであれば、バージョン管理システム(VCS)はとても賢く利用できるものです。VCSを使ってできることとしては、ファイルを以前の状態まで戻したり、プロジェクト丸ごとを以前の状態に戻したり、過去の変更を見直したり、誰が最後に問題を引き起こすだろう何かを修正したか、誰が、何時、課題を導入したかを確認したりといった様々なことがあります。VCSを使うということはまた、一般的に、何かをもみくちゃにするか、ファイルを失うとしても、簡単に復活させることができることを意味します。加えて、とても僅かな諸経費で、それら全てを得ることができます。 11 | 12 | ### ローカル・バージョン管理システム ### 13 | 14 | 多くの人々の選り抜きのバージョン管理手法は、他のディレクトリ(もし彼らが賢いのであれば、恐らく日時が書かれたディレクトリ)にファイルをコピーするというものです。このアプローチは、とても単純なためにすごく一般的ですが、信じられない間違い傾向もあります。どのディレクトリにいるのか忘れやすいですし、偶然に間違ったファイルに書き込んだり、意図しないファイルに上書きしたりします。 15 | 16 | この問題を扱うため、大昔にプログラマは、バージョン管理下で全ての変更をファイルに保持するシンプルなデータベースを持つ、ローカルなバージョン管理システムを開発しました(図1-1参照)。 17 | 18 | Insert 18333fig0101.png 19 | 図1-1. ローカル・バージョン管理図解 20 | 21 | もっとも有名なVCSツールの一つが、RCSと呼ばれるシステムでした。今日でも依然として多くのコンピューターに入っています。人気のMac OS Xオペレーティング・システムさえも、開発者ツールをインストールしたときは、rcsコマンドを含みます。このツールは基本的に、ディスク上に特殊フォーマットで、一つのリビジョンからもう一つのリビジョンへのパッチ(これはファイル間の差分です)の集合を保持することで稼動します。そういうわけで、全てのパッチを積み上げることで、いつかは、あらゆる時点の、あらゆるファイルのように見えるものを再生成する事ができます。 22 | 23 | ### 集中バージョン管理システム ### 24 | 25 | 次に人々が遭遇した大きな問題は、他のシステムの開発者と共同制作をする必要があることです。この問題に対処するために、集中バージョン管理システム(CVCSs)が開発されました。CVSやSubversion、Perforceのような、これらのシステムは、全てのバージョン管理されたファイルと、その中央の場所からファイルをチェック・アウトする多数のクライアントを含む単一のサーバーを持ちます。長年の間、これはバージョン管理の標準となって来ました(図1-2参照)。 26 | 27 | Insert 18333fig0102.png 28 | 図1-2. 集中バージョン管理図解 29 | 30 | この構成は、特にローカルVCSと比較して、多くの利点を提供します。例えば、全ての人は、プロジェクトのその他の全ての人々が何をしているのか、一定の程度は知っています。管理者は、誰が何をできるのかについて、きめ細かい統制手段を持ちます。このため、一つのCVCSを管理するということは、全てのクライアントのローカル・データベースを取り扱うより、はるかに容易です。 31 | 32 | しかしながら、この構成はまた、深刻な不利益も持ちます。もっとも明白なのは、中央サーバーで発生する単一障害点です。もし、そのサーバーが1時間の間停止すると、その1時間の間は誰も全く、共同作業や、彼らが作業を進めている全てに対してバージョン変更の保存をすることができなくなります。もし中央データベースがのっているハードディスクが破損し、適切なバックアップが保持されていないとすると、人々が偶然にローカル・マシンに持っていた幾らかの単一スナップショット(訳者注:ある時点のファイル、ディレクトリなどの編集対象の状態)を除いた、プロジェクト全体の履歴を失うことになります。ローカルVCSシステムも、これと同じ問題に悩まされます。つまり、単一の場所にプロジェクトの全体の履歴を持っているときはいつでも、全てを失う事を覚悟することになります。 33 | 34 | ### 分散バージョン管理システム ### 35 | 36 | ここから分散バージョン管理システム(DVCs)に入ります。DVCS(Git、Mercurial、Bazaar、Darcsのようなもの)では、クライアントはファイルの最新スナップショットをチェックアウト(訳者注:バージョン管理システムから、作業ディレクトリにファイルやディレクトリをコピーすること)するだけではありません。リポジトリ(訳者注:バージョン管理の対象になるファイル、ディレクトリ、更新履歴などの一群)全体をミラーリングします。故にどのサーバーが故障したとして、故障したサーバーを介してそれらのDVCSが共同作業をしていたとしても、あらゆるクライアント・リポジトリは修復のためにサーバーにコピーして戻す事ができます。そのサーバーを介してコラボレーションしていたシステムは, どれか一つのクライアントのリポジトリからサーバー復旧の為バックアップをコピーすることができます. 全てのチェックアウトは、実は全データの完全バックアップなのです(図1-3を参照)。 37 | 38 | Insert 18333fig0103.png 39 | 図1-3. 分散バージョン管理システムの図解 40 | 41 | そのうえ、これらのDVCSの多くは、 連携する複数のリモート・リポジトリを扱いながら大変よく機能するため、同一のプロジェクト内において、同時に異なった方法で、異なる人々のグループと共同作業が可能です。このことは、集中システムでは不可能であった階層モデルのような、幾つかの様式のワークフローを始めることを許します。 42 | 43 | ## Git略史 ## 44 | 45 | 人生における多くの素晴らしい出来事のように、Gitはわずかな創造的破壊と熱烈な論争から始まりました。Linuxカーネルは、非常に巨大な範囲のオープンソース・ソフトウェア・プロジェクトの一つです。Linuxカーネル保守の大部分の期間(1991-2002)の間は、このソフトウェアに対する変更は、パッチとアーカイブしたファイルとして次々にまわされていました。2002年に、Linuxカーネル・プロジェクトはプロプライエタリのDVCSであるBitKeeperを使い始めました。 46 | 47 | 2005年に、Linuxカーネルを開発していたコミュニティと、BitKeeperを開発していた営利企業との間の協力関係が崩壊して、課金無しの状態が取り消されました。これは、Linux開発コミュニティ(と、特にLinuxの作者のLinus Torvalds)に、BitKeeperを利用している間に学んだ幾つかの教訓を元に、彼ら独自のツールの開発を促しました。新しいシステムの目標の幾つかは、次の通りでした: 48 | 49 | * スピード 50 | * シンプルな設計 51 | * ノンリニア開発(数千の並列ブランチ)への強力なサポート 52 | * 完全な分散 53 | * Linux カーネルのような大規模プロジェクトを(スピードとデータサイズで)効率的に取り扱い可能 54 | 55 | 2005年のその誕生から、Gitは使いやすく発展・成熟してきており、さらにその初期の品質を維持しています。とても高速で、巨大プロジェクトではとても効率的で、ノンリニア開発のためのすごい分岐システム(branching system)を備えています(第3章参照)。 56 | 57 | ## Gitの基本 ## 58 | 59 | では、要するにGitとは何なのでしょうか。これは、Gitを吸収するには重要な節です。なぜならば、もしGitが何かを理解し、Gitがどうやって稼動しているかの根本を理解できれば、Gitを効果的に使う事が恐らくとても容易になるからです。 60 | Gitを学ぶときは、SubversionやPerforceのような他のVCSsに関してあなたが恐らく知っていることは、意識しないでください。このツールを使うときに、ちょっとした混乱を回避することに役立ちます。Gitは、ユーザー・インターフェイスがとてもよく似ているのにも関わらず、それら他のシステムとは大きく異なって、情報を格納して取り扱います(訳者注:「取り扱う」の部分はthinksなので、「見なします」と訳す方が原語に近い)。これらの相違を理解する事は、Gitを扱っている間の混乱を、防いでくれるでしょう。 61 | 62 | ### スナップショットで、差分ではない ### 63 | 64 | Gitと他のVCS (Subversionとその類を含む)の主要な相違は、Gitのデータについての考え方です。概念的には、他のシステムのほとんどは、情報をファイルを基本とした変更のリストとして格納します。これらのシステム(CVS、Subversion、Perforce、Bazaar等々)は、図1-4に描かれているように、システムが保持しているファイルの集合と、時間を通じてそれぞれのファイルに加えられた変更の情報を考えます。 65 | 66 | Insert 18333fig0104.png 67 | 図1-4. 他のシステムは、データをそれぞれのファイルの基本バージョンへの変更として格納する傾向があります。 68 | 69 | Gitは、この方法ではデータを考えたり、格納しません。代わりに、Gitはデータをミニ・ファイルシステムのスナップショットの集合のように考えます。Gitで全てのコミット(訳注:commitとは変更を記録・保存するGitの操作。詳細は後の章を参照)をするとき、もしくはプロジェクトの状態を保存するとき、Gitは基本的に、その時の全てのファイルの状態のスナップショットを撮り(訳者注:意訳)、そのスナップショットへの参照を格納するのです。効率化のため、ファイルに変更が無い場合は、Gitはファイルを再格納せず、既に格納してある、以前の同一のファイルへのリンクを格納します。Gitは、むしろデータを図1-5のように考えます。 70 | 71 | Insert 18333fig0105.png 72 | 図1-5. Gitは時間を通じたプロジェクトのスナップショットとしてデータを格納します。 73 | 74 | これが、Gitと類似の全ての他のVCSsとの間の重要な違いです。ほとんどの他のシステムが以前の世代から真似してきた、ほとんど全てのバージョン管理のやり方(訳者注:aspectを意訳)を、Gitに見直させます。これは、Gitを、単純にVCSと言うより、その上に組み込まれた幾つかの途方も無くパワフルなツールを備えたミニ・ファイルシステムにしています。このやり方でデータを考えることで得られる利益の幾つかを、第3章のGit branchingを扱ったときに探求します。 75 | 76 | ### ほとんど全ての操作がローカル ### 77 | 78 | Gitのほとんどの操作は、ローカル・ファイルと操作する資源だけ必要とします。大体はネットワークの他のコンピューターからの情報は必要ではありません。ほとんどの操作がネットワーク遅延損失を伴うCVCSに慣れているのであれば、もっさりとしたCVCSに慣れているのであれば、このGitの速度は神業のように感じるでしょう(訳者注:直訳は「このGitの側面はスピードの神様がこの世のものとは思えない力でGitを祝福したと考えさせるでしょう」)。プロジェクトの履歴は丸ごとすぐそこのローカル・ディスクに保持しているので、大概の操作はほぼ瞬時のように見えます。 79 | 80 | 例えば、プロジェクトの履歴を閲覧するために、Gitはサーバーに履歴を取得しに行って表示する必要がありません。直接にローカル・データベースからそれを読むだけです。これは、プロジェクトの履歴をほとんど即座に知るということです。もし、あるファイルの現在のバージョンと、そのファイルの1ヶ月前の間に導入された変更点を知りたいのであれば、Gitは、遠隔のサーバーに差分を計算するように問い合わせたり、ローカルで差分を計算するために遠隔サーバーからファイルの古いバージョンを持ってくる代わりに、1か月前のファイルを調べてローカルで差分の計算を行なえます。 81 | 82 | これはまた、オフラインであるか、VPNから切り離されていたとしても、出来ない事は非常に少ないことを意味します。もし、飛行機もしくは列車に乗ってちょっとした仕事をしたいとしても、アップロードするためにネットワーク接続し始めるまで、楽しくコミットできます。もし、帰宅してVPNクライアントを適切に作動させられないとしても、さらに作業ができます。多くの他のシステムでは、それらを行なう事は、不可能であるか苦痛です。例えばPerforceにおいては、サーバーに接続できないときは、多くの事が行なえません。SubversionとCVSにおいては、ファイルの編集はできますが、データベースに変更をコミットできません(なぜならば、データベースがオフラインだからです)。このことは巨大な問題に思えないでしょうが、実に大きな違いを生じうることに驚くでしょう。 83 | 84 | ### Gitは完全性を持つ ### 85 | 86 | Gitの全てのものは、格納される前にチェックサムが取られ、その後、そのチェックサムで照合されます。これは、Gitがそれに関して感知することなしに、あらゆるファイルの内容を変更することが不可能であることを意味します。この機能は、Gitの最下層に組み込まれ、またGitの哲学に不可欠です。Gitがそれを感知できない状態で、転送中に情報を失う、もしくは壊れたファイルを取得することはありません。 87 | 88 | Gitがチェックサム生成に用いる機構は、SHA-1ハッシュと呼ばれます。これは、16進数の文字(0-9とa-f)で構成された40文字の文字列で、ファイルの内容もしくはGit内のディレクトリ構造を元に計算されます。SHA-1ハッシュは、このようなもののように見えます: 89 | 90 | 24b9da6552252987aa493b52f8696cd6d3b00373 91 | 92 | Gitはハッシュ値を大変よく利用するので、Gitのいたるところで、これらのハッシュ値を見ることでしょう。事実、Gitはファイル名ではなく、ファイル内容のハッシュ値によってアドレスが呼び出されるGitデータベースの中に全てを格納しています。 93 | 94 | ### Gitは通常はデータを追加するだけ ### 95 | 96 | Gitで行動するとき、ほとんど全てはGitデータベースにデータを追加するだけです。システムにいかなる方法でも、UNDO不可能なこと、もしくはデータを消させることをさせるのは、大変難しいです。あらゆるVCSと同様に、まだコミットしていない変更は失ったり、台無しにできたりします。しかし、スナップショットをGitにコミットした後は、特にもし定期的にデータベースを他のリポジトリにプッシュ(訳注:pushはGitで管理するあるリポジトリのデータを、他のリポジトリに転送する操作。詳細は後の章を参照)していれば、変更を失うことは大変難しくなります。 97 | 98 | 激しく物事をもみくちゃにする危険なしに試行錯誤を行なえるため、これはGitの利用を喜びに変えます。Gitがデータをどのように格納しているのかと失われたように思えるデータをどうやって回復できるのかについての、より詳細な解説に関しては、第9章を参照してください。 99 | 100 | ### 三つの状態 ### 101 | 102 | 今、注意してください。もし学習プロセスの残りをスムーズに進めたいのであれば、これはGitに関して覚えておく主要な事です。Gitは、ファイルが帰属する、コミット済、修正済、ステージ済の、三つの主要な状態を持ちます。コミット済は、ローカル・データベースにデータが安全に格納されていることを意味します。修正済は、ファイルに変更を加えていますが、データベースにそれがまだコミットされていないことを意味します。ステージ済は、次のスナップショットのコミットに加えるために、現在のバージョンの修正されたファイルに印をつけている状態を意味します。 103 | 104 | このことは、Gitプロジェクト(訳者注:ディレクトリ内)の、Gitディレクトリ、作業ディレクトリ、ステージング・エリアの三つの主要な部分(訳者注:の理解)に導きます。 105 | 106 | Insert 18333fig0106.png 107 | 図1-6. 作業ディレクトリ、ステージング・エリア、Gitディレクトリ 108 | 109 | Gitディレクトリは、プロジェクトのためのメタデータ(訳者注:Gitが管理するファイルやディレクトリなどのオブジェクトの要約)とオブジェクトのデータベースがあるところです。これは、Gitの最も重要な部分で、他のコンピューターからリポジトリをクローン(訳者注:コピー元の情報を記録した状態で、Gitリポジトリをコピーすること)したときに、コピーされるものです。 110 | 111 | 作業ディレクトリは、プロジェクトの一つのバージョンの単一チェックアウトです。これらのファイルはGitディレクトリの圧縮されたデータベースから引き出されて、利用するか修正するためにディスクに配置されます。 112 | 113 | ステージング・エリアは、普通はGitディレクトリに含まれる、次のコミットに何が含まれるかに関しての情報を蓄えた一つの単純なファイルです。ときどきインデックスのように引き合いにだされますが、ステージング・エリアとして呼ばれることが基本になりつつあります。 114 | 115 | 基本的なGitのワークフローは、このような風に進みます: 116 | 117 | 1. 作業ディレクトリのファイルを修正します。 118 | 2. 修正されたファイルのスナップショットをステージング・エリアに追加して、ファイルをステージします。 119 | 3. コミットします。(訳者注:Gitでは)これは、ステージング・エリアにあるファイルを取得し、永久不変に保持するスナップショットとしてGitディレクトリに格納することです。 120 | 121 | もしファイルの特定のバージョンがGitディレクトリの中にあるとしたら、コミット済だと見なされます。もし修正されていて、ステージング・エリアに加えられていれば、ステージ済です。そして、チェックアウトされてから変更されましたが、ステージされていないとするなら、修正済です。第2章では、これらの状態と、どうやってこれらを利用をするか、もしくは完全にステージ化部分を省略するかに関してより詳しく学習します。 122 | 123 | ## Gitのインストール ## 124 | 125 | 少しGitを使う事に入りましょう。何よりも最初に、Gitをインストールしなければなりません。幾つもの経路で入手することができ、主要な二つの方法のうちの一つはソースからインストールすることで、もう一つはプラットフォームに応じて存在するパッケージをインストールすることです。 126 | 127 | ### ソースからのインストール ### 128 | 129 | もし可能であれば、もっとも最新のバージョンを入手できるので、一般的にソースからGitをインストールするのが便利です。Gitのそれぞれのバージョンは、実用的なユーザー・インターフェイスの向上が含まれており、もしソースからソフトウェアをコンパイルすることに違和感を感じないのであれば、最新バージョンを入手することは、大抵は最も良い経路になります。また、多くのLinuxディストリビューションがとても古いパッケージを収録している事は良くあることであり、最新のディストリビューションを使っているか、バックポート(訳者注:最新のパッケージを古いディストリビューションで使えるようにする事)をしていない限りは、ソースからのインストールがベストな選択になるでしょう。 130 | 131 | Gitをインストールするためには、Gitが依存するライブラリーである、curl、zlib、openssl、expat、libiconvを入手する必要があります。例えば、もし(Fedoraなどで)yumか(Debianベースのシステムなどで)apt-getが入ったシステムを使っているのであれば、これらのコマンドの一つを依存対象の全てをインストールするのに使う事ができます: 132 | 133 | $ yum install curl-devel expat-devel gettext-devel \ 134 | openssl-devel zlib-devel 135 | 136 | $ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \ 137 | libz-dev libssl-dev 138 | 139 | 全ての必要な依存対象を持っているのであれば、先に進んでGitのウェブサイトから最新版のスナップショットを持ってくる事ができます: 140 | 141 | http://git-scm.com/download 142 | 143 | そして、コンパイルしてインストールします: 144 | 145 | $ tar -zxf git-1.7.2.2.tar.gz 146 | $ cd git-1.7.2.2 147 | $ make prefix=/usr/local all 148 | $ sudo make prefix=/usr/local install 149 | 150 | また、Gitのインストール後、アップデートでGitを通して最新版のGitを得ることができます。 151 | 152 | $ git clone git://git.kernel.org/pub/scm/git/git.git 153 | 154 | ### Linuxにインストール ### 155 | 156 | バイナリのインストーラーを通じてLinux上にGitをインストールしたいのであれば、大抵はディストリビューションに付属する基本的なパッケージ・マネジメント・ツールを使って、それを行なう事ができます。もしFedoraを使っているのであれば、yumを使う事が出来ます: 157 | 158 | $ yum install git-core 159 | 160 | もしくは、もしUbuntuのようなDebianベースのディストリュビューションを使っているのであれば、apt-getをやってみましょう: 161 | 162 | $ apt-get install git 163 | 164 | ### Macにインストール ### 165 | 166 | MacにGitをインストールするには2つの簡単な方法があります。もっとも簡単な方法は、グラフィカルなGitインストーラーを使うことで、このGitインストーラーはGoogle Codeのページ(図1-7参照)からダウンロードすることができます: 167 | 168 | http://code.google.com/p/git-osx-installer 169 | 170 | Insert 18333fig0107.png 171 | 図 1-7. Git OS X installer 172 | 173 | もう一つの主要な方法は、MacPorts (`http://www.macports.org`) からGitをインストールすることです。MacPortsをインストールした状態であれば、Gitを以下のようにインストールできます。 174 | 175 | $ sudo port install git-core +svn +doc +bash_completion +gitweb 176 | 177 | 全てのvariantsを追加する必要はありませんが、SubversionのリポジトリでGitを使う必要がまだあるなら、恐らく+svnを含めないといけないでしょう(第8章参照)。 178 | 179 | ### Windowsにインストール ### 180 | 181 | WindowsにGitをインストールするのはとても簡単です。msysGitプロジェクトは、より簡単なインストール手続きの一つを備えています。GitHubのページから、単純にインストーラーのexeファイルをダウンロードをし、実行してください: 182 | 183 | http://msysgit.github.com/ 184 | 185 | インストール後、コマンドライン版(後で役に立つSSHクライアントを含む)とスタンダードGUI版の両方を使う事ができます。 186 | 187 | Windows利用時の注意点: この本で紹介されている複雑なコマンドを使えるので、GitはmsysGit shell(Unixスタイル)で使うようにしましょう。Windowsのシェル/コマンドラインコンソールを使わざるを得ない場合、空白を含むパラメーターを囲むための記号はダブルクオーテーション(シングルクォーテーションは使えない)を使用する必要があります。同様に、サーカムフレックス記号(^)が行末に来る場合はダブルクオーテーションで囲まなければなりません。同記号はWindowsにおいて「次行に続く」を意味する記号だからです。 188 | 189 | ## 最初のGitの構成 ## 190 | 191 | 今や、Gitがシステムにあります。Git環境をカスタマイズするためにしたい事が少しはあることでしょう。アップグレードの度についてまわるので、たった一度でそれらを終わらすべきでしょう。またそれらは、またコマンドを実行することによっていつでも変更することができます。 192 | 193 | Gitには、git configと呼ばれるツールが付属します。これで、どのようにGitが見えて機能するかの全ての面を制御できる設定変数を取得し、設定することができます。これらの変数は三つの異なる場所に格納されうります: 194 | 195 | * `/etc/gitconfig` file: システム上の全てのユーザーと全てのリポジトリに対する設定値を保持します。もし`--system`オプションを`git config`に指定すると、明確にこのファイルに読み書きを行ないます。 196 | * `~/.gitconfig` file: 特定のユーザーに対する設定値を保持します. `--global`オプションを指定することで、Gitに、明確にこのファイルに読み書きを行なわせることができます。 197 | * 現在使っている、あらゆるリポジトリのGitディレクトリの設定ファイル(`.git/config`のことです): 特定の単一リポジトリに対する設定値を保持します。それぞれのレベルの値は以前のレベルの値を上書きするため、`.git/config`の中の設定値は`/etc/gitconfig`の設定値に優先されます。 198 | 199 | Windows環境下では、Gitは`$HOME`ディレクトリ(環境変数`USERPROFILE`で指定)の中の`.gitconfig`ファイルを検索に行きます。`$HOME`ディレクトリはほとんどの場合 `C:\Documents and Settings\$USER` か `C:\Users\$USER` のいずれかです($USERは環境変数`USERNAME`で指定)。また、インストーラー時にWindowsシステムにGitをインストールすると決めたところにある、MSysのルートとの相対位置であったとしても、 /etc/gitconfigも見に行きます。 200 | 201 | ### 個人の識別情報 ### 202 | 203 | Gitをインストールしたときに最初にすべきことは、ユーザー名とE-mailアドレスを設定することです。全てのGitのコミットはこの情報を用いるため、これは重要で、次々とまわすコミットに永続的に焼き付けられます: 204 | 205 | $ git config --global user.name "John Doe" 206 | $ git config --global user.email johndoe@example.com 207 | 208 | また、もし`--global`オプションを指定するのであれば、Gitはその後、そのシステム上で行なう(訳者注:あるユーザーの)全ての操作に対して常にこの情報を使うようになるため、この操作を行なう必要はたった一度だけです。もし、違う名前とE-mailアドレスを特定のプロジェクトで上書きしたいのであれば、そのプロジェクトの(訳者注:Gitディレクトリの)中で、`--global`オプション無しでこのコマンドを実行することができます。 209 | 210 | ### エディター ### 211 | 212 | 今や、個人の識別情報が設定され、Gitがメッセージのタイプをさせる必要があるときに使う、標準のテキストエディターを設定できます。標準では、Gitはシステムのデフォルト・エディターを使います。これは大抵の場合、ViかVimです。Emacsのような違うテキスト・エディターを使いたい場合は、次のようにします: 213 | 214 | $ git config --global core.editor emacs 215 | 216 | ### diffツール ### 217 | 218 | 設定したいと思われる、その他の便利なオプションは、マージ(訳者注:複数のリポジトリを併合すること)時の衝突を解決するために使う、標準のdiffツールです。vimdiffを使いたいとします: 219 | 220 | $ git config --global merge.tool vimdiff 221 | 222 | Gitはkdiff3、tkdiff、meld、xxdiff、emerge、vimdiff、gvimdiff、ecmerge、opendiffを確かなマージ・ツールとして扱えます。カスタム・ツールもまた設定できますが、これをする事に関しての詳細な情報は第7章を参照してください。 223 | 224 | ### 設定の確認 ### 225 | 226 | 設定を確認したい場合は、その時点でGitが見つけられる全ての設定を一覧するコマンドである`git config --list`を使う事ができます: 227 | 228 | $ git config --list 229 | user.name=Scott Chacon 230 | user.email=schacon@gmail.com 231 | color.status=auto 232 | color.branch=auto 233 | color.interactive=auto 234 | color.diff=auto 235 | ... 236 | 237 | Gitは異なったファイル(例えば`/etc/gitconfig`と`~/.gitconfig`)から同一のキーを読み込むため、同一のキーを1度以上見ることになるでしょう。この場合、Gitは見つけたそれぞれ同一のキーに対して最後の値を用います。 238 | 239 | また、Gitに設定されている特定のキーの値を、`git config {key}`をタイプすることで確認することができます: 240 | 241 | $ git config user.name 242 | Scott Chacon 243 | 244 | ## ヘルプを見る ## 245 | 246 | もし、Gitを使っている間は助けがいつも必要なら、あらゆるGitコマンドのヘルプのマニュアル・ページ(manpage)を参照する3種類の方法があります。 247 | 248 | $ git help 249 | $ git --help 250 | $ man git- 251 | 252 | 例えば、configコマンドのヘルプのmanpageを次のコマンドを走らせることで見ることができます。 253 | 254 | $ git help config 255 | 256 | これらのコマンドは、オフラインのときでさえ、どこでも見る事ができるので、すばらしいです。 257 | もしmanpageとこの本が十分でなく、人の助けが必要であれば、フリーノードIRCサーバー(irc.freenode.net)の`#git`もしくは`#github`チャンネルにアクセスしてみてください。これらのチャンネルはいつも、全員がGitに関してとても知識があり、よく助けてくれようとする数百人の人々でいっぱいです。 258 | 259 | ## まとめ ## 260 | 261 | Gitとは何か、どのように今まで使われてきた他のCVCSと異なるのかについて、基本的な理解ができたはずです。また、今や個人情報の設定ができた、システムに稼動するバージョンのGitがあるはずです。今や、本格的にGitの基本を学習するときです。 262 | -------------------------------------------------------------------------------- /de/README.md: -------------------------------------------------------------------------------- 1 | # Deutsche Übersetzung # 2 | 3 | Die deutsche Übersetzung wird im Repository progit-de/progit verwaltet. Wenn Du an der deutschen Übersetzung mitarbeiten willst, dann melde dich am besten bei uns. Du kannst dazu einen Issue im Repository progit-de/progit erzeugen. Wir werden Dir dann einen Vorschlag machen, wie Du uns am besten helfen kannst. Der Workflow an sich ist unter Workflow beschrieben. Ein Status der Übersetzung der jeweiligen Kapitel findest Du unter "Status der Übersetzung". 4 | 5 | Du kannst auch sofort mit der Übersetzung beginnen, allerdings besteht dann das Risiko, dass ein Kapitel doppelt übersetzt oder überarbeitet wird. Eventuell war Deine Arbeit dann umsonst. 6 | 7 | ## Workflow ## 8 | 9 | Um am Projekt mitzuarbeiten, erstellst Du am besten erst einmal ein Fork des Repositorys progit-de/progit unter Deinem Account ("Fork this repo" Button). 10 | 11 | In diesem Projekt kannst Du dich nun austoben und Deinen Beitrag zur Übersetzung leisten. 12 | 13 | Beispielhaftes Vorgehen: 14 | 15 | git clone git@github.com:deinname/progit.git 16 | 17 | # Trage das deutsche Repository ebenso als Remote ein 18 | git remote add progit-de git@github.com:progit-de/progit.git 19 | 20 | # Lokalen Branch anlegen und daran arbeiten 21 | git checkout -b Chapter71 22 | git commit -m "[de] Fix headings in chapter 7.1" 23 | 24 | # Wenn Deine Arbeit in sich abgeschlossen ist, kannst Du die Ergebnisse pushen. 25 | # Vor einem Push solltest Du allerdings prüfen, ob sich zwischenzeitlich 26 | # das Repository git@github.com:progit-de/progit.git aktualisiert hat. 27 | git fetch progit-de 28 | 29 | # Falls es sich aktualisiert hat, führe einen Rebase aus und 30 | # behebe die ggf. aufgetretenden Konflikte 31 | git rebase progit-de/next 32 | 33 | # Pushe Deine Ergebnisse in Dein Github Repository 34 | git push origin 35 | 36 | Informiere uns jetzt mit einem Pull Request unter Github, dass Dein Branch fertiggestellt und bereit zum mergen ist. 37 | 38 | Wir werden dann Dein Ergebnis prüfen bzw. ein weiterer Helfer wird Dein Ergebnis reviewen. Das kann dazu führen, dass Du Deine Übersetzung noch überarbeiten musst. Siehe das Review als positive Hilfestellung damit das Ergebnis insgesamt besser wird und nimm die Kritik nicht negativ auf. Danach werden wir Deine Arbeit übernehmen und schließlich in den Hauptzweig unter progit/progit einpflegen. 39 | 40 | ### Commit Nachrichten ### 41 | 42 | Die Commit Nachrichten beginnen mit einem vorangestellten [de], dann ein Leerzeichen und dann die eigentliche Commit Nachricht. Dann eine leere Zeile und eine erweiterte Beschreibung bzw. eine Beschreibung warum der Commit durchgeführt wurde. 43 | 44 | Beispiel: 45 | 46 | [de] Remove comment for Figure 7-1 because it is shown on git-scm.com 47 | 48 | - Bla bla blub 49 | 50 | ## Vorgaben für das Übersetzen ## 51 | 52 | ### Allgemein ### 53 | 54 | * Falls Du einen Abschnitt übersetzen willst, der noch nicht übersetzt wurde, so kopiere den aktuellen englischen Text in die deutsche Übersetzung. Setze um den englischen Text die Kommentarzeichen: . Bitte beachte, dass in Kommentaren die Folge "--" (ohne Anführungszeichen) nicht vorkommen darf. Falls diese im englischen Orginal enthalten ist, so trenne die zwei Minus durch ein Leerzeichen. Andernfalls wird der Kommentar bei den zwei Minus beendet. 55 | 56 | * Falls Du einen Abschnitt überarbeiten willst, so aktualisiere zu erst den englischen Text in der deutschen Übersetzung. Der englische Text sollte immer als Kommentar enthalten sein. Falls nicht, so füge ihn bitte ein (siehe oben). Danach kannst Du die eigentliche Überarbeitung starten. 57 | 58 | * Der englische Orginaltext ist immer über jedem deutschen Absatz als Kommentar eingefügt. Jeder Abschnitt inklusive Überschrift muss als englischer Orginaltext als Kommentar enthalten sein. Eingerückte Code-Zeilen oder Git Befehle werden nicht übersetzt und nicht zusätzlich als Kommentar ausgeführt. 59 | 60 | ### Rechtschreibung und Grammatik ### 61 | 62 | * Der Leser wird mit "Du" angesprochen und das "Du" wird auch groß geschrieben. Bitte beachte dies auch bei Possessivpronomen, wie z.B. Dein, Deine. Siehe hierzu auch http://www.duden.de/sprachwissen/sprachratgeber/gross-oder-kleinschreibung-von--em-du-du--em--und--em-ihr-ihr--em--1 63 | 64 | * Bei englischen Nomen, die auf "y" enden, wird beim Plural nur ein einzelnes "s" angehängt (kein ies). Siehe hierzu auch http://www.duden.de/sprachwissen/sprachratgeber/crashkurs--in-25-schritten-zur-neuen-rechtschreibung 65 | 66 | ### Übersetzung von Git spezifischen Begriffen ### 67 | 68 | Wir versuchen die englischen Fachbegriffe, die in der Welt von Git existieren, zu benutzen. Zusätzlich versuchen wir aber immer, dass ein neu eingeführter Git-spezifischer Begriff, auch auf Deutsch erklärt wird. 69 | Wir bevorzugen die englischen Fachbegriffe, da sie in zahlreichen Befehlen und Ausgaben von Git verwendet werden. 70 | 71 | ## Status der Übersetzung ## 72 | 73 | Bitte den Status nicht aktualisieren. Dies übernimmt ein Maintainer. 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 |
    KapitelÜbersetzung vorhandenEnglischer Orginaltext vorhandenEnglischer Orginaltext in Kommentaren vorhandenStatus
    1JaNeinJaOk
    1.1JaNeinJaOk
    1.2JaNeinJaOk
    1.3JaNeinJaOk
    1.4JaNeinJaOk
    1.5JaNeinJaOk
    1.6JaNeinJaOk
    1.7JaNeinJaOk
    2JaNeinJaOk
    2.1JaNeinJaOk
    2.2JaNeinJaOk
    2.3JaNeinJaOk
    2.4JaNeinJaOk
    2.5JaNeinJaOk
    2.6JaNeinJaOk
    2.7JaNeinJaOk
    2.8JaNeinJaOk
    3JaNeinJaOk
    3.1JaNeinJaOk
    3.2JaNeinJaTeilweise Übersetzung doppelt, Rechtschreibfehler oder Grammatikfehler
    3.3JaNeinJaTeilweise Übersetzung doppelt, Rechtschreibfehler oder Grammatikfehler
    3.4JaNeinJaTeilweise Übersetzung doppelt, Rechtschreibfehler oder Grammatikfehler
    3.5JaNeinJaTeilweise Übersetzung doppelt, Rechtschreibfehler oder Grammatikfehler
    3.6JaNeinJaTeilweise Übersetzung doppelt, Rechtschreibfehler oder Grammatikfehler
    3.7JaNeinJaTeilweise Übersetzung doppelt, Rechtschreibfehler oder Grammatikfehler
    4JaNeinJaRechtschreibfehler oder Grammatikfehler
    4.1JaNeinJaRechtschreibfehler oder Grammatikfehler
    4.2JaNeinJaRechtschreibfehler oder Grammatikfehler
    4.3JaNeinJaRechtschreibfehler oder Grammatikfehler
    4.4JaNeinJaRechtschreibfehler oder Grammatikfehler
    4.5JaNeinJaReview notwendig
    4.6JaNeinJaReview notwendig
    4.7JaNeinJaReview notwendig
    4.8JaNeinJaReview notwendig
    4.9JaNeinJaReview notwendig
    4.10JaNeinJaReview notwendig
    4.11JaNeinJaReview notwendig
    5JaNeinJaReview notwendig
    5.1JaNeinJaReview notwendig
    5.2JaNeinJaReview notwendig
    5.3JaNeinJaReview notwendig
    5.4JaNeinJaReview notwendig
    6JaNeinJaReview notwendig
    6.1JaNeinJaReview notwendig
    6.2JaNeinJaReview notwendig
    6.3JaNeinJaReview notwendig
    6.4NeinJaNeinÜbersetzung fehlt
    6.5NeinJaNeinÜbersetzung fehlt
    6.6NeinJaNeinÜbersetzung fehlt
    6.7NeinJaNeinÜbersetzung fehlt
    6.8NeinJaNeinÜbersetzung fehlt
    7JaNeinJaOk
    7.1JaNeinJaOk
    7.2JaNeinJaReview notwendig
    7.3JaNeinJaReview notwendig
    7.4JaNeinJaReview notwendig
    7.5JaNeinJaReview notwendig
    8JaNeinJaOk
    8.1JaNeinJaOk
    8.2JaNeinJaFast vollständig übersetzt. Aktualisierung notwendig.
    8.3JaNeinJaOk
    9JaNeinJaReview notwendig
    9.1JaNeinJaReview notwendig
    9.2JaNeinJaReview notwendig
    9.3JaNeinJaReview notwendig
    9.4TeilweiseNeinJaReview notwendig
    9.5JaNeinJaReview notwendig
    9.6JaNeinJaReview notwendig
    9.7JaNeinJaReview notwendig
    9.8JaNeinJaReview notwendig
    Index of CommandsNeinNeinNeinÜbersetzung fehlt
    581 | -------------------------------------------------------------------------------- /figures-dia/fig0310.dia: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | #A4# 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | #C0# 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | #C1# 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | #C2# 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | #master# 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | -------------------------------------------------------------------------------- /pt-br/figures-dia/fig0501.dia: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | #A4# 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | #desenvolvedor# 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | #desenvolvedor# 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | #desenvolvedor# 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | #Repositório 426 | compartilhado# 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | --------------------------------------------------------------------------------