commonmarker 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of commonmarker might be problematic. Click here for more details.

Files changed (501) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -2
  3. data/README.md +67 -42
  4. data/Rakefile +22 -2
  5. data/commonmarker.gemspec +13 -9
  6. data/ext/commonmarker/cmark/api_test/main.c +35 -0
  7. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeError.log +12 -12
  8. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeOutput.log +141 -141
  9. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/main.c.o +0 -0
  10. data/ext/commonmarker/cmark/build/api_test/api_test +0 -0
  11. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/houdini_html_u.c.o +0 -0
  12. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/iterator.c.o +0 -0
  13. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/houdini_html_u.c.o +0 -0
  14. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/iterator.c.o +0 -0
  15. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_html_u.c.o +0 -0
  16. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/iterator.c.o +0 -0
  17. data/ext/commonmarker/cmark/build/src/cmark +0 -0
  18. data/ext/commonmarker/cmark/build/src/libcmark.0.19.0.dylib +0 -0
  19. data/ext/commonmarker/cmark/build/src/libcmark.a +0 -0
  20. data/ext/commonmarker/cmark/build/src/libcmark.dylib +0 -0
  21. data/ext/commonmarker/cmark/src/houdini_html_u.c +26 -13
  22. data/ext/commonmarker/cmark/src/iterator.c +2 -2
  23. data/ext/commonmarker/cmark/test/__pycache__/cmark.cpython-34.pyc +0 -0
  24. data/ext/commonmarker/cmark/test/__pycache__/normalize.cpython-34.pyc +0 -0
  25. data/ext/commonmarker/cmark/test/cmark.pyc +0 -0
  26. data/ext/commonmarker/cmark/test/normalize.pyc +0 -0
  27. data/ext/commonmarker/commonmarker.c +276 -3
  28. data/ext/commonmarker/extconf.rb +3 -1
  29. data/lib/commonmarker.rb +70 -360
  30. data/lib/commonmarker/config.rb +1 -1
  31. data/lib/commonmarker/renderer.rb +91 -0
  32. data/lib/commonmarker/renderer/html_renderer.rb +149 -0
  33. data/lib/commonmarker/version.rb +1 -1
  34. data/test/benchinput.md +148414 -0
  35. data/test/benchmark.rb +13 -9
  36. data/test/progit/Gemfile +5 -0
  37. data/test/progit/README.md +9 -0
  38. data/test/progit/README.original.md +70 -0
  39. data/test/progit/Rakefile +285 -0
  40. data/test/progit/ar/01-introduction/01-chapter1.markdown +264 -0
  41. data/test/progit/ar/02-git-basics/01-chapter2.markdown +1124 -0
  42. data/test/progit/ar/NOTES +18 -0
  43. data/test/progit/ar/README +14 -0
  44. data/test/progit/az/01-introduction/01-chapter1.markdown +257 -0
  45. data/test/progit/az/02-git-basics/01-chapter2.markdown +1127 -0
  46. data/test/progit/az/03-git-branching/01-chapter3.markdown +598 -0
  47. data/test/progit/az/04-git-server/01-chapter4.markdown +861 -0
  48. data/test/progit/az/05-distributed-git/01-chapter5.markdown +897 -0
  49. data/test/progit/az/06-git-tools/01-chapter6.markdown +1126 -0
  50. data/test/progit/az/07-customizing-git/01-chapter7.markdown +937 -0
  51. data/test/progit/az/08-git-and-other-scms/01-chapter8.markdown +690 -0
  52. data/test/progit/az/09-git-internals/01-chapter9.markdown +977 -0
  53. data/test/progit/be/01-introduction/01-chapter1.markdown +257 -0
  54. data/test/progit/be/02-git-basics/01-chapter2.markdown +1126 -0
  55. data/test/progit/ca/01-introduction/01-chapter1.markdown +257 -0
  56. data/test/progit/ca/README.txt +1 -0
  57. data/test/progit/couchapp/Makefile +41 -0
  58. data/test/progit/couchapp/Readme.md +17 -0
  59. data/test/progit/couchapp/_id +1 -0
  60. data/test/progit/couchapp/shows/chapter.js +14 -0
  61. data/test/progit/couchapp/templates/foot.html +7 -0
  62. data/test/progit/couchapp/templates/head.html +51 -0
  63. data/test/progit/couchapp/vendor/markdown/showdown.js +420 -0
  64. data/test/progit/couchapp/vendor/mustache.js/mustache.js +302 -0
  65. data/test/progit/cs/01-introduction/01-chapter1.markdown +259 -0
  66. data/test/progit/cs/02-git-basics/01-chapter2.markdown +1225 -0
  67. data/test/progit/cs/03-git-branching/01-chapter3.markdown +606 -0
  68. data/test/progit/cs/04-git-server/01-chapter4.markdown +871 -0
  69. data/test/progit/cs/05-distributed-git/01-chapter5.markdown +914 -0
  70. data/test/progit/cs/06-git-tools/01-chapter6.markdown +1167 -0
  71. data/test/progit/cs/07-customizing-git/01-chapter7.markdown +940 -0
  72. data/test/progit/cs/08-git-and-other-scms/01-chapter8.markdown +700 -0
  73. data/test/progit/cs/09-git-internals/01-chapter9.markdown +1014 -0
  74. data/test/progit/de/01-introduction/01-chapter1.markdown +445 -0
  75. data/test/progit/de/02-git-basics/01-chapter2.markdown +1589 -0
  76. data/test/progit/de/03-git-branching/01-chapter3.markdown +964 -0
  77. data/test/progit/de/04-git-server/01-chapter4.markdown +1337 -0
  78. data/test/progit/de/05-distributed-git/01-chapter5.markdown +1329 -0
  79. data/test/progit/de/06-git-tools/01-chapter6.markdown +1502 -0
  80. data/test/progit/de/07-customizing-git/01-chapter7.markdown +1361 -0
  81. data/test/progit/de/08-git-and-other-scms/01-chapter8.markdown +919 -0
  82. data/test/progit/de/09-git-internals/01-chapter9.markdown +1361 -0
  83. data/test/progit/de/README.md +626 -0
  84. data/test/progit/ebooks/cover.png +0 -0
  85. data/test/progit/en/01-introduction/01-chapter1.markdown +263 -0
  86. data/test/progit/en/02-git-basics/01-chapter2.markdown +1228 -0
  87. data/test/progit/en/03-git-branching/01-chapter3.markdown +606 -0
  88. data/test/progit/en/04-git-server/01-chapter4.markdown +871 -0
  89. data/test/progit/en/05-distributed-git/01-chapter5.markdown +914 -0
  90. data/test/progit/en/06-git-tools/01-chapter6.markdown +1150 -0
  91. data/test/progit/en/07-customizing-git/01-chapter7.markdown +940 -0
  92. data/test/progit/en/08-git-and-other-scms/01-chapter8.markdown +700 -0
  93. data/test/progit/en/09-git-internals/01-chapter9.markdown +983 -0
  94. data/test/progit/eo/01-introduction/01-chapter1.markdown +257 -0
  95. data/test/progit/eo/02-git-basics/01-chapter2.markdown +1171 -0
  96. data/test/progit/epub/ProGit.css +28 -0
  97. data/test/progit/epub/title.png +0 -0
  98. data/test/progit/es-ni/01-introduction/01-chapter1.markdown +257 -0
  99. data/test/progit/es-ni/02-git-basics/01-chapter2.markdown +1127 -0
  100. data/test/progit/es/01-introduction/01-chapter1.markdown +262 -0
  101. data/test/progit/es/02-git-basics/01-chapter2.markdown +1165 -0
  102. data/test/progit/es/03-git-branching/01-chapter3.markdown +598 -0
  103. data/test/progit/es/04-git-server/01-chapter4.markdown +707 -0
  104. data/test/progit/es/05-distributed-git/01-chapter5.markdown +890 -0
  105. data/test/progit/es/06-git-tools/01-chapter6.markdown +1113 -0
  106. data/test/progit/es/07-customizing-git/01-chapter7.markdown +875 -0
  107. data/test/progit/es/08-git-and-other-scms/01-chapter8.markdown +686 -0
  108. data/test/progit/es/09-git-internals/01-chapter9.markdown +976 -0
  109. data/test/progit/es/NOTES +29 -0
  110. data/test/progit/es/README +3 -0
  111. data/test/progit/es/glosario-Benzirpi.txt +27 -0
  112. data/test/progit/es/omegat-Benzirpi.tmx +29075 -0
  113. data/test/progit/fa/01-introduction/01-chapter1.markdown +262 -0
  114. data/test/progit/fa/03-git-branching/01-chapter3.markdown +608 -0
  115. data/test/progit/fa/04-git-server/01-chapter4.markdown +872 -0
  116. data/test/progit/fa/NOTES.en-fa.md +143 -0
  117. data/test/progit/fa/README.md +7 -0
  118. data/test/progit/fi/01-introduction/01-chapter1.markdown +259 -0
  119. data/test/progit/fi/02-git-basics/01-chapter2.markdown +1171 -0
  120. data/test/progit/fi/NOTES +5 -0
  121. data/test/progit/figures-dia/fig0101.dia +617 -0
  122. data/test/progit/figures-dia/fig0102.dia +921 -0
  123. data/test/progit/figures-dia/fig0103.dia +1468 -0
  124. data/test/progit/figures-dia/fig0104.dia +1432 -0
  125. data/test/progit/figures-dia/fig0105.dia +1924 -0
  126. data/test/progit/figures-dia/fig0106.dia +562 -0
  127. data/test/progit/figures-dia/fig0201.dia +774 -0
  128. data/test/progit/figures-dia/fig0301.dia +2006 -0
  129. data/test/progit/figures-dia/fig0302.dia +2148 -0
  130. data/test/progit/figures-dia/fig0303.dia +719 -0
  131. data/test/progit/figures-dia/fig0304.dia +525 -0
  132. data/test/progit/figures-dia/fig0305.dia +622 -0
  133. data/test/progit/figures-dia/fig0306.dia +622 -0
  134. data/test/progit/figures-dia/fig0307.dia +719 -0
  135. data/test/progit/figures-dia/fig0308.dia +734 -0
  136. data/test/progit/figures-dia/fig0309.dia +831 -0
  137. data/test/progit/figures-dia/fig0310.dia +412 -0
  138. data/test/progit/figures-dia/fig0311.dia +493 -0
  139. data/test/progit/figures-dia/fig0312.dia +596 -0
  140. data/test/progit/figures-dia/fig0313.dia +774 -0
  141. data/test/progit/figures-dia/fig0314.dia +846 -0
  142. data/test/progit/figures-dia/fig0315.dia +787 -0
  143. data/test/progit/figures-dia/fig0316.dia +1078 -0
  144. data/test/progit/figures-dia/fig0317.dia +881 -0
  145. data/test/progit/figures-dia/fig0318.dia +968 -0
  146. data/test/progit/figures-dia/fig0319.dia +957 -0
  147. data/test/progit/figures-dia/fig0320.dia +1637 -0
  148. data/test/progit/figures-dia/fig0321.dia +1494 -0
  149. data/test/progit/figures-dia/fig0322.dia +1142 -0
  150. data/test/progit/figures-dia/fig0323.dia +1377 -0
  151. data/test/progit/figures-dia/fig0324.dia +1603 -0
  152. data/test/progit/figures-dia/fig0325.dia +2003 -0
  153. data/test/progit/figures-dia/fig0326.dia +2013 -0
  154. data/test/progit/figures-dia/fig0327.dia +687 -0
  155. data/test/progit/figures-dia/fig0328.dia +814 -0
  156. data/test/progit/figures-dia/fig0329.dia +793 -0
  157. data/test/progit/figures-dia/fig0330.dia +693 -0
  158. data/test/progit/figures-dia/fig0331.dia +1159 -0
  159. data/test/progit/figures-dia/fig0332.dia +1362 -0
  160. data/test/progit/figures-dia/fig0333.dia +1165 -0
  161. data/test/progit/figures-dia/fig0334.dia +1450 -0
  162. data/test/progit/figures-dia/fig0335.dia +994 -0
  163. data/test/progit/figures-dia/fig0336.dia +786 -0
  164. data/test/progit/figures-dia/fig0337.dia +1546 -0
  165. data/test/progit/figures-dia/fig0338.dia +1755 -0
  166. data/test/progit/figures-dia/fig0339.dia +1882 -0
  167. data/test/progit/figures-dia/fig0501.dia +456 -0
  168. data/test/progit/figures-dia/fig0502.dia +956 -0
  169. data/test/progit/figures-dia/fig0503.dia +915 -0
  170. data/test/progit/figures-dia/fig0504.dia +620 -0
  171. data/test/progit/figures-dia/fig0505.dia +744 -0
  172. data/test/progit/figures-dia/fig0506.dia +747 -0
  173. data/test/progit/figures-dia/fig0507.dia +895 -0
  174. data/test/progit/figures-dia/fig0508.dia +1122 -0
  175. data/test/progit/figures-dia/fig0509.dia +1243 -0
  176. data/test/progit/figures-dia/fig0510.dia +1240 -0
  177. data/test/progit/figures-dia/fig0511.dia +1201 -0
  178. data/test/progit/figures-dia/fig0512.dia +801 -0
  179. data/test/progit/figures-dia/fig0513.dia +1387 -0
  180. data/test/progit/figures-dia/fig0514.dia +1568 -0
  181. data/test/progit/figures-dia/fig0515.dia +1721 -0
  182. data/test/progit/figures-dia/fig0516.dia +997 -0
  183. data/test/progit/figures-dia/fig0517.dia +994 -0
  184. data/test/progit/figures-dia/fig0518.dia +1145 -0
  185. data/test/progit/figures-dia/fig0519.dia +992 -0
  186. data/test/progit/figures-dia/fig0520.dia +1240 -0
  187. data/test/progit/figures-dia/fig0521.dia +801 -0
  188. data/test/progit/figures-dia/fig0522.dia +922 -0
  189. data/test/progit/figures-dia/fig0523.dia +922 -0
  190. data/test/progit/figures-dia/fig0524.dia +1828 -0
  191. data/test/progit/figures-dia/fig0525.dia +2685 -0
  192. data/test/progit/figures-dia/fig0526.dia +717 -0
  193. data/test/progit/figures-dia/fig0527.dia +856 -0
  194. data/test/progit/figures-dia/fig0601.dia +790 -0
  195. data/test/progit/figures-dia/fig0702.dia +795 -0
  196. data/test/progit/figures-dia/fig0703.dia +795 -0
  197. data/test/progit/figures-dia/fig0901.dia +669 -0
  198. data/test/progit/figures-dia/fig0902.dia +834 -0
  199. data/test/progit/figures-dia/fig0903.dia +1483 -0
  200. data/test/progit/figures-dia/fig0904.dia +1728 -0
  201. data/test/progit/figures-dia/makeimages +25 -0
  202. data/test/progit/figures-source/progit.graffle +123108 -0
  203. data/test/progit/figures/18333fig0101-tn.png +0 -0
  204. data/test/progit/figures/18333fig0102-tn.png +0 -0
  205. data/test/progit/figures/18333fig0103-tn.png +0 -0
  206. data/test/progit/figures/18333fig0104-tn.png +0 -0
  207. data/test/progit/figures/18333fig0105-tn.png +0 -0
  208. data/test/progit/figures/18333fig0106-tn.png +0 -0
  209. data/test/progit/figures/18333fig0107-tn.png +0 -0
  210. data/test/progit/figures/18333fig0201-tn.png +0 -0
  211. data/test/progit/figures/18333fig0202-tn.png +0 -0
  212. data/test/progit/figures/18333fig0301-tn.png +0 -0
  213. data/test/progit/figures/18333fig0302-tn.png +0 -0
  214. data/test/progit/figures/18333fig0303-tn.png +0 -0
  215. data/test/progit/figures/18333fig0304-tn.png +0 -0
  216. data/test/progit/figures/18333fig0305-tn.png +0 -0
  217. data/test/progit/figures/18333fig0306-tn.png +0 -0
  218. data/test/progit/figures/18333fig0307-tn.png +0 -0
  219. data/test/progit/figures/18333fig0308-tn.png +0 -0
  220. data/test/progit/figures/18333fig0309-tn.png +0 -0
  221. data/test/progit/figures/18333fig0310-tn.png +0 -0
  222. data/test/progit/figures/18333fig0311-tn.png +0 -0
  223. data/test/progit/figures/18333fig0312-tn.png +0 -0
  224. data/test/progit/figures/18333fig0313-tn.png +0 -0
  225. data/test/progit/figures/18333fig0314-tn.png +0 -0
  226. data/test/progit/figures/18333fig0315-tn.png +0 -0
  227. data/test/progit/figures/18333fig0316-tn.png +0 -0
  228. data/test/progit/figures/18333fig0317-tn.png +0 -0
  229. data/test/progit/figures/18333fig0318-tn.png +0 -0
  230. data/test/progit/figures/18333fig0319-tn.png +0 -0
  231. data/test/progit/figures/18333fig0320-tn.png +0 -0
  232. data/test/progit/figures/18333fig0321-tn.png +0 -0
  233. data/test/progit/figures/18333fig0322-tn.png +0 -0
  234. data/test/progit/figures/18333fig0323-tn.png +0 -0
  235. data/test/progit/figures/18333fig0324-tn.png +0 -0
  236. data/test/progit/figures/18333fig0325-tn.png +0 -0
  237. data/test/progit/figures/18333fig0326-tn.png +0 -0
  238. data/test/progit/figures/18333fig0327-tn.png +0 -0
  239. data/test/progit/figures/18333fig0328-tn.png +0 -0
  240. data/test/progit/figures/18333fig0329-tn.png +0 -0
  241. data/test/progit/figures/18333fig0330-tn.png +0 -0
  242. data/test/progit/figures/18333fig0331-tn.png +0 -0
  243. data/test/progit/figures/18333fig0332-tn.png +0 -0
  244. data/test/progit/figures/18333fig0333-tn.png +0 -0
  245. data/test/progit/figures/18333fig0334-tn.png +0 -0
  246. data/test/progit/figures/18333fig0335-tn.png +0 -0
  247. data/test/progit/figures/18333fig0336-tn.png +0 -0
  248. data/test/progit/figures/18333fig0337-tn.png +0 -0
  249. data/test/progit/figures/18333fig0338-tn.png +0 -0
  250. data/test/progit/figures/18333fig0339-tn.png +0 -0
  251. data/test/progit/figures/18333fig0401-tn.png +0 -0
  252. data/test/progit/figures/18333fig0402-tn.png +0 -0
  253. data/test/progit/figures/18333fig0403-tn.png +0 -0
  254. data/test/progit/figures/18333fig0404-tn.png +0 -0
  255. data/test/progit/figures/18333fig0405-tn.png +0 -0
  256. data/test/progit/figures/18333fig0406-tn.png +0 -0
  257. data/test/progit/figures/18333fig0407-tn.png +0 -0
  258. data/test/progit/figures/18333fig0408-tn.png +0 -0
  259. data/test/progit/figures/18333fig0409-tn.png +0 -0
  260. data/test/progit/figures/18333fig0410-tn.png +0 -0
  261. data/test/progit/figures/18333fig0411-tn.png +0 -0
  262. data/test/progit/figures/18333fig0412-tn.png +0 -0
  263. data/test/progit/figures/18333fig0413-tn.png +0 -0
  264. data/test/progit/figures/18333fig0414-tn.png +0 -0
  265. data/test/progit/figures/18333fig0415-tn.png +0 -0
  266. data/test/progit/figures/18333fig0501-tn.png +0 -0
  267. data/test/progit/figures/18333fig0502-tn.png +0 -0
  268. data/test/progit/figures/18333fig0503-tn.png +0 -0
  269. data/test/progit/figures/18333fig0504-tn.png +0 -0
  270. data/test/progit/figures/18333fig0505-tn.png +0 -0
  271. data/test/progit/figures/18333fig0506-tn.png +0 -0
  272. data/test/progit/figures/18333fig0507-tn.png +0 -0
  273. data/test/progit/figures/18333fig0508-tn.png +0 -0
  274. data/test/progit/figures/18333fig0509-tn.png +0 -0
  275. data/test/progit/figures/18333fig0510-tn.png +0 -0
  276. data/test/progit/figures/18333fig0511-tn.png +0 -0
  277. data/test/progit/figures/18333fig0512-tn.png +0 -0
  278. data/test/progit/figures/18333fig0513-tn.png +0 -0
  279. data/test/progit/figures/18333fig0514-tn.png +0 -0
  280. data/test/progit/figures/18333fig0515-tn.png +0 -0
  281. data/test/progit/figures/18333fig0516-tn.png +0 -0
  282. data/test/progit/figures/18333fig0517-tn.png +0 -0
  283. data/test/progit/figures/18333fig0518-tn.png +0 -0
  284. data/test/progit/figures/18333fig0519-tn.png +0 -0
  285. data/test/progit/figures/18333fig0520-tn.png +0 -0
  286. data/test/progit/figures/18333fig0521-tn.png +0 -0
  287. data/test/progit/figures/18333fig0522-tn.png +0 -0
  288. data/test/progit/figures/18333fig0523-tn.png +0 -0
  289. data/test/progit/figures/18333fig0524-tn.png +0 -0
  290. data/test/progit/figures/18333fig0525-tn.png +0 -0
  291. data/test/progit/figures/18333fig0526-tn.png +0 -0
  292. data/test/progit/figures/18333fig0527-tn.png +0 -0
  293. data/test/progit/figures/18333fig0601-tn.png +0 -0
  294. data/test/progit/figures/18333fig0701-tn.png +0 -0
  295. data/test/progit/figures/18333fig0702-tn.png +0 -0
  296. data/test/progit/figures/18333fig0703-tn.png +0 -0
  297. data/test/progit/figures/18333fig0901-tn.png +0 -0
  298. data/test/progit/figures/18333fig0902-tn.png +0 -0
  299. data/test/progit/figures/18333fig0903-tn.png +0 -0
  300. data/test/progit/figures/18333fig0904-tn.png +0 -0
  301. data/test/progit/fr/01-introduction/01-chapter1.markdown +371 -0
  302. data/test/progit/fr/02-git-basics/01-chapter2.markdown +1378 -0
  303. data/test/progit/fr/03-git-branching/01-chapter3.markdown +781 -0
  304. data/test/progit/fr/04-git-server/01-chapter4.markdown +1141 -0
  305. data/test/progit/fr/05-distributed-git/01-chapter5.markdown +1163 -0
  306. data/test/progit/fr/06-git-tools/01-chapter6.markdown +1356 -0
  307. data/test/progit/fr/07-customizing-git/01-chapter7.markdown +1200 -0
  308. data/test/progit/fr/08-git-and-other-scms/01-chapter8.markdown +832 -0
  309. data/test/progit/fr/09-git-internals/01-chapter9.markdown +1228 -0
  310. data/test/progit/fr/NOTES.fr-fr.markdown +1 -0
  311. data/test/progit/fr/NOTES.fr-fr.md +127 -0
  312. data/test/progit/fr/README.md +43 -0
  313. data/test/progit/fr/glossaire-git.adoc +108 -0
  314. data/test/progit/hi/01-introduction/01-chapter1.markdown +7 -0
  315. data/test/progit/hu/01-introduction/01-chapter1.markdown +257 -0
  316. data/test/progit/id/01-introduction/01-chapter1.markdown +257 -0
  317. data/test/progit/id/02-git-basics/01-chapter2.markdown +1127 -0
  318. data/test/progit/id/03-git-branching/01-chapter3.markdown +598 -0
  319. data/test/progit/it/01-introduction/01-chapter1.markdown +263 -0
  320. data/test/progit/it/02-git-basics/01-chapter2.markdown +1227 -0
  321. data/test/progit/it/03-git-branching/01-chapter3.markdown +598 -0
  322. data/test/progit/it/04-git-server/01-chapter4.markdown +864 -0
  323. data/test/progit/it/05-distributed-git/01-chapter5.markdown +897 -0
  324. data/test/progit/it/06-git-tools/01-chapter6.markdown +1144 -0
  325. data/test/progit/it/07-customizing-git/01-chapter7.markdown +606 -0
  326. data/test/progit/it/08-git-and-other-scms/01-chapter8.markdown +707 -0
  327. data/test/progit/it/09-git-internals/01-chapter9.markdown +1000 -0
  328. data/test/progit/ja/01-introduction/01-chapter1.markdown +260 -0
  329. data/test/progit/ja/02-git-basics/01-chapter2.markdown +1221 -0
  330. data/test/progit/ja/03-git-branching/01-chapter3.markdown +604 -0
  331. data/test/progit/ja/04-git-server/01-chapter4.markdown +863 -0
  332. data/test/progit/ja/05-distributed-git/01-chapter5.markdown +908 -0
  333. data/test/progit/ja/06-git-tools/01-chapter6.markdown +1133 -0
  334. data/test/progit/ja/07-customizing-git/01-chapter7.markdown +936 -0
  335. data/test/progit/ja/08-git-and-other-scms/01-chapter8.markdown +690 -0
  336. data/test/progit/ja/09-git-internals/01-chapter9.markdown +984 -0
  337. data/test/progit/ja/README.md +58 -0
  338. data/test/progit/ja/translation glossaries.txt +33 -0
  339. data/test/progit/ko/01-introduction/01-chapter1.markdown +258 -0
  340. data/test/progit/ko/02-git-basics/01-chapter2.markdown +1181 -0
  341. data/test/progit/ko/03-git-branching/01-chapter3.markdown +612 -0
  342. data/test/progit/ko/04-git-server/01-chapter4.markdown +867 -0
  343. data/test/progit/ko/05-distributed-git/01-chapter5.markdown +913 -0
  344. data/test/progit/ko/06-git-tools/01-chapter6.markdown +1142 -0
  345. data/test/progit/ko/07-customizing-git/01-chapter7.markdown +935 -0
  346. data/test/progit/ko/08-git-and-other-scms/01-chapter8.markdown +688 -0
  347. data/test/progit/ko/09-git-internals/01-chapter9.markdown +976 -0
  348. data/test/progit/ko/README.md +75 -0
  349. data/test/progit/ko/translation_guide.txt +65 -0
  350. data/test/progit/latex/README +27 -0
  351. data/test/progit/latex/config.yml +144 -0
  352. data/test/progit/latex/makepdf +207 -0
  353. data/test/progit/latex/template.tex +155 -0
  354. data/test/progit/makeebooks +125 -0
  355. data/test/progit/makepdfs +47 -0
  356. data/test/progit/mk/01-introduction/01-chapter1.markdown +258 -0
  357. data/test/progit/mk/02-git-basics/01-chapter2.markdown +1125 -0
  358. data/test/progit/mk/03-git-branching/01-chapter3.markdown +598 -0
  359. data/test/progit/mk/05-distributed-git/01-chapter5.markdown +897 -0
  360. data/test/progit/nl/01-introduction/01-chapter1.markdown +296 -0
  361. data/test/progit/nl/02-git-basics/01-chapter2.markdown +1253 -0
  362. data/test/progit/nl/03-git-branching/01-chapter3.markdown +642 -0
  363. data/test/progit/nl/04-git-server/01-chapter4.markdown +902 -0
  364. data/test/progit/nl/05-distributed-git/01-chapter5.markdown +953 -0
  365. data/test/progit/nl/06-git-tools/01-chapter6.markdown +1177 -0
  366. data/test/progit/nl/07-customizing-git/01-chapter7.markdown +974 -0
  367. data/test/progit/nl/08-git-and-other-scms/01-chapter8.markdown +725 -0
  368. data/test/progit/nl/09-git-internals/01-chapter9.markdown +1013 -0
  369. data/test/progit/no-nb/01-introduction/01-chapter1.markdown +261 -0
  370. data/test/progit/no-nb/02-git-basics/01-chapter2.markdown +1225 -0
  371. data/test/progit/no-nb/03-git-branching/01-chapter3.markdown +606 -0
  372. data/test/progit/no-nb/04-git-server/01-chapter4.markdown +867 -0
  373. data/test/progit/no-nb/05-distributed-git/01-chapter5.markdown +914 -0
  374. data/test/progit/no-nb/06-git-tools/01-chapter6.markdown +1144 -0
  375. data/test/progit/no-nb/07-customizing-git/01-chapter7.markdown +936 -0
  376. data/test/progit/no-nb/08-git-and-other-scms/01-chapter8.markdown +689 -0
  377. data/test/progit/no-nb/09-git-internals/01-chapter9.markdown +977 -0
  378. data/test/progit/no-nb/README +2 -0
  379. data/test/progit/pl/01-introduction/01-chapter1.markdown +257 -0
  380. data/test/progit/pl/02-git-basics/02-chapter2.markdown +1128 -0
  381. data/test/progit/pl/03-git-branching/01-chapter3.markdown +598 -0
  382. data/test/progit/pl/04-git-server/01-chapter4.markdown +897 -0
  383. data/test/progit/pl/05-distributed-git/01-chapter5.markdown +1278 -0
  384. data/test/progit/pl/06-git-tools/01-chapter6.markdown +1550 -0
  385. data/test/progit/pl/07-customizing-git/01-chapter7.markdown +1058 -0
  386. data/test/progit/pl/08-git-and-other-scms/01-chapter8.markdown +948 -0
  387. data/test/progit/pl/09-git-internals/01-chapter9.markdown +1382 -0
  388. data/test/progit/pl/translation-guidelines.txt +70 -0
  389. data/test/progit/pt-br/01-introduction/01-chapter1.markdown +256 -0
  390. data/test/progit/pt-br/02-git-basics/01-chapter2.markdown +1127 -0
  391. data/test/progit/pt-br/03-git-branching/01-chapter3.markdown +596 -0
  392. data/test/progit/pt-br/04-git-server/01-chapter4.markdown +888 -0
  393. data/test/progit/pt-br/05-distributed-git/01-chapter5.markdown +896 -0
  394. data/test/progit/pt-br/06-git-tools/01-chapter6.markdown +1122 -0
  395. data/test/progit/pt-br/07-customizing-git/01-chapter7.markdown +932 -0
  396. data/test/progit/pt-br/08-git-and-other-scms/01-chapter8.markdown +691 -0
  397. data/test/progit/pt-br/09-git-internals/01-chapter9.markdown +978 -0
  398. data/test/progit/pt-br/figures-dia/fig0101.dia +617 -0
  399. data/test/progit/pt-br/figures-dia/fig0102.dia +921 -0
  400. data/test/progit/pt-br/figures-dia/fig0103.dia +1468 -0
  401. data/test/progit/pt-br/figures-dia/fig0104.dia +1432 -0
  402. data/test/progit/pt-br/figures-dia/fig0105.dia +1924 -0
  403. data/test/progit/pt-br/figures-dia/fig0106.dia +562 -0
  404. data/test/progit/pt-br/figures-dia/fig0201.dia +776 -0
  405. data/test/progit/pt-br/figures-dia/fig0301.dia +2006 -0
  406. data/test/progit/pt-br/figures-dia/fig0302.dia +2148 -0
  407. data/test/progit/pt-br/figures-dia/fig0316.dia +1079 -0
  408. data/test/progit/pt-br/figures-dia/fig0322.dia +1142 -0
  409. data/test/progit/pt-br/figures-dia/fig0323.dia +1407 -0
  410. data/test/progit/pt-br/figures-dia/fig0324.dia +1603 -0
  411. data/test/progit/pt-br/figures-dia/fig0325.dia +2003 -0
  412. data/test/progit/pt-br/figures-dia/fig0326.dia +2013 -0
  413. data/test/progit/pt-br/figures-dia/fig0336.dia +786 -0
  414. data/test/progit/pt-br/figures-dia/fig0337.dia +1546 -0
  415. data/test/progit/pt-br/figures-dia/fig0338.dia +1755 -0
  416. data/test/progit/pt-br/figures-dia/fig0339.dia +1882 -0
  417. data/test/progit/pt-br/figures-dia/fig0501.dia +456 -0
  418. data/test/progit/pt-br/figures-dia/fig0502.dia +965 -0
  419. data/test/progit/pt-br/figures-dia/fig0503.dia +914 -0
  420. data/test/progit/pt-br/figures-dia/fig0511.dia +1201 -0
  421. data/test/progit/pt-br/figures-dia/fig0515.dia +1721 -0
  422. data/test/progit/pt-br/figures-dia/fig0702.dia +795 -0
  423. data/test/progit/pt-br/figures-dia/fig0703.dia +795 -0
  424. data/test/progit/pt-br/figures-dia/fig0901.dia +669 -0
  425. data/test/progit/pt-br/figures-dia/fig0902.dia +834 -0
  426. data/test/progit/pt-br/figures-dia/fig0903.dia +1483 -0
  427. data/test/progit/pt-br/figures-dia/fig0904.dia +1728 -0
  428. data/test/progit/ro/01-introduction/01-chapter1.markdown +257 -0
  429. data/test/progit/ru/01-introduction/01-chapter1.markdown +259 -0
  430. data/test/progit/ru/02-git-basics/01-chapter2.markdown +1155 -0
  431. data/test/progit/ru/03-git-branching/01-chapter3.markdown +598 -0
  432. data/test/progit/ru/04-git-server/01-chapter4.markdown +854 -0
  433. data/test/progit/ru/05-distributed-git/01-chapter5.markdown +897 -0
  434. data/test/progit/ru/06-git-tools/01-chapter6.markdown +1126 -0
  435. data/test/progit/ru/07-customizing-git/01-chapter7.markdown +938 -0
  436. data/test/progit/ru/08-git-and-other-scms/01-chapter8.markdown +691 -0
  437. data/test/progit/ru/09-git-internals/01-chapter9.markdown +977 -0
  438. data/test/progit/ru/Glossary +38 -0
  439. data/test/progit/ru/README +12 -0
  440. data/test/progit/ru/figures-dia/fig0101.dia +647 -0
  441. data/test/progit/ru/figures-dia/fig0102.dia +1009 -0
  442. data/test/progit/ru/figures-dia/fig0103.dia +1468 -0
  443. data/test/progit/ru/figures-dia/fig0104.dia +1432 -0
  444. data/test/progit/ru/figures-dia/fig0105.dia +1924 -0
  445. data/test/progit/ru/figures-dia/fig0106.dia +561 -0
  446. data/test/progit/ru/figures-dia/fig0201.dia +774 -0
  447. data/test/progit/ru/figures-dia/fig0322.dia +1182 -0
  448. data/test/progit/ru/figures-dia/fig0323.dia +1457 -0
  449. data/test/progit/ru/figures-dia/fig0324.dia +1698 -0
  450. data/test/progit/ru/figures-dia/fig0325.dia +2101 -0
  451. data/test/progit/ru/figures-dia/fig0326.dia +2111 -0
  452. data/test/progit/ru/figures-dia/fig0336.dia +786 -0
  453. data/test/progit/ru/figures-dia/fig0337.dia +1546 -0
  454. data/test/progit/ru/figures-dia/fig0338.dia +1755 -0
  455. data/test/progit/ru/figures-dia/fig0339.dia +1882 -0
  456. data/test/progit/ru/figures-dia/fig0501.dia +477 -0
  457. data/test/progit/ru/figures-dia/fig0502.dia +1063 -0
  458. data/test/progit/ru/figures-dia/fig0503.dia +915 -0
  459. data/test/progit/ru/figures-dia/fig0511.dia +1201 -0
  460. data/test/progit/ru/figures-dia/fig0515.dia +1741 -0
  461. data/test/progit/ru/figures-dia/fig0702.dia +851 -0
  462. data/test/progit/ru/figures-dia/fig0703.dia +851 -0
  463. data/test/progit/sr/01-introduction/01-chapter1.markdown +257 -0
  464. data/test/progit/summary.rb +29 -0
  465. data/test/progit/th/01-introduction/01-chapter1.markdown +257 -0
  466. data/test/progit/th/02-git-basics/01-chapter2.markdown +1126 -0
  467. data/test/progit/th/README.md +47 -0
  468. data/test/progit/tr/01-introduction/01-chapter1.markdown +258 -0
  469. data/test/progit/tr/02-git-basics/01-chapter2.markdown +1129 -0
  470. data/test/progit/tr/03-git-branching/01-chapter3.markdown +598 -0
  471. data/test/progit/tr/04-git-server/01-chapter4.markdown +73 -0
  472. data/test/progit/tr/05-distributed-git/01-chapter5.markdown +215 -0
  473. data/test/progit/uk/01-introduction/01-chapter1.markdown +522 -0
  474. data/test/progit/vi/01-introduction/01-chapter1.markdown +259 -0
  475. data/test/progit/vi/02-git-basics/01-chapter2.markdown +1172 -0
  476. data/test/progit/vi/03-git-branching/01-chapter3.markdown +598 -0
  477. data/test/progit/zh-tw/01-introduction/01-chapter1.markdown +259 -0
  478. data/test/progit/zh-tw/02-git-basics/01-chapter2.markdown +1183 -0
  479. data/test/progit/zh-tw/03-git-branching/01-chapter3.markdown +604 -0
  480. data/test/progit/zh-tw/04-git-server/01-chapter4.markdown +866 -0
  481. data/test/progit/zh-tw/05-distributed-git/01-chapter5.markdown +912 -0
  482. data/test/progit/zh-tw/06-git-tools/01-chapter6.markdown +1139 -0
  483. data/test/progit/zh-tw/07-customizing-git/01-chapter7.markdown +932 -0
  484. data/test/progit/zh-tw/08-git-and-other-scms/01-chapter8.markdown +689 -0
  485. data/test/progit/zh-tw/09-git-internals/01-chapter9.markdown +977 -0
  486. data/test/progit/zh/01-introduction/01-chapter1.markdown +259 -0
  487. data/test/progit/zh/02-git-basics/01-chapter2.markdown +1177 -0
  488. data/test/progit/zh/03-git-branching/01-chapter3.markdown +604 -0
  489. data/test/progit/zh/04-git-server/01-chapter4.markdown +866 -0
  490. data/test/progit/zh/05-distributed-git/01-chapter5.markdown +912 -0
  491. data/test/progit/zh/06-git-tools/01-chapter6.markdown +1125 -0
  492. data/test/progit/zh/07-customizing-git/01-chapter7.markdown +935 -0
  493. data/test/progit/zh/08-git-and-other-scms/01-chapter8.markdown +689 -0
  494. data/test/progit/zh/09-git-internals/01-chapter9.markdown +976 -0
  495. data/test/spec_tests.json +4382 -4070
  496. data/test/test_basics.rb +1 -1
  497. data/test/test_helper.rb +1 -0
  498. data/test/test_maliciousness.rb +4 -2
  499. data/test/test_pathological_inputs.rb +31 -30
  500. data/test/test_spec.rb +5 -4
  501. metadata +972 -4
@@ -0,0 +1,1141 @@
1
+ # Git sur le serveur #
2
+
3
+ À présent, vous devriez être capable de réaliser la plupart des tâches quotidiennes impliquant Git.
4
+ Néanmoins, pour pouvoir collaborer avec d'autres personnes au moyen de Git, vous allez devoir disposer d'un dépôt distant Git.
5
+ Bien que vous puissiez techniquement tirer et pousser des modifications depuis et vers des dépôts personnels, cette pratique est déconseillée parce qu'elle introduit très facilement une confusion avec votre travail actuel.
6
+ De plus, vous souhaitez que vos collaborateurs puissent accéder à votre dépôt de sources, y compris si vous n'êtes pas connecté — disposer d'un dépôt accessible en permanence peut s'avérer utile.
7
+ De ce fait, la méthode canonique pour collaborer consiste à instancier un dépôt intermédiaire auquel tous ont accès, que ce soit pour pousser ou tirer.
8
+ Nous nommerons ce dépôt le « serveur Git » mais vous vous apercevrez qu'héberger un serveur de dépôt Git ne consomme que peu de ressources et qu'en conséquence, on n'utilise que rarement une machine dédiée à cette tâche.
9
+
10
+ Un serveur Git est simple à lancer.
11
+ Premièrement, vous devez choisir quels protocoles seront supportés.
12
+ La première partie de ce chapitre traite des protocoles disponibles et de leurs avantages et inconvénients.
13
+ La partie suivante explique certaines configurations typiques avec ces protocoles et comment les mettre en œuvre.
14
+ Enfin, nous traiterons de quelques types d'hébergement, si vous souhaitez héberger votre code sur un serveur tiers, sans avoir à installer et maintenir un serveur par vous-même.
15
+
16
+ Si vous ne voyez pas d'intérêt à gérer votre propre serveur, vous pouvez sauter directement à la dernière partie de ce chapitre pour détailler les options pour mettre en place un compte hébergé, avant de continuer dans le chapitre suivant où les problématiques de développement distribué sont abordées.
17
+
18
+ Un dépôt distant est généralement un _dépôt nu_ (*bare repository*), un dépôt Git qui n'a pas de copie de travail.
19
+ Comme ce dépôt n'est utilisé que comme centralisateur de collaboration, il n'y a aucune raison d'extraire un instantané sur le disque ; seules les données Git sont nécessaires.
20
+ Pour simplifier, un dépôt nu est le contenu du répertoire `.git` sans fioriture.
21
+
22
+ ## Protocoles ##
23
+
24
+ Git peut utiliser quatre protocoles réseau majeurs pour transporter des données : local, *Secure Shell* (SSH), Git et HTTP.
25
+ Nous allons voir leur nature et dans quelles circonstances ils peuvent (ou ne peuvent pas) être utilisés.
26
+
27
+ Il est à noter que mis à part HTTP, tous les protocoles nécessitent l'installation de Git sur le serveur.
28
+
29
+ ### Protocole local ###
30
+
31
+ Le protocole de base est le protocole _local_ pour lequel le dépôt distant est un autre répertoire dans le système de fichiers.
32
+ Il est souvent utilisé si tous les membres de l'équipe ont accès à un répertoire partagé via NFS par exemple ou dans le cas moins probable où tous les développeurs travaillent sur le même ordinateur.
33
+ Ce dernier cas n'est pas optimum car tous les dépôts seraient hébergés de fait sur le même ordinateur, rendant ainsi toute défaillance catastrophique.
34
+
35
+ Si vous disposez d'un système de fichiers partagé, vous pouvez cloner, pousser et tirer avec un dépôt local.
36
+ Pour cloner un dépôt ou pour l'utiliser comme dépôt distant d'un projet existant, utilisez le chemin vers le dépôt comme URL.
37
+ Par exemple, pour cloner un dépôt local, vous pouvez lancer ceci :
38
+
39
+ $ git clone /opt/git/projet.git
40
+
41
+ Ou bien cela :
42
+
43
+ $ git clone file:///opt/git/projet.git
44
+
45
+ Git opère légèrement différemment si vous spécifiez explicitement le protocole `file://` au début de l'URL.
46
+ Si vous spécifiez simplement le chemin et si la destination se trouve sur le même système de fichiers, Git tente d'utiliser des liens physiques pour le fichiers communs.
47
+ Si la destination se trouve sur un autre système de fichiers, Git fait une copie des fichiers nécessaires.
48
+ Si vous spécifiez le protocole `file://`, Git lance un processus d'accès au travers du réseau, ce qui est généralement moins efficace.
49
+ La raison d'utiliser spécifiquement le préfixe `file://` est la volonté d'obtenir une copie propre du dépôt, sans aucune référence ou aucun objet supplémentaire qui pourraient résulter d'un import depuis un autre système de gestion de version ou d'une action similaire (voir chapitre 9 pour les tâches de maintenance).
50
+ Nous utiliserons les chemins normaux par la suite car c'est la méthode la plus efficace.
51
+
52
+ Pour ajouter un dépôt local à un projet Git existant, lancez ceci :
53
+
54
+ $ git remote add proj_local /opt/git/projet.git
55
+
56
+ Ensuite, vous pouvez pousser vers et tirer depuis ce dépôt distant de la même manière que vous le feriez pour un dépôt accessible sur le réseau.
57
+
58
+ #### Avantages ####
59
+
60
+ Les avantages des dépôts accessibles sur le système de fichiers sont qu'ils sont simples et qu'ils utilisent les permissions du système de fichiers.
61
+ Si vous avez déjà un montage partagé auquel toute votre équipe a accès, déployer un dépôt est extrêmement facile.
62
+ Vous placez la copie du dépôt nu à un endroit accessible de tous et positionnez correctement les droits de lecture/écriture de la même manière que pour tout autre partage.
63
+ Nous aborderons la méthode pour exporter une copie de dépôt nu à cette fin dans la section suivante « Déployer Git sur un serveur ».
64
+
65
+ C'est un choix satisfaisant pour partager rapidement le travail.
66
+ Si vous et votre coéquipier travaillez sur le même projet et qu'il souhaite partager son travail, lancer une commande telle que `git pull /home/john/project` est certainement plus simple que de passer par un serveur intermédiaire.
67
+
68
+ #### Inconvénients ####
69
+
70
+ Les inconvénients de cette méthode sont qu'il est généralement plus difficile de rendre disponible un partage réseau depuis de nombreux endroits que de simplement gérer des accès réseau.
71
+ Si vous souhaitez pousser depuis votre portable à la maison, vous devez monter le partage distant, ce qui peut s'avérer plus difficile et plus lent que d'y accéder directement via un protocole réseau.
72
+
73
+ Il est aussi à mentionner que ce n'est pas nécessairement l'option la plus rapide à l'utilisation si un partage réseau est utilisé.
74
+ Un dépôt local n'est rapide que si l'accès aux fichiers est rapide.
75
+ Un dépôt accessible sur un montage NFS est souvent plus lent qu'un dépôt accessible via SSH sur le même serveur qui ferait tourner Git avec un accès aux disques locaux.
76
+
77
+ ### Protocole SSH ###
78
+
79
+ Le protocole SSH est probablement le protocole de transport de Git le plus utilisé.
80
+ Cela est dû au fait que l'accès SSH est déjà en place à de nombreux endroits et que si ce n'est pas le cas, cela reste très facile à faire.
81
+ Cela est aussi dû au fait que SSH est le seul protocole permettant facilement de lire et d'écrire à distance.
82
+ Les deux autres protocoles réseau (HTTP et Git) sont généralement en lecture seule et s'ils peuvent être utiles pour la publication, le protocole SSH est nécessaire pour les mises à jour.
83
+ SSH est un protocole authentifié ; et comme il est très répandu, il est généralement facile à mettre en œuvre et à utiliser.
84
+
85
+ Pour cloner un dépôt Git à travers SSH, spécifiez le préfixe `ssh://` dans l'URL comme ceci :
86
+
87
+ $ git clone ssh://utilisateur@serveur/projet.git
88
+
89
+ ou vous pouvez utiliser la syntaxe scp habituelle avec le protocole SSH :
90
+
91
+ $ git clone utilisateur@serveur:projet.git
92
+
93
+ Vous pouvez aussi ne pas spécifier de nom d'utilisateur et Git utilisera par défaut le nom de login.
94
+
95
+ #### Avantages ####
96
+
97
+ Les avantages liés à l'utilisation de SSH sont nombreux.
98
+ Primo, vous ne pourrez pas faire autrement si vous souhaitez gérer un accès authentifié en écriture à votre dépôt à travers le réseau.
99
+ Secundo, SSH est relativement simple à mettre en place, les *daemons* SSH sont facilement disponibles, les administrateurs réseaux sont habitués à les gérer et de nombreuses distributions de systèmes d'exploitation en disposent ou proposent des outils pour les gérer.
100
+ Ensuite, l'accès distant à travers SSH est sécurisé, toutes les données sont chiffrées et authentifiées.
101
+ Enfin, comme les protocoles Git et local, SSH est efficace et permet de comprimer autant que possible les données avant de les transférer.
102
+
103
+ #### Inconvénients ####
104
+
105
+ Le point négatif avec SSH est qu'il est impossible de proposer un accès anonyme au dépôt.
106
+ Les accès sont régis par les permissions SSH, même pour un accès en lecture seule, ce qui s'oppose à une optique open source.
107
+ Si vous souhaitez utiliser Git dans un environnement d'entreprise, SSH peut bien être le seul protocole nécessaire.
108
+ Si vous souhaitez proposer de l'accès anonyme en lecture seule à vos projets, vous aurez besoin de SSH pour vous permettre de pousser mais un autre protocole sera nécessaire pour permettre à d'autres de tirer.
109
+
110
+ ### Protocole Git ###
111
+
112
+ Vient ensuite le protocole Git. Celui-ci est géré par un *daemon* spécial livré avec Git. Ce *daemon* (démon, processus en arrière plan) écoute sur un port dédié (9418) et propose un service similaire au protocole SSH, mais sans aucune sécurisation.
113
+ Pour qu'un dépôt soit publié via le protocole Git, le fichier `git-daemon-export-ok` doit exister mais mise à part cette condition sans laquelle le *daemon* refuse de publier un projet, il n'y a aucune sécurité.
114
+ Soit le dépôt Git est disponible sans restriction en lecture, soit il n'est pas publié.
115
+ Cela signifie qu'il ne permet pas de pousser des modifications.
116
+ Vous pouvez activer la capacité à pousser mais étant donné l'absence d'authentification, n'importe qui sur Internet ayant trouvé l'URL du projet peut pousser sur le dépôt.
117
+ Autant dire que ce mode est rarement recherché.
118
+
119
+ #### Avantages ####
120
+
121
+ Le protocole Git est le protocole le plus rapide.
122
+ Si vous devez servir un gros trafic pour un projet public ou un très gros projet qui ne nécessite pas d'authentification en lecture, il est très probable que vous devriez installer un *daemon* Git.
123
+ Il utilise le même mécanisme de transfert de données que SSH, la surcharge du chiffrement et de l'authentification en moins.
124
+
125
+ #### Inconvénients ####
126
+
127
+ Le défaut du protocole Git est le manque d'authentification.
128
+ N'utiliser que le protocole Git pour accéder à un projet n'est généralement pas suffisant.
129
+ Il faut le coupler avec un accès SSH pour quelques développeurs qui auront le droit de pousser (écrire) et le garder pour un accès `git://` en lecture seule.
130
+ C'est aussi le protocole le plus difficile à mettre en place.
131
+ Il doit être géré par son propre *daemon* qui est spécifique.
132
+ Nous traiterons de cette installation dans la section « Gitosis » de ce chapitre — elle nécessite la configuration d'un *daemon* `xinetd` ou apparenté, ce qui est loin d'être simple.
133
+ Il nécessite aussi un accès à travers le pare-feu au port 9418 qui n'est pas un port ouvert en standard dans les pare-feux professionnels.
134
+ Derrière les gros pare-feux professionnels, ce port obscur est tout simplement bloqué.
135
+
136
+ ### Protocole HTTP/S ###
137
+
138
+ Enfin, il reste le protocole HTTP.
139
+ La beauté d'HTTP ou HTTPS tient dans la simplicité à le mettre en place.
140
+ Tout ce qu'il y a à faire, c'est de simplement copier un dépôt Git nu sous votre racine de document HTTP et de paramétrer un crochet `post-update` et c'est prêt (voir chapitre 7 pour les détails sur les crochets de Git).
141
+ À partir de ceci, toute personne possédant un accès au serveur web sur lequel vous avez copié votre dépôt peut le cloner.
142
+ Pour autoriser un accès en lecture à votre dépôt sur HTTP, faites ceci :
143
+
144
+ $ cd /var/www/htdocs/
145
+ $ git clone --bare /chemin/vers/git_projet projetgit.git
146
+ $ cd projetgit.git
147
+ $ mv hooks/post-update.sample hooks/post-update
148
+ $ chmod a+x hooks/post-update
149
+
150
+ C'est tout.
151
+ Le crochet `post-update` qui est livré avec Git par défaut lance la commande appropriée (`git update-server-info`) pour permettre un fonctionnement correct du clonage et de la récupération par HTTP.
152
+ Cette commande est lancée lorsque vous poussez vers ce dépôt par SSH ; ainsi, les autres personnes peuvent cloner via la commande :
153
+
154
+ $ git clone http://exemple.com/projetgit.git
155
+
156
+ Dans ce cas particulier, nous utilisons le chemin `/var/www/htdocs` qui est commun pour les installations d'Apache, mais vous pouvez utiliser n'importe quel serveur web de pages statiques — il suffit de placer le dépôt nu dans le chemin d'accès.
157
+ Les données Git sont servies comme des simples fichiers statiques (voir chapitre 9 pour la manière détaillée dont ils sont servis).
158
+
159
+ Il est possible de faire pousser Git à travers HTTP, bien que cette technique ne soit pas utilisée et nécessite de gérer les exigences complexes de WebDAV.
160
+ Comme elle est rarement utilisée, nous ne la détaillerons pas dans ce livre.
161
+ Si vous êtes tout de même intéressé par l'utilisation des protocoles de push-HTTP, vous pouvez vous référer à `http://www.kernel.org/pub/software/scm/git/docs/howto/setup-git-server-over-http.txt`.
162
+ Un des intérêts à permettre de pousser par HTTP est que vous pouvez utiliser n'importe quel serveur WebDAV, sans liaison avec Git.
163
+ Il est donc possible d'utiliser cette fonctionnalité si votre fournisseur d'hébergement web supporte WebDAV pour la mise à jour de vos sites.
164
+
165
+ #### Avantages ####
166
+
167
+ L'avantage d'utiliser le protocole HTTP est qu'il est très simple à mettre en œuvre.
168
+ Donner un accès public en lecture à votre dépôt Git ne nécessite que quelques commandes.
169
+ Cela ne prend que quelques minutes.
170
+ De plus, le protocole HTTP n'est pas très demandeur en ressources système.
171
+ Les besoins étant limités à servir des données statiques, un serveur Apache standard peut servir des milliers de fichiers par seconde en moyenne et il est très difficile de surcharger même un ordinateur moyen.
172
+
173
+ Vous pouvez aussi publier votre dépôt par HTTPS, ce qui signifie que vous pouvez chiffrer le contenu transféré.
174
+ Vous pouvez même obliger les clients à utiliser des certificats SSL spécifiques.
175
+ Généralement, si vous souhaitez pousser jusque là, il est préférable de passer par des clés SSH publiques.
176
+ Cependant, certains cas nécessitent l'utilisation de certificats SSL signés ou d'autres méthodes d'authentification basées sur HTTP pour les accès en lecture seule sur HTTPS.
177
+
178
+ Un autre avantage indéniable de HTTP est que c'est un protocole si commun que les pare-feux d'entreprise sont souvent paramétrés pour le laisser passer.
179
+
180
+ #### Inconvénients ####
181
+
182
+ L'inconvénient majeur de servir votre dépôt sur HTTP est que c'est relativement inefficace pour le client.
183
+ Cela prend généralement beaucoup plus longtemps de cloner ou tirer depuis le dépôt et il en résulte un plus grand trafic réseau et de plus gros volumes de transfert que pour les autres protocoles.
184
+ Le protocole HTTP est souvent appelé le protocole _idiot_ parce qu'il n'a pas l'intelligence de sélectionner seulement les données nécessaires à transférer du fait du manque de traitement dynamique côté serveur.
185
+ Pour plus d'information sur les différences d'efficacité entre le protocole HTTP et les autres, référez-vous au chapitre 9.
186
+
187
+ ## Installation de Git sur un serveur ##
188
+
189
+ Pour réaliser l'installation initiale d'un serveur Git, il faut exporter un dépôt existant dans un nouveau dépôt nu — un dépôt qui ne contient pas de copie de répertoire de travail.
190
+ C'est généralement simple à faire.
191
+ Pour cloner votre dépôt en créant un nouveau dépôt nu, lancez la commande clone avec l'option `--bare`.
192
+ Par convention, les répertoires de dépôt nu finissent en `.git`, de cette manière :
193
+
194
+ $ git clone --bare mon_project mon_project.git
195
+ Initialized empty Git repository in /opt/projets/mon_project.git/
196
+
197
+ La sortie de cette commande est un peu déroutante.
198
+ Comme `clone` est un `git init` de base, suivi d'un `git fetch`, nous voyons les messages du `git init` qui crée un répertoire vide.
199
+ Le transfert effectif d'objets ne fournit aucune sortie, mais il a tout de même lieu.
200
+ Vous devriez maintenant avoir une copie des données de Git dans votre répertoire `mon_project.git`.
201
+
202
+ C'est grossièrement équivalent à :
203
+
204
+ $ cp -Rf mon_project/.git mon_project.git
205
+
206
+ Il y a quelques légères différences dans le fichier de configuration mais pour l'utilisation envisagée, c'est très proche.
207
+ La commande extrait le répertoire Git sans répertoire de travail et crée un répertoire spécifique pour l'accueillir.
208
+
209
+ ### Copie du dépôt nu sur un serveur ###
210
+
211
+ À présent que vous avez une copie nue de votre dépôt, il ne reste plus qu'à la placer sur un serveur et à régler les protocoles.
212
+ Supposons que vous avez mis en place un serveur nommé `git.exemple.com` auquel vous avez accès par SSH et que vous souhaitez stocker vos dépôts Git dans le répertoire `/opt/git`.
213
+ Vous pouvez mettre en place votre dépôt en copiant le dépôt nu :
214
+
215
+ $ scp -r mon_projet.git utilisateur@git.exemple.com:/opt/git
216
+
217
+ À partir de maintenant, tous les autres utilisateurs disposant d'un accès SSH au serveur et ayant un accès en lecture seule au répertoire `/opt/git` peuvent cloner votre dépôt en lançant la commande :
218
+
219
+ $ git clone utilisateur@git.exemple.com:/opt/git/mon_projet.git
220
+
221
+ Si un utilisateur se connecte par SSH au serveur et a accès en lecture au répertoire `/opt/git/mon_projet.git`, il aura automatiquement accès pour tirer.
222
+ Git ajoutera automatiquement les droits de groupe en écriture à un dépôt si vous lancez la commande `git init` avec l'option `--shared`.
223
+
224
+ $ ssh utilisateur@git.exemple.com
225
+ $ cd /opt/git/mon_projet.git
226
+ $ git init --bare --shared
227
+
228
+ Vous voyez comme il est simple de prendre un dépôt Git, créer une version nue et la placer sur un serveur auquel vous et vos collaborateurs avez accès en SSH.
229
+ Vous voilà prêts à collaborer sur le même projet.
230
+
231
+ Il faut noter que c'est littéralement tout ce dont vous avez besoin pour démarrer un serveur Git utile auquel plusieurs personnes ont accès — ajoutez des comptes SSH sur un serveur, et collez un dépôt nu quelque part où tous les utilisateurs ont accès en lecture et écriture.
232
+ Vous êtes prêts à travailler, vous n'avez besoin de rien d'autre.
233
+
234
+ Dans les chapitres à venir, nous traiterons de mises en place plus sophistiquées.
235
+ Ces sujets incluront l'élimination du besoin de créer un compte système pour chaque utilisateur, l'accès public aux dépôts, la mise en place d'interfaces utilisateur web, l'utilisation de l'outil Gitosis, etc.
236
+ Néanmoins, gardez à l'esprit que pour collaborer avec quelques personnes sur un projet privé, tout ce qu'il faut, c'est un serveur SSH et un dépôt nu.
237
+
238
+ ### Petites installations ###
239
+
240
+ Si vous travaillez dans un petit groupe ou si vous n'êtes qu'en phase d'essai de Git au sein de votre société avec peu de développeurs, les choses peuvent rester simples.
241
+ Un des aspects les plus compliqués de la mise en place d'un serveur Git est la gestion des utilisateurs.
242
+ Si vous souhaitez que certains dépôts ne soient accessibles à certains utilisateurs qu'en lecture seule et en lecture/écriture pour d'autres, la gestion des accès et des permissions peut devenir difficile à régler.
243
+
244
+
245
+ #### Accès SSH ####
246
+
247
+ Si vous disposez déjà d'un serveur auquel tous vos développeurs ont un accès SSH, il est généralement plus facile d'y mettre en place votre premier dépôt car vous n'aurez quasiment aucun réglage supplémentaire à faire (comme nous l'avons expliqué dans le chapitre précédent).
248
+ Si vous souhaitez des permissions d'accès plus complexes, vous pouvez les mettre en place par le jeu des permissions standards sur le système de fichiers du système d'exploitation de votre serveur.
249
+
250
+ Si vous souhaitez placer vos dépôts sur un serveur qui ne dispose pas déjà de comptes pour chacun des membres de votre équipe qui aurait accès en écriture, alors vous devrez mettre en place un accès SSH pour eux.
251
+ En supposant que pour vos dépôts, vous disposiez déjà d'un serveur SSH installé et sur lequel vous avez accès.
252
+
253
+ Il y a quelques moyens de donner un accès à tout le monde dans l'équipe.
254
+ Le premier est de créer des comptes pour tout le monde, ce qui est logique mais peut s'avérer lourd.
255
+ Vous ne souhaiteriez sûrement pas lancer `adduser` et entrer un mot de passe temporaire pour chaque utilisateur.
256
+
257
+ Une seconde méthode consiste à créer un seul utilisateur Git sur la machine, demander à chaque développeur nécessitant un accès en écriture de vous envoyer une clé publique SSH et d'ajouter la-dite clé au fichier `~/.ssh/authorized_keys` de votre utilisateur Git.
258
+ À partir de là, tout le monde sera capable d'accéder à la machine via l'utilisateur Git.
259
+ Cela n'affecte en rien les données de *commit* — les informations de l'utilisateur SSH par lequel on se connecte n'affectent pas les données de *commit* enregistrées.
260
+
261
+ Une dernière méthode consiste à faire une authentification SSH auprès d'un serveur LDAP ou tout autre système d'authentification centralisé que vous utiliseriez déjà.
262
+ Tant que chaque utilisateur peut accéder à un shell sur la machine, n'importe quel schéma d'authentification SSH devrait fonctionner.
263
+
264
+ ## Génération des clés publiques SSH ##
265
+
266
+ Cela dit, de nombreux serveurs Git utilisent une authentification par clés publiques SSH.
267
+ Pour fournir une clé publique, chaque utilisateur de votre système doit la générer s'il n'en a pas déjà.
268
+ Le processus est similaire sur tous les systèmes d'exploitation.
269
+ Premièrement, l'utilisateur doit vérifier qu'il n'en a pas déjà une.
270
+ Par défaut, les clés SSH d'un utilisateur sont stockées dans le répertoire `~/.ssh` du compte.
271
+ Vous pouvez facilement vérifier si vous avez déjà une clé en listant le contenu de ce répertoire :
272
+
273
+ $ cd ~/.ssh
274
+ $ ls
275
+ authorized_keys2 id_dsa known_hosts
276
+ config id_dsa.pub
277
+
278
+ Recherchez une paire de fichiers appelés *quelquechose* et *quelquechose*`.pub` où le *quelquechose* en question est généralement `id_dsa` ou `id_rsa`.
279
+ Le fichier en `.pub` est la clé publique tandis que l'autre est la clé privée.
280
+ Si vous ne voyez pas ces fichiers (ou n'avez même pas de répertoire `.ssh`), vous pouvez les créer en lançant un programme appelé `ssh-keygen` fourni par le paquet SSH sur les systèmes Linux/Mac et MSysGit pour Windows :
281
+
282
+ $ ssh-keygen
283
+ Generating public/private rsa key pair.
284
+ Enter file in which to save the key (/Users/schacon/.ssh/id_rsa):
285
+ Enter passphrase (empty for no passphrase):
286
+ Enter same passphrase again:
287
+ Your identification has been saved in /Users/schacon/.ssh/id_rsa.
288
+ Your public key has been saved in /Users/schacon/.ssh/id_rsa.pub.
289
+ The key fingerprint is:
290
+ 43:c5:5b:5f:b1:f1:50:43:ad:20:a6:92:6a:1f:9a:3a schacon@agadorlaptop.local
291
+
292
+
293
+ Premièrement, le programme demande confirmation pour l'endroit où vous souhaitez sauvegarder la clé (`.ssh/id_rsa`) puis il demande deux fois d'entrer un mot de passe qui peut être laissé vide si vous ne souhaitez pas devoir taper un mot de passe quand vous utilisez la clé.
294
+
295
+ Maintenant, chaque utilisateur ayant suivi ces indications doit envoyer la clé publique à la personne en charge de l'administration du serveur Git (en supposant que vous utilisez un serveur SSH réglé pour l'utilisation de clés publiques).
296
+ Ils doivent copier le contenu du fichier .pub et l'envoyer par e-mail.
297
+ Les clés publiques ressemblent à ceci :
298
+
299
+ $ cat ~/.ssh/id_rsa.pub
300
+ ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
301
+ GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
302
+ Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
303
+ t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
304
+ mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
305
+ NrRFi9wrf+M7Q== schacon@agadorlaptop.local
306
+
307
+ Pour un tutoriel plus approfondi sur la création de clé SSH sur différents systèmes d'exploitation, référez-vous au guide GitHub sur les clés SSH à `http://github.com/guides/providing-your-ssh-key`.
308
+
309
+ ## Mise en place du serveur ##
310
+
311
+ Parcourons les étapes de la mise en place d'un accès SSH côté serveur.
312
+ Dans cet exemple, vous utiliserez la méthode des `authorized_keys` pour authentifier vos utilisateurs.
313
+ Nous supposerons également que vous utilisez une distribution Linux standard telle qu'Ubuntu.
314
+ Premièrement, créez un utilisateur 'git' et un répertoire `.ssh` pour cet utilisateur.
315
+
316
+ $ sudo adduser git
317
+ $ su git
318
+ $ cd
319
+ $ mkdir .ssh
320
+
321
+ Ensuite, vous devez ajouter la clé publique d'un développeur au fichier `authorized_keys` de l'utilisateur Git.
322
+ Supposons que vous avez reçu quelques clés par e-mail et les avez sauvées dans des fichiers temporaires.
323
+ Pour rappel, une clé publique ressemble à ceci :
324
+
325
+ $ cat /tmp/id_rsa.john.pub
326
+ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
327
+ ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
328
+ Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
329
+ Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
330
+ O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
331
+ dAv8JggJICUvax2T9va5 gsg-keypair
332
+
333
+ Il suffit de les ajouter au fichier `authorized_keys` :
334
+
335
+ $ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
336
+ $ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
337
+ $ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys
338
+
339
+
340
+ Maintenant, vous pouvez créer un dépôt vide nu en lançant la commande `git init` avec l'option `--bare`, ce qui initialise un dépôt sans répertoire de travail :
341
+
342
+ $ cd /opt/git
343
+ $ mkdir projet.git
344
+ $ cd projet.git
345
+ $ git --bare init
346
+
347
+ Alors, John, Josie ou Jessica peuvent pousser la première version de leur projet vers ce dépôt en l'ajoutant en tant que dépôt distant et en lui poussant une branche.
348
+ Notons que quelqu'un doit se connecter au serveur et créer un dépôt nu pour chaque ajout de projet.
349
+ Supposons que le nom du serveur soit `gitserveur`.
350
+ Si vous l'hébergez en interne et avez réglé le DNS pour faire pointer `gitserver` sur ce serveur, alors vous pouvez utiliser les commandes suivantes telles quelles :
351
+
352
+ # Sur l'ordinateur de John
353
+ $ cd monproject
354
+ $ git init
355
+ $ git add .
356
+ $ git commit -m 'premiere validation'
357
+ $ git remote add origin git@gitserveur:/opt/git/projet.git
358
+ $ git push origin master
359
+
360
+ À présent, les autres utilisateurs peuvent cloner le dépôt et y pousser leurs modifications aussi simplement :
361
+
362
+ $ git clone git@gitserveur:/opt/git/projet.git
363
+ $ cd projet
364
+ $ vim LISEZMOI
365
+ $ git commit -am 'correction fichier LISEZMOI'
366
+ $ git push origin master
367
+
368
+ De cette manière, vous pouvez rapidement mettre en place un serveur Git en lecture/écriture pour une poignée de développeurs.
369
+
370
+ En précaution supplémentaire, vous pouvez simplement restreindre l'utilisateur 'git' à des actions Git avec un shell limité appelé `git-shell` qui est fourni avec Git.
371
+ Si vous positionnez ce shell comme shell de login de l'utilisateur 'git', l'utilisateur 'git' ne peut pas avoir de shell normal sur ce serveur.
372
+ Pour utiliser cette fonction, spécifiez `git-shell` en lieu et place de bash ou csh pour shell de l'utilisateur.
373
+ Cela se réalise généralement en éditant le fichier `/etc/passwd` :
374
+
375
+ $ sudo vim /etc/passwd
376
+
377
+ Tout au bas, vous devriez trouver une ligne qui ressemble à ceci :
378
+
379
+ git:x:1000:1000::/home/git:/bin/sh
380
+
381
+ Modifiez `/bin/sh` en `/usr/bin/git-shell` (ou le résultat de la commande `which git-shell` qui indique où il est installé).
382
+ La ligne devrait maintenant ressembler à ceci :
383
+
384
+ git:x:1000:1000::/home/git:/usr/bin/git-shell
385
+
386
+ À présent, l'utilisateur 'git' ne peut plus utiliser la connexion SSH que pour pousser et tirer sur des dépôts Git, il ne peut plus ouvrir un shell.
387
+ Si vous essayez, vous verrez un rejet de login :
388
+
389
+ $ ssh git@gitserveur
390
+ fatal: What do you think I am? A shell?
391
+ Connection to gitserveur closed.
392
+
393
+ ## Accès public ##
394
+
395
+ Et si vous voulez permettre des accès anonymes en lecture ?
396
+ Peut-être souhaitez-vous héberger un projet open source au lieu d'un projet interne privé.
397
+ Ou peut-être avez-vous quelques serveurs de compilation ou d'intégration continue qui changent souvent et vous ne souhaitez pas avoir à regénérer des clés SSH tout le temps — vous avez besoin d'un accès en lecture seule simple.
398
+
399
+ Le moyen le plus simple pour des petites installations est probablement d'installer un serveur web statique dont la racine pointe sur vos dépôts Git puis d'activer le crochet `post-update` mentionné à la première partie de ce chapitre.
400
+ Reprenons l'exemple précédent.
401
+ Supposons que vos dépôts soient dans le répertoire `/opt/git` et qu'un serveur Apache soit installé sur la machine.
402
+ Vous pouvez bien sûr utiliser n'importe quel serveur web mais nous utiliserons Apache pour montrer la configuration nécessaire.
403
+
404
+ Premièrement, il faut activer le crochet :
405
+
406
+ $ cd projet.git
407
+ $ mv hooks/post-update.sample hooks/post-update
408
+ $ chmod a+x hooks/post-update
409
+
410
+ Quelle est l'action de ce crochet `post-update` ?
411
+ Il contient simplement ceci :
412
+
413
+ $ cat .git/hooks/post-update
414
+ #!/bin/sh
415
+ exec git-update-server-info
416
+
417
+ Cela signifie que lorsque vous poussez vers le serveur via SSH, Git lance cette commande pour mettre à jour les fichiers nécessaires lorsqu'on tire par HTTP.
418
+
419
+ Ensuite, il faut ajouter dans la configuration Apache une entrée VirtualHost dont la racine pointe sur vos dépôts Git.
420
+ Ici, nous supposerons que vous avez réglé un DNS avec résolution générique qui renvoit `*.gitserveur` vers la machine qui héberge ce système :
421
+
422
+ <VirtualHost *:80>
423
+ ServerName git.gitserveur
424
+ DocumentRoot /opt/git
425
+ <Directory /opt/git/>
426
+ Order allow, deny
427
+ allow from all
428
+ </Directory>
429
+ </VirtualHost>
430
+
431
+ Vous devrez aussi positionner le groupe d'utilisateurs Unix du répertoire `/opt/git` à `www-data` de manière à ce que le serveur web puisse avoir accès en lecture seule aux répertoires si le serveur Apache lance le script CGI avec cet utilisateur (par défaut) :
432
+
433
+ $ chgrp -R www-data /opt/git
434
+
435
+ Après avoir redémarré Apache, vous devriez être capable de cloner vos dépôts en spécifiant l'URL de votre projet :
436
+
437
+ $ git clone http://git.gitserveur/projet.git
438
+
439
+ Ainsi, vous pouvez donner accès en lecture seule à tous vos projets à un grand nombre d'utilisateurs en quelques minutes.
440
+ Une autre option simple pour fournir un accès public non-authentifié consiste à lancer un *daemon* Git, bien que cela requière de démoniser le processus — nous traiterons cette option dans un chapitre ultérieur si vous préférez cette option.
441
+
442
+ ## GitWeb ##
443
+
444
+ Après avoir réglé les accès de base en lecture/écriture et en lecture seule pour vos projets, vous souhaiterez peut-être mettre en place une interface web simple de visualisation.
445
+ Git fournit un script CGI appelé GitWeb qui est souvent utilisé à cette fin.
446
+ Vous pouvez voir GitWeb en action sur des sites tels que `http://git.kernel.org` (voir figure 4-1).
447
+
448
+ Insert 18333fig0401.png
449
+ Figure 4-1. L'interface web de visualisation GitWeb.
450
+
451
+ Si vous souhaitez vérifier à quoi GitWeb ressemblerait pour votre projet, Git fournit une commande pour démarrer une instance temporaire de serveur si vous avez un serveur léger tel que `lighttpd` ou `webrick` sur votre système.
452
+ Sur les machines Linux, `lighttpd` est souvent pré-installé et vous devriez pouvoir le démarrer en tapant `git instaweb` dans votre répertoire de travail.
453
+ Si vous utilisez un Mac, Ruby est installé de base avec Léopard, donc `webrick` est une meilleure option.
454
+ Pour démarrer `instaweb` avec un gestionnaire autre que lighttpd, vous pouvez le lancer avec l'option `--httpd`.
455
+
456
+ $ git instaweb --httpd=webrick
457
+ [2009-02-21 10:02:21] INFO WEBrick 1.3.1
458
+ [2009-02-21 10:02:21] INFO ruby 1.8.6 (2008-03-03) [universal-darwin9.0]
459
+
460
+ Cette commande démarre un serveur HTTP sur le port 1234 et lance automatique un navigateur Internet qui ouvre la page d'accueil.
461
+ C'est vraiment très simple.
462
+ Pour arrêter le serveur, il suffit de lancer la même commande, mais avec l'option `--stop` :
463
+
464
+ $ git instaweb --httpd=webrick --stop
465
+
466
+ Si vous souhaitez fournir l'interface web en permanence sur le serveur pour votre équipe ou pour un projet opensource que vous hébergez, il sera nécessaire d'installer le script CGI pour qu'il soit appelé par votre serveur web.
467
+ Quelques distributions Linux ont un package `gitweb` qu'il suffira d'installer via `apt` ou `yum`, ce qui est une possibilité.
468
+ Nous détaillerons tout de même rapidement l'installation manuelle de GitWeb.
469
+ Premièrement, le code source de Git qui fournit GitWeb est nécessaire pour pouvoir générer un script CGI personnalisé :
470
+
471
+ $ git clone git://git.kernel.org/pub/scm/git/git.git
472
+ $ cd git/
473
+ $ make GITWEB_PROJECTROOT="/opt/git" \
474
+ prefix=/usr gitweb
475
+ $ sudo cp -Rf gitweb /var/www/
476
+
477
+ Notez que vous devez indiquer où trouver les dépôts Git au moyen de la variable `GITWEB_PROJECTROOT`.
478
+ Maintenant, il faut paramétrer dans Apache l'utilisation de CGI pour ce script, en spécifiant un nouveau VirtualHost :
479
+
480
+ <VirtualHost *:80>
481
+ ServerName gitserveur
482
+ DocumentRoot /var/www/gitweb
483
+ <Directory /var/www/gitweb>
484
+ Options ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch
485
+ AllowOverride All
486
+ order allow,deny
487
+ Allow from all
488
+ AddHandler cgi-script cgi
489
+ DirectoryIndex gitweb.cgi
490
+ </Directory>
491
+ </VirtualHost>
492
+
493
+ Une fois de plus, GitWeb peut être géré par tout serveur web capable de prendre en charge CGI.
494
+ La mise en place ne devrait pas être plus difficile avec un autre serveur.
495
+ Après redémarrage du serveur, vous devriez être capable de visiter `http://gitserveur/` pour visualiser vos dépôts en ligne et de cloner et tirer depuis ces dépôts par HTTP sur `http://git.gitserveur`.
496
+
497
+ ## Gitosis ##
498
+
499
+ Conserver les clés publiques de tous les utilisateurs dans le fichier `authorized_keys` n'est satisfaisant qu'un temps.
500
+ Avec des centaines d'utilisateurs, la gestion devient compliquée.
501
+ À chaque fois, il faut se connecter au serveur et il n'y a aucun contrôle d'accès — toute personne avec une clé dans le fichier a accès en lecture et écriture à tous les projets.
502
+
503
+ Il est temps de se tourner vers un logiciel largement utilisé appelé Gitosis.
504
+ Gitosis est une collection de scripts qui aident à gérer le fichier `authorized_keys` ainsi qu'à implémenter des contrôles d'accès simples.
505
+ La partie la plus intéressante de l'outil est que l'interface d'administration permettant d'ajouter des utilisateurs et de déterminer leurs droits n'est pas une interface web mais un dépôt Git spécial.
506
+ Vous paramétrez les informations dans ce projet et lorsque vous le poussez, Gitosis reconfigure les serveurs en fonction des données, ce qui est cool.
507
+
508
+ L'installation de Gitosis n'est pas des plus aisées.
509
+ Elle est plus simple sur un serveur Linux — les exemples qui suivent utilisent une distribution Ubuntu Server 8.10 de base.
510
+
511
+ Gitosis nécessite des outils Python.
512
+ Il faut donc installer le paquet Python setuptools qu'Ubuntu fournit en tant que python-setuptools :
513
+
514
+ $ apt-get install python-setuptools
515
+
516
+ Ensuite, il faut cloner et installer Gitosis à partir du site principal du projet :
517
+
518
+ $ git clone https://github.com/tv42/gitosis.git
519
+ $ cd gitosis
520
+ $ sudo python setup.py install
521
+
522
+ La dernière commande installe deux exécutables que Gitosis utilisera.
523
+ Ensuite, Gitosis veut gérer ses dépôts sous `/home/git`, ce qui est parfait.
524
+ Mais vous avez déjà installé vos dépôts sous `/opt/git`, donc au lieu de tout reconfigurer, créez un lien symbolique :
525
+
526
+ $ ln -s /opt/git /home/git/repositories
527
+
528
+ Comme Gitosis gèrera vos clés pour vous, il faut effacer le fichier `authorized_keys`, réintroduire les clés plus tard, et laisser Gitosis contrôler le fichier automatiquement.
529
+ Pour l'instant, déplacez le fichier `authorized_keys` ailleurs :
530
+
531
+ $ mv /home/git/.ssh/authorized_keys /home/git/.ssh/ak.bak
532
+
533
+ Ensuite, il faut réactiver le shell pour l'utilisateur « git » si vous l'avez désactivé au moyen de `git-shell`.
534
+ Les utilisateurs ne pourront toujours pas se connecter car Gitosis contrôlera cet accès.
535
+ Modifions la ligne dans le fichier `/etc/passwd` :
536
+
537
+ git:x:1000:1000::/home/git:/usr/bin/git-shell
538
+
539
+ pour la version d'origine :
540
+
541
+ git:x:1000:1000::/home/git:/bin/sh
542
+
543
+ Vous pouvez maintenant initialiser Gitosis en lançant la commande `gitosis-init` avec votre clé publique.
544
+ Si votre clé publique n'est pas présente sur le serveur, il faut l'y télécharger :
545
+
546
+ $ sudo -H -u git gitosis-init < /tmp/id_dsa.pub
547
+ Initialized empty Git repository in /opt/git/gitosis-admin.git/
548
+ Reinitialized existing Git repository in /opt/git/gitosis-admin.git/
549
+
550
+ Cela permet à l'utilisateur disposant de cette clé de modifier le dépôt Git qui contrôle le paramétrage de Gitosis.
551
+ Ensuite, il faudra positionner manuellement le bit « execute » du script `post-update` du dépôt de contrôle nouvellement créé.
552
+
553
+ $ sudo chmod 755 /opt/git/gitosis-admin.git/hooks/post-update
554
+
555
+ Vous voilà prêt.
556
+ Si tout est réglé correctement, vous pouvez essayer de vous connecter par SSH au serveur en tant que l'utilisateur pour lequel vous avez ajouté la clé publique lors de l'initialisation de Gitosis.
557
+ Vous devriez voir quelque chose comme :
558
+
559
+ $ ssh git@gitserveur
560
+ PTY allocation request failed on channel 0
561
+ fatal: unrecognized command 'gitosis-serve schacon@quaternion'
562
+ Connection to gitserveur closed.
563
+
564
+ Cela signifie que Gitosis vous a bien reconnu mais vous a rejeté car vous ne lancez pas de commandes Git.
565
+ Lançons donc une vraie commande Git en clonant le dépôt de contrôle Gitosis :
566
+
567
+ # sur votre ordinateur local
568
+ $ git clone git@gitserveur:gitosis-admin.git
569
+
570
+ Vous avez à présent un répertoire `gitosis-admin` qui contient deux entrées :
571
+
572
+ $ cd gitosis-admin
573
+ $ find .
574
+ ./gitosis.conf
575
+ ./keydir
576
+ ./keydir/scott.pub
577
+
578
+ Le fichier `gitosis.conf` est le fichier de configuration qui permet de spécifier les utilisateurs, les dépôts et les permissions.
579
+ Le répertoire `keydir` stocke les clés publiques de tous les utilisateurs qui peuvent avoir un accès à vos dépôts — un fichier par utilisateur.
580
+ Le nom du fichier dans `keydir` (dans l'exemple précédent, `scott.pub`) sera différent pour vous — Gitosis utilise le nom issu de la description à la fin de la clé publique qui a été importée par le script `gitosis-init`.
581
+
582
+ Le fichier `gitosis.conf` contient la configuration du projet `gitosis-admin` cloné à l'instant :
583
+
584
+ $ cat gitosis.conf
585
+ [gitosis]
586
+
587
+ [group gitosis-admin]
588
+ writable = gitosis-admin
589
+ members = scott
590
+
591
+ Il indique que l'utilisateur « scott » — l'utilisateur dont la clé publique a servi à initialiser Gitosis — est le seul à avoir accès au projet `gitosis-admin`.
592
+
593
+ À présent, ajoutons un nouveau projet.
594
+ Ajoutons une nouvelle section appelée `mobile` où vous listez les développeurs de votre équipe mobile et les projets auxquels ces développeurs ont accès.
595
+ Comme « scott » est le seul utilisateur déclaré pour l'instant, vous devrez l'ajouter comme membre unique et vous créerez un nouveau projet appelé `iphone_projet` pour commencer :
596
+
597
+ [group mobile]
598
+ writable = iphone_projet
599
+ members = scott
600
+
601
+ À chaque modification du projet `gitosis-admin`, il est nécessaire de valider les changements et de les pousser sur le serveur pour qu'ils prennent effet :
602
+
603
+ $ git commit -am 'ajout iphone_projet et groupe mobile'
604
+ [master]: created 8962da8: "changed name"
605
+ 1 files changed, 4 insertions(+), 0 deletions(-)
606
+ $ git push
607
+ Counting objects: 5, done.
608
+ Compressing objects: 100% (2/2), done.
609
+ Writing objects: 100% (3/3), 272 bytes, done.
610
+ Total 3 (delta 1), reused 0 (delta 0)
611
+ To git@gitserver:/opt/git/gitosis-admin.git
612
+ fb27aec..8962da8 master -> master
613
+
614
+ Vous pouvez pousser vers le nouveau `iphone_projet` en ajoutant votre serveur comme dépôt distant dans votre dépôt local de projet et en poussant.
615
+ Vous n'avez plus besoin de créer manuellement un dépôt nu sur le serveur pour les nouveaux projets.
616
+ Gitosis les crée automatiquement dès qu'il voit la première poussée :
617
+
618
+ $ git remote add origin git@gitserveur:iphone_projet.git
619
+ $ git push origin master
620
+ Initialized empty Git repository in /opt/git/iphone_projet.git/
621
+ Counting objects: 3, done.
622
+ Writing objects: 100% (3/3), 230 bytes, done.
623
+ Total 3 (delta 0), reused 0 (delta 0)
624
+ To git@gitserver:iphone_project.git
625
+ * [new branch] master -> master
626
+
627
+ Notez qu'il est inutile de spécifier le chemin distant (en fait, c'est interdit), juste deux points et le nom du projet.
628
+ Gitosis gère les chemins.
629
+
630
+ Souhaitant travailler sur ce projet avec vos amis, vous devrez rajouter leurs clés publiques.
631
+ Plutôt que de les accoler manuellement au fichier `~/.ssh/authorized_keys` de votre serveur, il faut les ajouter, une clé par fichier, dans le répertoire `keydir`.
632
+ Le nom de fichier détermine le nom de l'utilisateur dans le fichier `gitosis.conf`.
633
+ Rajoutons les clés publiques de John, Josie et Jessica :
634
+
635
+ $ cp /tmp/id_rsa.john.pub keydir/john.pub
636
+ $ cp /tmp/id_rsa.josie.pub keydir/josie.pub
637
+ $ cp /tmp/id_rsa.jessica.pub keydir/jessica.pub
638
+
639
+ Vous pouvez maintenant les ajouter tous à votre équipe `mobile` pour qu'ils aient accès en lecture/écriture à `iphone_projet` :
640
+
641
+ [group mobile]
642
+ writable = iphone_project
643
+ members = scott john josie jessica
644
+
645
+ Après validation et poussée vers le serveur, les quatre utilisateurs sont admis à lire et écrire sur ce projet.
646
+
647
+ Gitosis fournit aussi des permissions simples.
648
+ Si vous souhaitez que John n'ait qu'un accès en lecture à ce projet, vous pouvez configurer ceci plutôt :
649
+
650
+ [group mobile]
651
+ writable = iphone_projet
652
+ members = scott josie jessica
653
+
654
+ [group mobile_ro]
655
+ readonly = iphone_projet
656
+ members = john
657
+
658
+ À présent, John peut cloner le projet et récupérer les mises à jour, mais Gitosis lui refusera de pousser sur ce projet.
659
+ Vous pouvez créer autant que groupes que vous désirez contenant des utilisateurs et projets différents.
660
+ Vous pouvez aussi spécifier un autre groupe comme membre du groupe (avec le préfixe `@`) pour faire hériter ses membres automatiquement :
661
+
662
+ [group mobile_committers]
663
+ members = scott josie jessica
664
+
665
+ [group mobile]
666
+ writable = iphone_projet
667
+ members = @mobile_committers
668
+
669
+ [group mobile_2]
670
+ writable = autre_iphone_projet
671
+ members = @mobile_committers john
672
+
673
+ Si vous rencontrez des problèmes, il peut être utile d'ajouter `loglevel=DEBUG` sous la section `[gitosis]`.
674
+ Si vous avez perdu le droit de pousser en envoyant une configuration vérolée, vous pouvez toujours réparer le fichier `/home/git/.gitosis.conf` sur le serveur — le fichier dans lequel Gitosis lit sa configuration.
675
+ Pousser sur le projet `gitosis-admin` provoque la recopie du fichier `gitosis.conf` à cet endroit.
676
+ Si vous éditez ce fichier à la main, il restera dans cet état jusqu'à la prochaine poussée.
677
+
678
+ ## Gitolite ##
679
+
680
+ Cette section constitue une introduction à Gitolite et fournit des instructions de base pour son installation et sa mise en œuvre.
681
+ Elle ne peut pas cependant se substituer à l'importante quantité de [documentation][gldpg] fournie avec Gitolite.
682
+ Il se peut qu'elle subisse aussi occasionnellement quelques corrections qui sont disponibles [ici][gltoc].
683
+
684
+ [gldpg]: http://sitaramc.github.com/gitolite/progit.html
685
+ [gltoc]: http://sitaramc.github.com/gitolite/master-toc.html
686
+
687
+ Gitolite est une couche de gestion d'accès posée au dessus de Git, reposant sur `sshd` et `httpd` pour l'authentification.
688
+ L'authentification consiste à identifier l'utilisateur, la gestion d'accès permet de décider si celui-ci est autorisé à accomplir ce qu'il s'apprête à faire.
689
+
690
+ ### Installation ###
691
+
692
+ L'installation de Gitolite est très simple, même sans lire la documentation extensive qui l'accompagne.
693
+ Vous n'avez besoin que d'un compte sur un serveur de type Unix.
694
+ Vous n'avez pas besoin d'accès root si Git, Perl et un serveur compatible OpenSSH sont déjà installés.
695
+ Dans les exemples qui suivent, un compte `git` sur un serveur `gitserver` sera utilisé.
696
+
697
+ Pour commencer, créez un utilisateur nommé `git` et loggez-vous avec cet utilisateur.
698
+ Copiez votre clé publique SSH depuis votre station de travail en la renommant `<votrenom>.pub` (nous utiliserons `scott.pub` pour l'exemple de cette section).
699
+ Ensuite, lancez les commandes ci-dessous :
700
+
701
+ $ git clone git://github.com/sitaramc/gitolite
702
+ $ gitolite/install -ln
703
+ # suppose que $HOME/bin existe et apparaît dans $PATH
704
+ $ gitolite setup -pk $HOME/scott.pub
705
+
706
+ Cette dernière commande crée un nouveau dépôt Git appelé `gitolite-admin` sur le serveur.
707
+
708
+ Enfin, de retour sur la station de travail, lancez `git clone git@gitserver:gitolite-admin`.
709
+ C'est fini !
710
+ Gitolite est à présent installé sur le serveur ainsi qu'un nouveau dépôt appelé `gitolite-admin` qui a été cloné sur la station de travail.
711
+ L'administration de Gitolite passe par des modifications dans ce dépôt suivies d'une poussée sur le serveur.
712
+
713
+
714
+ ### Personnalisation de l'installation ###
715
+
716
+ L'installation rapide par défaut suffit à la majorité des besoins, mais il existe des moyens de la paramétrer plus finement.
717
+ Ces modifications sont réalisées en éditant le fichier « rc » utilisé par le serveur, mais si cela ne s'avère pas suffisant, il existe plus d'information dans la documentation sur la personnalisation de Gitolite.
718
+
719
+ ### Fichier de configuration et règles de contrôle d'accès ###
720
+
721
+ Une fois l'installation terminée, vous pouvez basculer vers le clone `gitolite-admin` présent sur votre station de travail et inspecter ce qui s'y trouve :
722
+
723
+ $ cd ~/gitolite-admin/
724
+ $ ls
725
+ conf/ keydir/
726
+ $ find conf keydir -type f
727
+ conf/gitolite.conf
728
+ keydir/scott.pub
729
+ $ cat conf/gitolite.conf
730
+
731
+ repo gitolite-admin
732
+ RW+ = scott
733
+
734
+ repo testing
735
+ RW+ = @all
736
+
737
+ Notez que « scott » (le nom de la clé publique pour la commande `gl-setup` ci-dessus) détient les permissions en lecture/écriture sur le dépôt `gitolite-admin` ainsi qu'une clé publique du même nom.
738
+
739
+ L'ajout d'utilisateurs est simple.
740
+ Pour ajouter une utilisatrice appelée « alice », demandez-lui de vous fournir une clé publique SSH, renommez-la `alice.pub`, et placez-la dans le répertoire `keydir` du clone du dépôt `gitolite-admin` sur la station de travail.
741
+ Validez le fichier dans le dépôt et poussez les modifications sur le serveur.
742
+ L'utilisatrice « alice » vient d'être ajoutée.
743
+
744
+ Le fichier de configuration est richement commenté et nous n'allons donc mentionner ici que quelques points principaux.
745
+
746
+ Pour vous simplifier la tâche, vous pouvez grouper les utilisateurs et les dépôts.
747
+ Les noms de groupes sont juste comme des macros.
748
+ À leur définition, il importe peu que ce soient des projets ou des utilisateurs.
749
+ Cette distinction ne sert que lors de *l'utilisation* de la « macro ».
750
+
751
+ @oss_repos = linux perl rakudo git gitolite
752
+ @secret_repos = fenestra pear
753
+
754
+ @admins = scott
755
+ @interns = ashok
756
+ @engineers = sitaram dilbert wally alice
757
+ @staff = @admins @engineers @interns
758
+
759
+ Vous pouvez contrôler les permissions au niveau « ref ».
760
+ Dans l'exemple suivant, les stagiaires (intern) ne peuvent pousser que sur la branche « int ».
761
+ Les ingénieurs peuvent pousser toutes les branches dont le nom commence par « eng » et les étiquettes qui commencent par « rc » suivi d'un chiffre.
762
+ Les administrateurs ont tous les droits (y compris le rembobinage) sur toutes les `refs`.
763
+
764
+ repo @oss_repos
765
+ RW int$ = @interns
766
+ RW eng- = @engineers
767
+ RW refs/tags/rc[0-9] = @engineers
768
+ RW+ = @admins
769
+
770
+ L'expression après les `RW` ou les `RW+` est une expression rationnelle (*regular expression* ou regex) qui filtre le nom de la référence (`ref`).
771
+ Elle s'appelle donc une « refex » !
772
+ Bien entendu, une « refex » peut être bien plus puissante que celles montrées ci-dessus et il est inutile de trop chercher si vous n'êtes pas à l'aise avec les regex Perl.
773
+
774
+ De plus, logiquement, Gitolite préfixe les refex qui ne commencent pas par `refs/` avec la chaîne `refs/heads/`.
775
+
776
+ Une autre particularité importante de la syntaxe du fichier de configuration est que toutes les règles ne sont pas nécessairement à un seul endroit.
777
+ On peut conserver toute la configuration commune, telle que l'ensemble des règles pour tous les dépôts `oss_repo` ci-dessus au début puis ajouter des règles spécifiques plus loin, comme :
778
+
779
+ repo gitolite
780
+ RW+ = sitaram
781
+
782
+ Cette règle sera juste ajoutée à l'ensemble des règles préexistantes du dépôt `gitolite`.
783
+
784
+ Du coup, il est nécessaire d'expliciter la politique d'application des règles de contrôle d'accès.
785
+
786
+ Il existe deux niveaux de contrôle d'accès dans Gitolite.
787
+ Le premier réside au niveau du dépôt.
788
+ Si vous avez un droit d'accès en lecture (resp. en écriture) à *n'importe quelle* `ref` du dépôt, alors vous avez accès en lecture (resp. en écriture) au dépôt.
789
+
790
+ Le second niveau, applicable seulement pour l'accès en écriture, se focalise sur les branches et les étiquettes dans un dépôt.
791
+ L'utilisateur, le type d'accès en cours (`W` ou `+`) et le nom de la référence permettent de définir les critères.
792
+ Les règles d'accès sont vérifiées par ordre d'apparition dans le fichier de configuration, par recherche d'une correspondance sur cette combinaison (en se souvenant que la correspondance de référence est une refex, non une simple comparaison).
793
+ Si une correspondance est trouvée, l'accès en poussée est accepté.
794
+ Si aucune correspondance n'est trouvée, l'accès est refusé.
795
+
796
+ ### Contrôle d'accès avancé avec les règles « deny » ###
797
+
798
+ Jusqu'ici, les seuls types de permissions rencontrés ont été `R`, `RW` ou `RW+`.
799
+ Néanmoins, Gitolite connaît une autre permission : `-` qui signifie « deny », accès refusé.
800
+ Cela vous donne bien plus de possibilités, au prix d'une complexité accrue car à présent l'absence de correspondance n'est plus la *seule* manière de refuser l'accès, mais il devient nécessaire de faire attention à l'ordre des règles !
801
+
802
+ Supposons que dans la situation ci-dessus, nous souhaitons que les ingénieurs soient capables de rembobiner n'importe quelle branche *excepté* master et integ.
803
+ Voici comment faire :
804
+
805
+ RW master integ = @engineers
806
+ - master integ = @engineers
807
+ RW+ = @engineers
808
+
809
+ Une fois encore, il suffit de suivre simplement les règles de haut en bas jusqu'à rencontrer une correspondance pour votre mode d'accès ou de refus.
810
+ Les poussées en non-rembobinage sur master ou integ sont permises par la première règle.
811
+ Les poussées en rembobinage à ces références n'ont pas de correspondance dans la première règle et se poursuivent par la seconde qui les refuse.
812
+ Toute poussée (en rembobinage ou non) à des `refs` autres que master ou integ ne correspondra pas aux deux premières règles et sera permise par la troisième.
813
+
814
+ ### Restriction des poussées sur les fichiers modifiés ###
815
+
816
+ En sus de la restriction sur les branches utilisables par un utilisateur, il est possible de mettre en place des restrictions sur les fichiers qu'il aura droit de toucher.
817
+ Par exemple, un Makefile (ou tout autre script) n'est pas supposé être modifié par n'importe qui, du fait que de nombreuses choses en dépendent et qu'une modification non maîtrisée pourrait casser beaucoup de choses.
818
+ Vous pouvez indiquer à Gitolite :
819
+
820
+ repo foo
821
+ RW = @junior_devs @senior_devs
822
+
823
+ RW NAME/ = @senior_devs
824
+ - NAME/Makefile = @junior_devs
825
+ RW NAME/ = @junior_devs
826
+ - VREF/NAME/Makefile = @junior_devs
827
+
828
+ Les utilisateurs migrant depuis une version précédente de Gitolite pourront noter qu'il y a une modification significative du comportement de cette fonctionnalité.
829
+ Référez-vous au guide de migration pour plus de détails.
830
+
831
+ ### Branches personnelles ###
832
+
833
+ Gitolite a aussi une fonction appelée « branches personnelles » (ou plutôt « espace de branches personnelles ») qui peut s'avérer très utiles en environnement professionnel.
834
+
835
+ Dans le monde de Git, une grande quantité d'échange de code se passe par requêtes de tirage.
836
+ En environnement professionnel, cependant, les accès non-authentifiés sont inimaginables et une authentification poste à poste est impossible.
837
+ Il est donc nécessaire de pousser sur le serveur central et demander à quelqu'un d'en tirer.
838
+
839
+ Cela provoquerait normalement le même bazar de branches que dans les VCS centralisés, avec en plus la surcharge pour l'administrateur de la gestion des permissions.
840
+
841
+ Gitolite permet de définir un préfixe d'espace de nom « personnel » ou « brouillon » pour chaque développeur (par exemple, `refs/personnel/<nom du dev>/*`).
842
+ Référez-vous à la documentation pour plus de détails.
843
+
844
+ ### Dépôts « joker » ###
845
+
846
+ Gitolite permet de spécifier des dépôts avec jokers (en fait des regex Perl), comme par exemple, au hasard, `devoirs/s[0-9][0-9]/a[0-9][0-9]`.
847
+ Un nouveau mode de permission devient accessible (`C`).
848
+ En suivant ces schémas de nommage, les utilisateurs peuvent alors créer des dépôts dont ils seront automatiquement propriétaires, leur permettant ainsi de leur assigner des droits en lecture ou lecture/écriture pour d'autres utilisateurs avec lesquels ils souhaitent collaborer.
849
+ Référez-vous à la documentation pour plus de détail.
850
+
851
+ ### Autres fonctionnalités ###
852
+
853
+ Nous terminerons cette section avec quelques échantillons d'autres fonctions qui sont toutes décrites, ainsi que d'autres dans la documentation.
854
+
855
+ **Journalisation** : Gitolite enregistre tous les accès réussis.
856
+ Si vous étiez réticent à donner aux utilisateurs des droits de rembobiner (`RW+`) et qu'un plaisantin a complètement cassé « master », le journal des activités est là pour vous aider à trouver facilement et rapidement le SHA qui a tout déclenché.
857
+
858
+ **Rapport sur les droits d'accès** : une autre fonctionnalité très utile concerne la prise en charge de la connexion SSH au serveur.
859
+ Gitolite vous affiche à quels dépôts vous pouvez accéder et avec quels droits.
860
+ Ci-dessous un exemple :
861
+
862
+ hello scott, this is git@git running gitolite3 \
863
+ v3.01-18-g9609868 on git 1.7.4.4
864
+
865
+ R anu-wsd
866
+ R entrans
867
+ R W git-notes
868
+ R W gitolite
869
+ R W gitolite-admin
870
+ R indic_web_input
871
+ R shreelipi_converter
872
+
873
+ **Délégation** : Pour les grands déploiements, il est possible de déléguer la responsabilité de groupes de dépôts à différentes personnes en leur permettant de les gérer de manière autonome.
874
+ Cela permet de réduire la charge de travail de l'administrateur principal et évite d'en faire un goulet d'étranglement.
875
+
876
+ **Miroirs** : Gitolite peut vous aider à maintenir de multiples miroirs et à basculer simplement entre eux si le miroir principal tombe en panne.
877
+
878
+ ## Le *daemon* Git ##
879
+
880
+ Pour garantir les accès publics non authentifiés en lecture à vos projets, il est préférable de dépasser le protocole HTTP et de commencer à utiliser le protocole Git.
881
+ La raison principale en est la vitesse.
882
+ Le protocole Git est bien plus efficace et de ce fait plus rapide que le protocole HTTP et fera gagner du temps à vos utilisateurs.
883
+
884
+ Ce système n'est valable que pour les accès non authentifiés en lecture seule.
885
+ Si vous mettez ceci en place sur un serveur à l'extérieur de votre pare-feu, il ne devrait être utilisé que pour des projets qui sont destinés à être visibles publiquement par le monde entier.
886
+ Si le serveur est derrière le pare-feu, il peut être utilisé pour des projets avec accès en lecture seule pour un grand nombre d'utilisateurs ou des ordinateurs (intégration continue ou serveur de compilation) pour lequels vous ne souhaitez pas avoir à gérer des clés SSH.
887
+
888
+ En tout cas, le protocole Git est relativement facile à mettre en place.
889
+ Grossièrement, il suffit de lancer la commande suivante en tant que *daemon* :
890
+
891
+ git daemon --reuseaddr --base-path=/opt/git/ /opt/git/
892
+
893
+ `--reuseaddr` autorise le serveur à redémarrer sans devoir attendre que les anciennes connexions expirent, l'option `--base-path` autorise les gens à cloner des projets sans devoir spécifier le chemin complet, et le chemin en fin de ligne indique au *daemon* Git l'endroit où chercher des dépôts à exporter.
894
+ Si vous utilisez un pare-feu, il sera nécessaire de rediriger le port 9418 sur la machine hébergeant le serveur.
895
+
896
+ Transformer ce processus en *daemon* se réalise par différentes manières qui dépendent du système d'exploitation sur lequel il est lancé.
897
+ Sur une machine Ubuntu, c'est un script Upstart.
898
+ Donc dans le fichier :
899
+
900
+ /etc/event.d/local-git-daemon
901
+
902
+ vous mettez le script suivant :
903
+
904
+ start on startup
905
+ stop on shutdown
906
+ exec /usr/bin/git daemon \
907
+ --user=git --group=git \
908
+ --reuseaddr \
909
+ --base-path=/opt/git/ \
910
+ /opt/git/
911
+ respawn
912
+
913
+ Par sécurité, ce *daemon* devrait être lancé par un utilisateur n'ayant que des droits de lecture seule sur les dépôts — simplement en créant un nouvel utilisateur « git-ro » qui servira à lancer le *daemon*.
914
+ Par simplicité, nous le lancerons avec le même utilisateur « git » qui est utilisé par Gitosis.
915
+
916
+ Au rédémarrage de la machine, votre *daemon* Git démarrera automatiquement et redémarrera s'il meurt.
917
+ Pour le lancer sans avoir à redémarrer, vous pouvez lancer ceci :
918
+
919
+ initctl start local-git-daemon
920
+
921
+ Sur d'autres systèmes, le choix reste large, allant de `xinetd` à un script de système `sysvinit` ou à tout autre moyen — tant que le programme est démonisé et surveillé.
922
+
923
+ Ensuite, il faut spécifier à votre serveur Gitosis les dépôts à autoriser en accès Git.
924
+ Si vous ajoutez une section pour chaque dépôt, vous pouvez indiquer ceux que vous souhaitez servir en lecture via votre *daemon* Git.
925
+ Par exemple, si vous souhaitez un accès par protocole Git à votre projet iphone, ajoutez ceci à la fin du fichier `gitosis.conf` :
926
+
927
+ [repo iphone_projet]
928
+ daemon = yes
929
+
930
+ Une fois cette configuration validée et poussée, votre *daemon* devrait commencer à servir des requêtes pour ce projet à toute personne ayant accès au port 9518 de votre serveur.
931
+
932
+ Si vous décidez de ne pas utiliser Gitosis, mais d'utiliser un *daemon* Git, il faudra lancer les commandes suivantes sur chaque projet que vous souhaitez faire servir par le *daemon* Git :
933
+
934
+ $ cd /chemin/au/projet.git
935
+ $ touch git-daemon-export-ok
936
+
937
+ La présence de ce fichier indique à Git que ce projet peut être servi sans authentification.
938
+
939
+ Gitosis peut aussi contrôler les projets que GitWeb publie.
940
+ Premièrement, il faut ajouter au fichier `/etc/gitweb.conf` quelque chose comme :
941
+
942
+ $projects_list = "/home/git/gitosis/projects.list";
943
+ $projectroot = "/home/git/repositories";
944
+ $export_ok = "git-daemon-export-ok";
945
+ @git_base_url_list = ('git://gitserver');
946
+
947
+ Vous pouvez contrôler les projets publiés sur GitWeb en ajoutant ou retirant une propriété `gitweb` au fichier de configuration de Gitosis.
948
+ Par exemple, si vous voulez que le projet iphone soit visible sur GitWeb, le paramétrage `repo` doit être le suivant :
949
+
950
+ [repo iphone_projet]
951
+ daemon = yes
952
+ gitweb = yes
953
+
954
+ Maintenant, si vous validez et poussez le projet `gitosis-admin`, GitWeb commencera automatiquement à publier votre projet iphone.
955
+
956
+ ## Git hébergé ##
957
+
958
+ Si vous ne vous ne voulez pas vous investir dans la mise en place de votre propre serveur Git, il reste quelques options pour héberger vos projets Git sur un site externe dédié à l'hébergement.
959
+ Cette méthode offre de nombreux avantages : un site en hébergement est généralement rapide à créer et facilite le démarrage de projets, et n'implique pas de maintenance et de surveillance de serveur.
960
+ Même si vous montez et faites fonctionner votre serveur en interne, vous souhaiterez surement utiliser un site d'hébergement public pour votre code open source — cela rend généralement plus facile l'accès et l'aide par la communauté.
961
+
962
+ Aujourd'hui, vous avez à disposition un nombre impressionnant d'options d'hébergement, chacune avec différents avantages et désavantages.
963
+ Pour une liste à jour, référez-vous à la page suivante :
964
+
965
+ https://git.wiki.kernel.org/index.php/GitHosting
966
+
967
+ Comme nous ne pourrons pas les passer toutes en revue, et comme de plus, il s'avère que je travaille pour l'une d'entre elles, nous utiliserons ce chapitre pour détailler la création d'un compte et d'un nouveau projet sur GitHub.
968
+ Cela vous donnera une idée de ce qui est nécessaire.
969
+
970
+ GitHub est de loin le plus grand site d'hébergement open source sur Git et c'est aussi un des rares à offrir à la fois des options d'hébergement public et privé, ce qui vous permet de conserver vos codes open source et privés au même endroit.
971
+ En fait, nous avons utilisé GitHub pour collaborer en privé sur ce livre.
972
+
973
+ ### GitHub ###
974
+
975
+ GitHub est légèrement différent de la plupart des sites d'hébergement de code dans le sens où il utilise un espace de noms pour les projets.
976
+ Au lieu d'être principalement orienté projet, GitHub est orienté utilisateur.
977
+ Cela signifie que lorsque j'héberge mon projet `grit` sur GitHub, vous ne le trouverez pas à `github.com/grit` mais plutôt à `github.com/schacon/grit`.
978
+ Il n'y a pas de dépôt canonique d'un projet, ce qui permet à un projet de se déplacer d'un utilisateur à l'autre sans transition si le premier auteur abandonne le projet.
979
+
980
+ GitHub est aussi une société commerciale qui facture les comptes qui utilisent des dépôts privés, mais tout le monde peut rapidement obtenir un compte gratuit pour héberger autant de projets libres que désiré.
981
+ Nous allons détailler comment faire.
982
+
983
+ ### Création d'un compte utilisateur ###
984
+
985
+ La première chose à faire, c'est de créer un compte utilisateur gratuit.
986
+ Visitez la page « Plans and pricing » (plans et prix) à `https://github.com/pricing` et cliquez sur le bouton « Create a free account » (créer un compte gratuit) de la zone « Free for open source » (gratuit pour l'open source) (voir figure 4-2) qui vous amène à la page d'enregistrement.
987
+
988
+ Insert 18333fig0402.png
989
+ Figure 4-2. La page des différents plans de GitHub.
990
+
991
+ Vous devez choisir un nom d'utilisateur qui n'est pas déjà utilisé dans le système et saisir une adresse e-mail qui sera associée au compte et un mot de passe (voir figure 4-3).
992
+
993
+ Insert 18333fig0403.png
994
+ Figure 4-3. La page d'enregistrement de GitHub.
995
+
996
+ Si vous l'avez, c'est le bon moment pour ajouter votre clé publique SSH.
997
+ Nous avons détaillé comment en générer précédemment au chapitre « Petites installations ».
998
+ Copiez le contenu de la clé publique et collez-le dans la boîte à texte « SSH Public Keys » (clés SSH publiques).
999
+ En cliquant sur le lien « Need help with public keys? » (besoin d'aide avec les clés publiques ?), vous aurez accès aux instructions (en anglais) pour créer des clés sur la majorité des systèmes d'exploitation.
1000
+ Cliquez sur le bouton « I agree, sign me up » (j'accepte, enregistrez-moi) pour avoir accès à votre tableau de bord de nouvel utilisateur (voir figure 4-4).
1001
+
1002
+ Insert 18333fig0404.png
1003
+ Figure 4-4. Le tableau de bord d'utilisateur de GitHub.
1004
+
1005
+ Vous pouvez ensuite procéder à la création d'un nouveau dépôt.
1006
+
1007
+ ### Création d'un nouveau dépôt ###
1008
+
1009
+ Commencez en cliquant sur le bouton gris « New Repository » juste à côté de « Your Repositories » (vos dépôts) sur le tableau de bord utilisateur.
1010
+ Un formulaire « Create a New Repository » (créer un nouveau dépôt) apparaît pour vous guider dans la création d'un nouveau dépôt (voir figure 4-5).
1011
+
1012
+ Insert 18333fig0405.png
1013
+ Figure 4-5. Création d'un nouveau dépôt sur GitHub.
1014
+
1015
+ Le strict nécessaire consiste à fournir un nom au projet, mais vous pouvez aussi ajouter une description.
1016
+ Ensuite, cliquez sur le bouton « Create Repository » (créer un dépôt).
1017
+ Voilà un nouveau dépôt sur GitHub (voir figure 4-6).
1018
+
1019
+ Insert 18333fig0406.png
1020
+ Figure 4-6. Information principale d'un projet GitHub.
1021
+
1022
+ Comme il n'y a pas encore de code, GitHub affiche les instructions permettant de créer un nouveau projet, de pousser un projet Git existant ou d'importer un projet depuis un dépôt Subversion public (voir figure 4-7).
1023
+
1024
+ Insert 18333fig0407.png
1025
+ Figure 4-7. Instructions pour un nouveau dépôt.
1026
+
1027
+ Ces instructions sont similaires à ce que nous avons déjà décrit.
1028
+ Pour initialiser un projet qui n'est pas déjà dans Git, tapez :
1029
+
1030
+ $ git init
1031
+ $ git add .
1032
+ $ git commit -m 'premiere validation'
1033
+
1034
+ Dans le cas d'un projet Git local, ajoutez GitHub comme dépôt distant et poussez-y votre branche master :
1035
+
1036
+ $ git remote add origin git@github.com:testinguser/iphone_projet.git
1037
+ $ git push origin master
1038
+
1039
+ Votre projet est à présent hébergé sur GitHub et vous pouvez fournir l'URL à toute personne avec qui vous souhaitez le partager.
1040
+ Dans notre cas, il s'agit de `http://github.com/testinguser/iphone_projet`.
1041
+ Vous pouvez aussi voir dans l'en-tête de la page de chaque projet qu'il y a deux URL Git (voir figure 4-8).
1042
+
1043
+ Insert 18333fig0408.png
1044
+ Figure 4-8. En-tête de projet avec une URL publique et une URL privée.
1045
+
1046
+ L'URL « Git Read-Only » (Git en lecture seule) est une URL Git publique en lecture seule que tout le monde peut cloner.
1047
+ Utilisez cette URL pour publier et partager votre dépôt sur un site web ou autre.
1048
+
1049
+ Votre URL « SSH » est une URL SSH en lecture/écriture qui ne vous permet de lire et écrire que si vous possédez la clé privée associée à la clé publique téléchargée pour votre utilisateur.
1050
+ Quand d'autres utilisateurs visiteront cette page de projet, ils ne verront pas cette URL, ils ne verront que l'URL publique.
1051
+
1052
+ ### Import depuis Subversion ###
1053
+
1054
+ Si vous souhaitez importer un projet public sous Subversion dans Git, GitHub peut vous faciliter la tâche.
1055
+ Il y a un lien « Importing a SVN Repo? Click here » (Vous importez un dépôt Subversion ? Cliquez ici) au bas de la page d'instructions.
1056
+ En le cliquant, vous accédez à un formulaire contenant des informations sur le processus d'import et une boîte à texte où vous pouvez coller l'URL de votre dépôt public Subversion (voir figure 4-9).
1057
+
1058
+ Insert 18333fig0409.png
1059
+ Figure 4-9. Interface d'import depuis Subversion.
1060
+
1061
+ Si votre projet est très gros, ne suit pas les standards de nommage ou est privé, cette méthode risque de ne pas fonctionner.
1062
+ Au chapitre 7, nous traiterons des imports manuels plus compliqués de projets.
1063
+
1064
+ ### Ajout des collaborateurs ###
1065
+
1066
+ Ajoutons le reste de l'équipe.
1067
+ Si John, Josie et Jessica ouvrent tous un compte sur GitHub, et que vous souhaitez leur donner un accès en écriture à votre dépôt, vous pouvez les ajouter à votre projet comme collaborateurs.
1068
+ Cela leur permettra de pousser leur travail sur le dépôt avec leurs clés privées.
1069
+
1070
+ Cliquez sur le bouton « Admin » dans l'en-tête du projet pour accéder à la page d'administration de votre projet GitHub (voir figure 4-10).
1071
+
1072
+ Insert 18333fig0410.png
1073
+ Figure 4-10. Page d'administration GitHub.
1074
+
1075
+ Pour accorder à un autre utilisateur l'accès en écriture au projet, cliquez sur l'onglet « Collaborators » (Collaborateurs).
1076
+ Vous pouvez entrer le nom de l'utilisateur dans la boîte à texte qui apparaît.
1077
+ Au fur et à mesure de votre frappe, une liste déroulante affiche les noms qui correspondent aux caractères tapés.
1078
+ Lorsque vous avez trouvé l'utilisateur correct, cliquez sur le bouton « Add » (Ajouter) pour ajouter l'utilisateur comme collaborateur au projet (voir figure 4-11).
1079
+
1080
+ Insert 18333fig0411.png
1081
+ Figure 4-11. Ajout d'un collaborateur à votre projet.
1082
+
1083
+ Lorsque vous avez fini d'ajouter des collaborateurs, vous devriez les voir en liste dans la boîte « Repository Collaborators » (voir figure 4-12).
1084
+
1085
+ Insert 18333fig0412.png
1086
+ Figure 4-12. Une liste des collaborateurs sur votre projet.
1087
+
1088
+ Si vous devez révoquer l'accès à certaines personnes, vous pouvez cliquer sur la croix rouge leur correspondant et leur accès en écriture sera effacé.
1089
+ Pour des projets futurs vous pouvez aussi copier des groupes de collaborateurs en copiant les permissions d'un projet existant.
1090
+
1091
+ ### Votre projet ###
1092
+
1093
+ Une fois que vous avez poussé votre projet ou l'avez importé depuis Subversion, votre page principale de projet ressemble à la figure 4-13.
1094
+
1095
+ Insert 18333fig0413.png
1096
+ Figure 4-13. Un page principale de projet GitHub.
1097
+
1098
+ Lorsqu'on visite votre projet, on voit cette page.
1099
+ Elle contient des onglets vers différentes vues des projets.
1100
+ L'onglet « Commits » (validations) affiche une liste des validations dans l'ordre chronologique inverse, similaire à ce qu'afficherait la commande `git log`.
1101
+ L'onglet « Network » (réseau) affiche tous les utilisateurs ayant dupliqué votre projet et contribué.
1102
+ L'onglet « Downloads » (téléchargements) vous permet de télécharger les exécutables du projet ou de fournir des archives des sources aux points étiquetés de votre projet.
1103
+ L'onglet « Wiki » fournit un wiki où vous pouvez commencer à écrire la documentation ou d'autres informations du projet.
1104
+ L'onglet « Graphs » permet de visualiser les contributions et les statistiques.
1105
+ L'onglet principal « Source » sur lequel vous arrivez par défaut affiche le contenu du répertoire principal du projet et met en forme dessous le fichier README s'il en contient un.
1106
+ Cet onglet affiche aussi une boîte contenant les informations de la dernière validation.
1107
+
1108
+ ### Duplication de projets ###
1109
+
1110
+ Si vous souhaitez contribuer à un projet auquel vous n'avez pas accès en écriture, GitHub encourage à dupliquer le projet.
1111
+ Si le projet vous semble intéressant et que vous souhaitez le modifier, vous pouvez cliquer sur le bouton « Fork » (dupliquer) visible dans l'en-tête du projet pour faire copier ce projet par GitHub vers votre utilisateur pour que vous puissiez pousser dessus.
1112
+
1113
+ De cette manière, les administrateurs de projet n'ont pas à se soucier d'ajouter des utilisateurs comme collaborateurs pour leur donner un accès en écriture.
1114
+ On peut dupliquer un projet et pousser dessus, et le mainteneur principal du projet peut tirer ces modifications en ajoutant les projets dupliqués comme dépôts distants et en fusionnant les changements.
1115
+
1116
+ Pour dupliquer un projet, visitez la page du projet (par exemple mojombo/chronic), et cliquez sur le bouton « Fork » (dupliquer) dans l'en-tête (voir figure 4-14).
1117
+
1118
+ Insert 18333fig0414.png
1119
+ Figure 4-14. Obtenir un copie modifiable et publiable d'un dépôt en cliquant sur le bouton « Fork ».
1120
+
1121
+ Quelques secondes plus tard, vous êtes redirigé vers une nouvelle page de projet qui indique que ce projet est un duplicata d'un autre (voir figure 4-15).
1122
+
1123
+ Insert 18333fig0415.png
1124
+ Figure 4-15. Votre duplicata d'un projet.
1125
+
1126
+ ### Résumé sur GitHub ###
1127
+
1128
+ C'est tout ce que nous dirons de GitHub, mais il faut souligner que tous ces processus sont très rapides.
1129
+ Vous pouvez créer un compte, ajouter un nouveau projet et commencer à pousser dessus en quelques minutes.
1130
+ Si votre projet est libre, vous pouvez aussi construire une importante communauté de développeurs qui ont à présent la visibilité sur votre projet et peuvent à tout moment le dupliquer et commencer à contribuer.
1131
+ Tout au moins, cela peut s'avérer une manière rapide de démarrer avec Git et de l'essayer.
1132
+
1133
+ ## Résumé ##
1134
+
1135
+ Vous disposez de plusieurs moyens de mettre en place un dépôt Git distant pour pouvoir collaborer avec d'autres et partager votre travail.
1136
+
1137
+ Gérer votre propre serveur vous donne une grande maîtrise et vous permet de l'installer derrière un pare-feu, mais un tel serveur nécessite généralement une certaine quantité de travail pour l'installation et la maintenance.
1138
+ Si vous placez vos données sur un serveur hébergé, c'est très simple à installer et maintenir.
1139
+ Cependant vous devez pouvoir héberger votre code sur des serveurs tiers et certaines politiques d'organisation ne le permettent pas.
1140
+
1141
+ Choisir la meilleure solution ou combinaison de solutions pour votre cas ou celui de votre société ne devrait pas poser de problème.