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,832 @@
1
+ # Git et les autres systèmes #
2
+
3
+ Le monde n'est pas parfait.
4
+ Habituellement, vous ne pouvez pas basculer immédiatement sous Git tous les projets que vous pourriez rencontrer.
5
+ Quelques fois, vous êtes bloqué sur un projet utilisant un autre VCS et très souvent ce système s'avère être Subversion.
6
+ Dans la première partie de ce chapitre, nous traiterons de `git svn`, la passerelle bidirectionnelle de Git pour Subversion.
7
+
8
+ À un moment, vous voudrez convertir votre projet à Git.
9
+ La seconde partie de ce chapitre traite la migration de votre projet dans Git : depuis Subversion, puis depuis Perforce et enfin par un script d'import personnalisé pour les cas non-standards.
10
+
11
+ ## Git et Subversion ##
12
+
13
+ Aujourd'hui, la majorité des projets de développement libre et un grand nombre de projets dans les sociétés utilisent Subversion pour gérer leur code source.
14
+ C'est le VCS libre le plus populaire depuis une bonne décennie.
15
+ Il est aussi très similaire à CVS qui a été le grand chef des gestionnaires de source avant lui.
16
+
17
+ Une des grandes fonctionnalités de Git est sa passerelle vers Subversion, `git svn`.
18
+ Cet outil vous permet d'utiliser Git comme un client valide d'un serveur Subversion pour que vous puissiez utiliser les capacités de Git en local puis poussez sur le serveur Subversion comme si vous utilisiez Subversion localement.
19
+ Cela signifie que vous pouvez réaliser localement les embranchements et les fusions, utiliser l'index, utiliser le rebasage et la sélection de *commits*, etc, tandis que vos collaborateurs continuent de travailler avec leurs méthodes ancestrales et obscures.
20
+ C'est une bonne manière d'introduire Git dans un environnement professionnel et d'aider vos collègues développeurs à devenir plus efficaces tandis que vous ferez pression pour une modification de l'infrastructure vers l'utilisation massive de Git.
21
+ La passerelle Subversion n'est que la première dose vers la drogue du monde des DVCS.
22
+
23
+ ### git svn ###
24
+
25
+ La commande de base dans Git pour toutes les commandes de passerelle est `git svn`.
26
+ Vous préfixerez tout avec cette paire de mots.
27
+ Les possibilités étant nombreuses, nous traiterons des plus communes pendant que nous détaillerons quelques petits modes de gestion.
28
+
29
+ Il est important de noter que lorsque vous utilisez `git svn`, vous interagissez avec Subversion qui est un système bien moins sophistiqué que Git.
30
+ Bien que vous puissiez simplement réaliser des branches locales et les fusionner, il est généralement conseillé de conserver votre historique le plus linéaire possible en rebasant votre travail et en évitant des activités telles qu'interagir dans le même temps avec un dépôt Git distant.
31
+
32
+ Ne réécrivez pas votre historique avant d'essayer de pousser à nouveau et ne poussez pas en parallèle dans un dépôt Git pour collaborer avec vos collègues développant avec Git.
33
+ Subversion ne supporte qu'un historique linéaire et l'égarer est très facile.
34
+ Si vous travaillez avec une équipe dont certains membres utilisent SVN et d'autres utilisent Git, assurez-vous que tout le monde n'utilise que le serveur SVN pour collaborer, cela vous rendra service.
35
+
36
+ ### Installation ###
37
+
38
+ Pour montrer cette fonctionnalité, il faut un serveur SVN sur lequel vous avez des droits en écriture.
39
+ Pour copier ces exemples, faites une copie inscriptible de mon dépôt de test.
40
+ Dans cette optique, vous pouvez utiliser un outil appelé `svnsync` qui est livré avec les versions les plus récentes de Subversion — il devrait être distribué avec les versions à partir de 1.4.
41
+ Pour ces tests, j'ai créé sur Google code un nouveau dépôt Subversion qui était une copie partielle du projet `protobuf` qui est un outil qui encode les données structurées pour une transmission par réseau.
42
+
43
+ En préparation, créez un nouveau dépôt local Subversion :
44
+
45
+ $ mkdir /tmp/test-svn
46
+ $ svnadmin create /tmp/test-svn
47
+
48
+ Ensuite, autorisez tous les utilisateurs à changer les revprops — le moyen le plus simple consiste à ajouter un script pre-revprop-change qui rend toujours 0 :
49
+
50
+ $ cat /tmp/test-svn/hooks/pre-revprop-change
51
+ #!/bin/sh
52
+ exit 0;
53
+ $ chmod +x /tmp/test-svn/hooks/pre-revprop-change
54
+
55
+ Vous pouvez à présent synchroniser ce projet sur votre machine locale en lançant `svnsync init` avec les dépôts source et cible.
56
+
57
+ $ svnsync init file:///tmp/test-svn http://progit-example.googlecode.com/svn/
58
+
59
+ Cela initialise les propriétés nécessaires à la synchronisation.
60
+ Vous pouvez ensuite cloner le code en lançant :
61
+
62
+ $ svnsync sync file:///tmp/test-svn
63
+ Committed revision 1.
64
+ Copied properties for revision 1.
65
+ Committed revision 2.
66
+ Copied properties for revision 2.
67
+ Committed revision 3.
68
+ ...
69
+
70
+ Bien que cette opération ne dure que quelques minutes, si vous essayez de copier le dépôt original sur un autre dépôt distant au lieu d'un dépôt local, le processus durera près d'une heure, en dépit du fait qu'il y a moins de 100 *commits*.
71
+ Subversion doit cloner révision par révision puis pousser vers un autre dépôt — c'est ridiculement inefficace mais c'est la seule possibilité.
72
+
73
+ ### Démarrage ###
74
+
75
+ Avec des droits en écriture sur un dépôt Subversion, vous voici prêt à expérimenter une méthode typique.
76
+ Commençons par la commande `git svn clone` qui importe un dépôt Subversion complet dans un dépôt Git local.
77
+ Souvenez-vous que si vous importez depuis un dépôt Subversion hébergé sur Internet, il faut remplacer l'URL `file://tmp/test-svn` ci-dessous par l'URL de votre dépôt Subversion :
78
+
79
+ $ git svn clone file:///tmp/test-svn -T trunk -b branches -t tags
80
+ Initialized empty Git repository in /Users/schacon/projects/testsvnsync/svn/.git/
81
+ r1 = b4e387bc68740b5af56c2a5faf4003ae42bd135c (trunk)
82
+ A m4/acx_pthread.m4
83
+ A m4/stl_hash.m4
84
+ ...
85
+ r75 = d1957f3b307922124eec6314e15bcda59e3d9610 (trunk)
86
+ Found possible branch point: file:///tmp/test-svn/trunk => \
87
+ file:///tmp/test-svn /branches/my-calc-branch, 75
88
+ Found branch parent: (my-calc-branch) d1957f3b307922124eec6314e15bcda59e3d9610
89
+ Following parent with do_switch
90
+ Successfully followed parent
91
+ r76 = 8624824ecc0badd73f40ea2f01fce51894189b01 (my-calc-branch)
92
+ Checked out HEAD:
93
+ file:///tmp/test-svn/branches/my-calc-branch r76
94
+
95
+ Cela équivaut à lancer `git svn init` suivi de `git svn fetch` sur l'URL que vous avez fournie.
96
+ Cela peut prendre un certain temps.
97
+ Le projet de test ne contient que 75 *commits* et la taille du code n'est pas extraordinaire, ce qui prend juste quelques minutes.
98
+ Cependant, Git doit extraire chaque version, une par une et les valider individuellement.
99
+ Pour un projet contenant des centaines ou des milliers de *commits*, cela peut prendre littéralement des heures ou même des jours à terminer.
100
+
101
+ La partie `-T trunk -b branches -t tags` indique à Git que ce dépôt Subversion suit les conventions de base en matière d'embranchement et d'étiquetage.
102
+ Si vous nommez votre trunk, vos branches ou vos étiquettes différemment, vous pouvez modifier ces options.
103
+ Comme cette organisation est la plus commune, ces options peuvent être simplement remplacées par `-s` qui signifie structure standard.
104
+ La commande suivante est équivalente :
105
+
106
+ $ git svn clone file:///tmp/test-svn -s
107
+
108
+ À présent, vous disposez d'un dépôt Git valide qui a importé vos branches et vos étiquettes :
109
+
110
+ $ git branch -a
111
+ * master
112
+ my-calc-branch
113
+ tags/2.0.2
114
+ tags/release-2.0.1
115
+ tags/release-2.0.2
116
+ tags/release-2.0.2rc1
117
+ trunk
118
+
119
+ Il est important de remarquer comment cet outil sous-classe vos références distantes différemment.
120
+ Quand vous clonez un dépôt Git normal, vous obtenez toutes les branches distantes localement sous la forme `origin/[branch]` avec un espace de nom correspondant au dépôt distant.
121
+ Cependant, `git svn` assume que vous n'aurez pas de multiples dépôts distants et enregistre toutes ses références pour qu'elles pointent sur le dépôt distant.
122
+ Cependant, vous pouvez utiliser la commande Git de plomberie `show-ref` pour visualiser toutes vos références.
123
+
124
+ $ git show-ref
125
+ 1cbd4904d9982f386d87f88fce1c24ad7c0f0471 refs/heads/master
126
+ aee1ecc26318164f355a883f5d99cff0c852d3c4 refs/remotes/my-calc-branch
127
+ 03d09b0e2aad427e34a6d50ff147128e76c0e0f5 refs/remotes/tags/2.0.2
128
+ 50d02cc0adc9da4319eeba0900430ba219b9c376 refs/remotes/tags/release-2.0.1
129
+ 4caaa711a50c77879a91b8b90380060f672745cb refs/remotes/tags/release-2.0.2
130
+ 1c4cb508144c513ff1214c3488abe66dcb92916f refs/remotes/tags/release-2.0.2rc1
131
+ 1cbd4904d9982f386d87f88fce1c24ad7c0f0471 refs/remotes/trunk
132
+
133
+ Pour un dépôt Git normal, cela ressemble plus à ceci :
134
+
135
+ $ git show-ref
136
+ 83e38c7a0af325a9722f2fdc56b10188806d83a1 refs/heads/master
137
+ 3e15e38c198baac84223acfc6224bb8b99ff2281 refs/remotes/gitserver/master
138
+ 0a30dd3b0c795b80212ae723640d4e5d48cabdff refs/remotes/origin/master
139
+ 25812380387fdd55f916652be4881c6f11600d6f refs/remotes/origin/testing
140
+
141
+ Ici, vous disposez de deux serveurs distants : un nommé `gitserver` avec une branche `master` et un autre nommé `origin` avec deux branches `master` et `testing`.
142
+
143
+ Remarquez comme dans cet exemple de références distantes importées via `git svn`, les étiquettes sont ajoutées comme des branches distantes et non comme des vraies étiquettes Git.
144
+ Votre importation Subversion indique plutôt qu'il a un serveur distant appelé `tags` présentant des branches.
145
+
146
+ ### Valider en retour sur le serveur Subversion ###
147
+
148
+ Comme vous disposez d'un dépôt en état de marche, vous pouvez commencer à travailler sur le projet et pousser vos *commits* en utilisant efficacement Git comme client SVN.
149
+ Si vous éditez un des fichiers et le validez, vous créez un *commit* qui existe localement dans Git mais qui n'existe pas sur le serveur Subversion :
150
+
151
+ $ git commit -am 'Ajout d'instructions pour git-svn dans LISEZMOI'
152
+ [master 97031e5] Ajout d'instructions pour git-svn dans LISEZMOI
153
+ 1 files changed, 1 insertions(+), 1 deletions(-)
154
+
155
+ Ensuite, vous avez besoin de pousser vos modifications en amont.
156
+ Remarquez que cela modifie la manière de travailler par rapport à Subversion — vous pouvez réaliser plusieurs validations en mode déconnecté pour ensuite les pousser toutes en une fois sur le serveur Subversion.
157
+ Pour pousser sur un serveur Subversion, il faut lancer la commande `git svn dcommit` :
158
+
159
+ $ git svn dcommit
160
+ Committing to file:///tmp/test-svn/trunk ...
161
+ M README.txt
162
+ Committed r79
163
+ M README.txt
164
+ r79 = 938b1a547c2cc92033b74d32030e86468294a5c8 (trunk)
165
+ No changes between current HEAD and refs/remotes/trunk
166
+ Resetting to the latest refs/remotes/trunk
167
+
168
+ Cette commande rassemble tous les *commits* que vous avez validés par dessus le code du serveur Subversion et réalise un *commit* sur le serveur pour chacun, puis réécrit l'historique Git local pour y ajouter un identifiant unique.
169
+ Cette étape est à souligner car elle signifie que toutes les sommes de contrôle SHA-1 de vos *commits* locaux ont changé.
170
+ C'est en partie pour cette raison que c'est une idée très périlleuse de vouloir travailler dans le même temps avec des serveurs Git distants.
171
+ L'examen du dernier *commit* montre que le nouveau `git-svn-id` a été ajouté :
172
+
173
+ $ git log -1
174
+ commit 938b1a547c2cc92033b74d32030e86468294a5c8
175
+ Author: schacon <schacon@4c93b258-373f-11de-be05-5f7a86268029>
176
+ Date: Sat May 2 22:06:44 2009 +0000
177
+
178
+ Ajout d'instructions pour git-svn dans LISEZMOI
179
+
180
+ git-svn-id: file:///tmp/test-svn/trunk@79 4c93b258-373f-11de-be05-5f7a86268029
181
+
182
+ Remarquez que la somme de contrôle SHA qui commençait par `97031e5` quand vous avez validé commence à présent par `938b1a5`.
183
+ Si vous souhaitez pousser à la fois sur un serveur Git et un serveur Subversion, il faut obligatoirement pousser (`dcommit`) sur le serveur Subversion en premier, car cette action va modifier vos données des *commits*.
184
+
185
+ ### Tirer des modifications ###
186
+
187
+ Quand vous travaillez avec d'autres développeurs, il arrive à certains moments que ce qu'un développeur a poussé provoque un conflit lorsqu'un autre voudra pousser à son tour.
188
+ Cette modification sera rejetée jusqu'à ce qu'elle soit fusionnée.
189
+ Dans `git svn`, cela ressemble à ceci :
190
+
191
+ $ git svn dcommit
192
+ Committing to file:///tmp/test-svn/trunk ...
193
+ Merge conflict during commit: Your file or directory 'README.txt' is probably \
194
+ out-of-date: resource out of date; try updating at /Users/schacon/libexec/git-\
195
+ core/git-svn line 482
196
+
197
+ Pour résoudre cette situation, vous pouvez lancer la commande `git svn rebase` qui tire depuis le serveur toute modification apparue entre temps et rebase votre travail sur le sommet de l'historique du serveur :
198
+
199
+ $ git svn rebase
200
+ M README.txt
201
+ r80 = ff829ab914e8775c7c025d741beb3d523ee30bc4 (trunk)
202
+ First, rewinding head to replay your work on top of it...
203
+ Applying: first user change
204
+
205
+ À présent, tout votre travail se trouve au-delà de l'historique du serveur et vous pouvez effectivement réaliser un `dcommit` :
206
+
207
+ $ git svn dcommit
208
+ Committing to file:///tmp/test-svn/trunk ...
209
+ M README.txt
210
+ Committed r81
211
+ M README.txt
212
+ r81 = 456cbe6337abe49154db70106d1836bc1332deed (trunk)
213
+ No changes between current HEAD and refs/remotes/trunk
214
+ Resetting to the latest refs/remotes/trunk
215
+
216
+ Il est important de se souvenir qu'à la différence de Git qui requiert une fusion avec les modifications distantes non présentes localement avant de pouvoir pousser, `git svn` ne vous y contraint que si vos modifications provoquent un conflit.
217
+ Si une autre personne pousse une modification à un fichier et que vous poussez une modification à un autre fichier, votre `dcommit` passera sans problème :
218
+
219
+ $ git svn dcommit
220
+ Committing to file:///tmp/test-svn/trunk ...
221
+ M configure.ac
222
+ Committed r84
223
+ M autogen.sh
224
+ r83 = 8aa54a74d452f82eee10076ab2584c1fc424853b (trunk)
225
+ M configure.ac
226
+ r84 = cdbac939211ccb18aa744e581e46563af5d962d0 (trunk)
227
+ W: d2f23b80f67aaaa1f6f5aaef48fce3263ac71a92 and refs/remotes/trunk differ, \
228
+ using rebase:
229
+ :100755 100755 efa5a59965fbbb5b2b0a12890f1b351bb5493c18 \
230
+ 015e4c98c482f0fa71e4d5434338014530b37fa6 M autogen.sh
231
+ First, rewinding head to replay your work on top of it...
232
+ Nothing to do.
233
+
234
+ Il faut s'en souvenir car le résultat de ces actions est un état du dépôt qui n'existait pas sur aucun des ordinateurs quand vous avez poussé.
235
+ Si les modifications sont incompatibles mais ne créent pas de conflits, vous pouvez créer des défauts qui seront très difficiles à diagnostiquer.
236
+ C'est une grande différence avec un serveur Git — dans Git, vous pouvez tester complètement l'état du projet sur votre système client avant de le publier, tandis qu'avec SVN, vous ne pouvez jamais être totalement certain que les états avant et après validation sont identiques.
237
+
238
+ Vous devrez aussi lancer cette commande pour tirer les modifications depuis le serveur Subversion, même si vous n'êtes pas encore prêt à valider.
239
+ Vous pouvez lancer `git svn fetch` pour tirer les nouveaux *commits*, mais `git svn rebase` tire non seulement les *commits* distants mais rebase aussi vos *commit* locaux.
240
+
241
+ $ git svn rebase
242
+ M generate_descriptor_proto.sh
243
+ r82 = bd16df9173e424c6f52c337ab6efa7f7643282f1 (trunk)
244
+ First, rewinding head to replay your work on top of it...
245
+ Fast-forwarded master to refs/remotes/trunk.
246
+
247
+ Lancer `git svn rebase` de temps en temps vous assure que votre travail est toujours synchronisé avec le serveur.
248
+ Vous devrez cependant vous assurer que votre copie de travail est propre quand vous la lancez.
249
+ Si vous avez des modifications locales, il vous faudra soit remiser votre travail, soit valider temporairement vos modifications avant de lancer `git svn rebase`, sinon la commande s'arrêtera si elle détecte que le rebasage provoquerait un conflit de fusion.
250
+
251
+ ### Le problème avec les branches Git ###
252
+
253
+ Après vous être habitué à la manière de faire avec Git, vous souhaiterez sûrement créer des branches thématiques, travailler dessus, puis les fusionner.
254
+ Si vous poussez sur un serveur Subversion via `git svn`, vous souhaiterez à chaque fois rebaser votre travail sur une branche unique au lieu de fusionner les branches ensemble.
255
+ La raison principale en est que Subversion gère un historique linéaire et ne gère pas les fusions comme Git y excelle.
256
+ De ce fait, `git svn` suit seulement le premier parent lorsqu'il convertit les instantanés en *commits* Subversion.
257
+
258
+ Supposons que votre historique ressemble à ce qui suit. Vous avez créé une branche `experience`, avez réalisé deux validations puis les avez fusionnées dans `master`.
259
+ Lors du `dcommit`, vous voyez le résultat suivant :
260
+
261
+ $ git svn dcommit
262
+ Committing to file:///tmp/test-svn/trunk ...
263
+ M CHANGES.txt
264
+ Committed r85
265
+ M CHANGES.txt
266
+ r85 = 4bfebeec434d156c36f2bcd18f4e3d97dc3269a2 (trunk)
267
+ No changes between current HEAD and refs/remotes/trunk
268
+ Resetting to the latest refs/remotes/trunk
269
+ COPYING.txt: locally modified
270
+ INSTALL.txt: locally modified
271
+ M COPYING.txt
272
+ M INSTALL.txt
273
+ Committed r86
274
+ M INSTALL.txt
275
+ M COPYING.txt
276
+ r86 = 2647f6b86ccfcaad4ec58c520e369ec81f7c283c (trunk)
277
+ No changes between current HEAD and refs/remotes/trunk
278
+ Resetting to the latest refs/remotes/trunk
279
+
280
+ Lancer `dcommit` sur une branche avec un historique fusionné fonctionne correctement, à l'exception que l'examen de l'historique du projet Git indique qu'il n'a réécrit aucun des *commits* réalisés sur la branche `experience`, mais que toutes les modifications introduites apparaissent dans la version SVN de l'unique *commit* de fusion.
281
+
282
+ Quand quelqu'un d'autre clone ce travail, tout ce qu'il voit, c'est le *commit* de la fusion avec toutes les modifications injectées en une fois.
283
+ Il ne voit aucune information sur son origine ni sur sa date de validation.
284
+
285
+ ### Les embranchements dans Subversion ###
286
+
287
+ La gestion de branches dans Subversion n'a rien à voir avec celle de Git.
288
+ Évitez de l'utiliser tant que possible.
289
+ Cependant vous pouvez créer des branches et valider dessus dans Subversion en utilisant `git svn`.
290
+
291
+ #### Créer une nouvelle branche SVN ####
292
+
293
+ Pour créer une nouvelle branche dans Subversion, vous pouvez utiliser la commande `git svn branch [nom de la branche]` :
294
+
295
+ Copying file:///tmp/test-svn/trunk at r87 to file:///tmp/test-svn/branches/opera...
296
+ Found possible branch point: file:///tmp/test-svn/trunk => \
297
+ file:///tmp/test-svn/branches/opera, 87
298
+ Found branch parent: (opera) 1f6bfe471083cbca06ac8d4176f7ad4de0d62e5f
299
+ Following parent with do_switch
300
+ Successfully followed parent
301
+ r89 = 9b6fe0b90c5c9adf9165f700897518dbc54a7cbf (opera)
302
+
303
+ Cela est équivalent à la commande Subversion `svn copy trunk branches/opera` et réalise l'opération sur le serveur Subversion.
304
+ Remarquez que cette commande ne vous bascule pas sur cette branche ; si vous validez, le *commit* s'appliquera à `trunk` et non à la branche `opera`.
305
+
306
+ ### Basculer de branche active ###
307
+
308
+ Git devine la branche cible des `dcommits` en se référant au sommet des branches Subversion dans votre historique — vous ne devriez en avoir qu'un et celui-ci devrait être le dernier possédant un `git-svn-id` dans l'historique actuel de votre branche.
309
+
310
+ Si vous souhaitez travailler simultanément sur plusieurs branches, vous pouvez régler vos branches locales pour que le `dcommit` arrive sur une branche Subversion spécifique en les démarrant sur le *commit* de cette branche importée depuis Subversion.
311
+ Si vous voulez une branche `opera` sur laquelle travailler séparément, vous pouvez lancer :
312
+
313
+ $ git branch opera remotes/opera
314
+
315
+ À présent, si vous voulez fusionner votre branche `opera` dans `trunk` (votre branche `master`), vous pouvez le faire en réalisant un `git merge` normal.
316
+ Mais vous devez préciser un message de validation descriptif (via `-m`), ou la fusion indiquera simplement « Merge branch opera » au lieu d'un message plus informatif.
317
+
318
+ Souvenez-vous que bien que vous utilisez `git merge` qui facilitera l'opération de fusion par rapport à Subversion (Git détectera automatiquement l'ancêtre commun pour la fusion), ce n'est pas un *commit* de fusion normal de Git.
319
+ Vous devrez pousser ces données finalement sur le serveur Subversion qui ne sait pas tracer les *commits* possédant plusieurs parents.
320
+ Donc, ce sera un *commit* unique qui englobera toutes les modifications de l'autre branche.
321
+ Après avoir fusionné une branche dans une autre, il est difficile de continuer à travailler sur cette branche, comme vous le feriez normalement dans Git.
322
+ La commande `dcommit` qui a été lancée efface toute information sur la branche qui a été fusionnée, ce qui rend faux tout calcul d'antériorité pour la fusion.
323
+ `dcommit` fait ressembler le résultat de `git merge` à celui de `git merge --squash`.
324
+ Malheureusement, il n'y a pas de moyen efficace de remédier à ce problème — Subversion ne stocke pas cette information et vous serez toujours contraints par ses limitations si vous l'utilisez comme serveur.
325
+ Pour éviter ces problèmes, le mieux reste d'effacer la branche locale (dans notre cas, `opera`) dès qu'elle a été fusionnée dans `trunk`.
326
+
327
+ ### Les commandes Subversion ###
328
+
329
+ La boîte à outil `git svn` fournit des commandes de nature à faciliter la transition vers Git en mimant certaines commandes disponibles avec Subversion.
330
+ Voici quelques commandes qui vous fournissent les mêmes services que Subversion.
331
+
332
+ #### L'historique dans le style Subversion ####
333
+
334
+ Si vous êtes habitué à Subversion, vous pouvez lancer `git svn log` pour visualiser votre historique dans un format SVN :
335
+
336
+ $ git svn log
337
+ ------------------------------------------------------------------------
338
+ r87 | schacon | 2009-05-02 16:07:37 -0700 (Sat, 02 May 2009) | 2 lines
339
+
340
+ autogen change
341
+
342
+ ------------------------------------------------------------------------
343
+ r86 | schacon | 2009-05-02 16:00:21 -0700 (Sat, 02 May 2009) | 2 lines
344
+
345
+ Merge branch 'experiment'
346
+
347
+ ------------------------------------------------------------------------
348
+ r85 | schacon | 2009-05-02 16:00:09 -0700 (Sat, 02 May 2009) | 2 lines
349
+
350
+ updated the changelog
351
+
352
+ Deux choses importantes à connaître sur `git svn log` : premièrement, à la différence de la commande réelle `svn log` qui interroge le serveur, cette commande fonctionne hors connexion ; deuxièmement, elle ne montre que les *commits* qui ont été effectivement remontés sur le serveur Subversion.
353
+ Les *commits* locaux qui n'ont pas encore été remontés via `dcommit` n'apparaissent pas, pas plus que ceux qui auraient été poussés sur le serveur par des tiers entre deux `git svn rebase`.
354
+ Cela donne plutôt le dernier état connu des *commits* sur le serveur Subversion.
355
+
356
+ #### Les annotations SVN ####
357
+
358
+ De la même manière que `git svn log` simule une commande `svn log` déconnectée, vous pouvez obtenir l'équivalent de `svn annotate` en lançant `git svn blame [fichier]`.
359
+ Le résultat ressemble à ceci :
360
+
361
+ $ git svn blame README.txt
362
+ 2 temporal Protocol Buffers - Google's data interchange format
363
+ 2 temporal Copyright 2008 Google Inc.
364
+ 2 temporal http://code.google.com/apis/protocolbuffers/
365
+ 2 temporal
366
+ 22 temporal C++ Installation - Unix
367
+ 22 temporal =======================
368
+ 2 temporal
369
+ 79 schacon Committing in git-svn.
370
+ 78 schacon
371
+ 2 temporal To build and install the C++ Protocol Buffer runtime and the Protocol
372
+ 2 temporal Buffer compiler (protoc) execute the following:
373
+ 2 temporal
374
+
375
+ Ici aussi, tous les *commits* locaux dans Git ou ceux poussé sur Subversion dans l'intervalle n'apparaissent pas.
376
+
377
+ #### L'information sur le serveur SVN ####
378
+
379
+ Vous pouvez aussi obtenir le même genre d'information que celle fournie par `svn info` en lançant `git svn info` :
380
+
381
+ $ git svn info
382
+ Path: .
383
+ URL: https://schacon-test.googlecode.com/svn/trunk
384
+ Repository Root: https://schacon-test.googlecode.com/svn
385
+ Repository UUID: 4c93b258-373f-11de-be05-5f7a86268029
386
+ Revision: 87
387
+ Node Kind: directory
388
+ Schedule: normal
389
+ Last Changed Author: schacon
390
+ Last Changed Rev: 87
391
+ Last Changed Date: 2009-05-02 16:07:37 -0700 (Sat, 02 May 2009)
392
+
393
+ Comme `blame` et `log`, cette commande travaille hors connexion et n'est à jour qu'à la dernière date à laquelle vous avez communiqué avec le serveur Subversion.
394
+
395
+ #### Ignorer ce que Subversion ignore ####
396
+
397
+ Si vous clonez un dépôt Subversion contenant des propriétés `svn:ignore`, vous souhaiterez sûrement paramétrer les fichiers `.gitignore` en correspondance pour vous éviter de valider accidentellement des fichiers interdits.
398
+ `git svn` dispose de deux commandes pour le faire.
399
+
400
+ La première est `git svn create-ignore` qui crée automatiquement pour vous les fichiers `.gitignore` prêts pour l'inclusion dans votre prochaine validation.
401
+
402
+ La seconde commande est `git svn show-ignore` qui affiche sur `stdout` les lignes nécessaires à un fichier `.gitignore` qu'il suffira de rediriger dans votre fichier d'exclusion de projet :
403
+
404
+ $ git svn show-ignore > .git/info/exclude
405
+
406
+ De cette manière, vous ne parsemez pas le projet de fichiers `.gitignore`.
407
+ C'est une option optimale si vous êtes le seul utilisateur de Git dans une équipe Subversion et que vos coéquipiers ne veulent pas voir de fichiers `.gitignore` dans le projet.
408
+
409
+ ### Résumé sur Git-Svn ###
410
+
411
+ Les outils `git svn` sont utiles si vous êtes bloqué avec un serveur Subversion pour le moment ou si vous devez travailler dans un environnement de développement qui nécessite un serveur Subversion.
412
+ Il faut cependant les considérer comme une version tronquée de Git ou vous pourriez rencontrer des problèmes de conversion synonymes de troubles pour vous et vos collaborateurs.
413
+ Pour éviter tout problème, essayez de suivre les principes suivants :
414
+
415
+ * Garder un historique Git linéaire qui ne contient pas de *commits* de fusion issus de `git merge`. Rebasez tout travail réalisé en dehors de la branche principale sur celle-ci ; ne la fusionnez pas.
416
+ * Ne mettez pas en place et ne travaillez pas en parallèle sur un serveur Git. Si nécessaire, montez-en un pour accélérer les clones pour de nouveaux développeurs mais n'y poussez rien qui n'ait déjà une entrée `git-svn-id`. Vous devriez même y ajouter un crochet `pre-receive` qui vérifie la présence de `git-svn-id` dans chaque message de validation et rejette les remontées dont un des *commits* n'en contiendrait pas.
417
+
418
+ Si vous suivez ces principes, le travail avec un serveur Subversion peut être supportable.
419
+ Cependant, si le basculement sur un vrai serveur Git est possible, votre équipe y gagnera beaucoup.
420
+
421
+ ## Migrer sur Git ##
422
+
423
+ Si vous avez une base de code dans un autre VCS et que vous avez décidé d'utiliser Git, vous devez migrer votre projet d'une manière ou d'une autre.
424
+ Ce chapitre traite d'outils d'import inclus dans Git avec des systèmes communs et démontre comment développer votre propre outil.
425
+
426
+ ### Importer ###
427
+
428
+ Nous allons détailler la manière d'importer des données à partir de deux des plus grands systèmes SCM utilisés en milieu professionnel, Subversion et Perforce, pour les raisons combinées qu'ils regroupent la majorité des utilisateurs que je connais migrer vers Git et que des outils de grande qualité pour ces deux systèmes sont distribués avec Git.
429
+
430
+ ### Subversion ###
431
+
432
+ Si vous avez lu la section précédente sur l'utilisation de `git svn`, vous pouvez facilement utiliser ces instructions pour réaliser un `git svn clone` du dépôt.
433
+ Ensuite, arrêtez d'utiliser le serveur Subversion, poussez sur un nouveau serveur Git et commencez à l'utiliser.
434
+ Si vous voulez l'historique, vous pouvez l'obtenir aussi rapidement que vous pourrez tirer les données du serveur Subversion (ce qui peut prendre un certain temps).
435
+
436
+ Cependant, l'import n'est pas parfait ; et comme cela prend autant de temps, autant le faire bien.
437
+ Le premier problème est l'information d'auteur.
438
+ Dans Subversion, chaque personne qui valide dispose d'un compte sur le système qui est enregistré dans l'information de validation.
439
+ Les exemples de la section précédente montrent `schacon` à certains endroits, tels que la sortie de `blame` ou de `git svn log`.
440
+ Si vous voulez transposer ces données vers des données d'auteur au format Git, vous avez besoin d'une correspondance entre les utilisateurs Subversion et les auteurs Git.
441
+ Créez un fichier appelé `users.txt` contenant cette équivalence dans le format suivant :
442
+
443
+ schacon = Scott Chacon <schacon@geemail.com>
444
+ selse = Someo Nelse <selse@geemail.com>
445
+
446
+ Pour récupérer la liste des noms d'auteurs utilisés par SVN, vous pouvez utiliser la ligne suivante :
447
+
448
+ $ svn log ^/ --xml | grep -P "^<author" | sort -u | \
449
+ perl -pe 's/<author>(.*?)<\/author>/$1 = /' > users.txt
450
+
451
+ Cela génère une sortie au format XML — vous pouvez visualiser les auteurs, créer une liste unique puis éliminer l'XML.
452
+ Évidemment, cette ligne ne fonctionne que sur une machine disposant des commandes `grep`, `sort` et `perl`.
453
+ Ensuite, redirigez votre sortie dans votre fichier users.txt pour pouvoir y ajouter en correspondance les données équivalentes Git.
454
+
455
+ Vous pouvez alors fournir ce fichier à `git svn` pour l'aider à convertir les données d'auteur plus précisément.
456
+ Vous pouvez aussi indiquer à `git svn` de ne pas inclure les méta-données que Subversion importe habituellement en passant l'option `--no-metadata` à la commande `clone` ou `init`.
457
+ Au final, votre commande d'import ressemble à ceci :
458
+
459
+ $ git svn clone http://mon-projet.googlecode.com/svn/ \
460
+ --authors-file=users.txt --no-metadata -s my_project
461
+
462
+ Maintenant, l'import depuis Subversion dans le répertoire `my_project` est plus présentable.
463
+ En lieu et place de *commits* qui ressemblent à ceci :
464
+
465
+ commit 37efa680e8473b615de980fa935944215428a35a
466
+ Author: schacon <schacon@4c93b258-373f-11de-be05-5f7a86268029>
467
+ Date: Sun May 3 00:12:22 2009 +0000
468
+
469
+ fixed install - go to trunk
470
+
471
+ git-svn-id: https://my-project.googlecode.com/svn/trunk@94 4c93b258-373f-11de-
472
+ be05-5f7a86268029
473
+
474
+ les *commits* ressemblent à ceci :
475
+
476
+ commit 03a8785f44c8ea5cdb0e8834b7c8e6c469be2ff2
477
+ Author: Scott Chacon <schacon@geemail.com>
478
+ Date: Sun May 3 00:12:22 2009 +0000
479
+
480
+ fixed install - go to trunk
481
+
482
+ Non seulement le champ auteur a meilleure mine, mais de plus, le champ `git-svn-id` a disparu.
483
+
484
+ Il est encore nécessaire de faire un peu de ménage `post-import`. Déjà, vous devriez nettoyer les références bizarres que `git svn` crée.
485
+ Premièrement, déplacez les étiquettes pour qu'elles soient de vraies étiquettes plutôt que des branches distantes étranges, ensuite déplacez le reste des branches pour qu'elles deviennent locales.
486
+
487
+ Pour déplacer les étiquettes et en faire de vraies étiquettes Git, lancez :
488
+
489
+ $ git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do
490
+ git tag "$tagname" "tags/$tagname"; git branch -r -d "tags/$tagname";
491
+ done
492
+
493
+ Cela récupère les références déclarées comme branches distantes commençant par `tags/` et les transforme en vraies étiquettes (légères).
494
+
495
+ Ensuite, déplacez le reste des références sous `refs/remotes` en branches locales :
496
+
497
+ $ git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do
498
+ git branch "$branchname" "refs/remotes/$branchname"; git branch -r -d "$branchname";
499
+ done
500
+
501
+ À présent, toutes les vieilles branches sont des vraies branches Git et toutes les vieilles étiquettes sont de vraies étiquettes Git.
502
+ La dernière activité consiste à ajouter votre nouveau serveur Git comme serveur distant et à y pousser votre projet transformé.
503
+ Pour pousser le tout, y compris branches et étiquettes, lancez :
504
+
505
+ $ git push origin --tags
506
+
507
+ Toutes vos données, branches et tags sont à présent disponibles sur le serveur Git comme import propre et naturel.
508
+
509
+ ### Perforce ###
510
+
511
+ L'autre système duquel on peut souhaiter importer les données est Perforce.
512
+ Un outil d'import Perforce est aussi distribué avec Git.
513
+ Si votre version de Git est antérieures à 1.7.11, celui-ci n'est disponible que dans la section `contrib` du code source.
514
+ Dans ce dernier cas, pour le lancer, il vous faut récupérer le code source de Git que vous pouvez télécharger à partir de `git.kernel.org` :
515
+
516
+ $ git clone git://git.kernel.org/pub/scm/git/git.git
517
+ $ cd git/contrib/fast-import
518
+
519
+ Dans ce répertoire `fast-import`, vous devriez trouver un script exécutable Python appelé `git-p4`.
520
+ Python et l'outil `p4` doivent être installés sur votre machine pour que cet import fonctionne.
521
+ Par exemple, nous importerons le projet Jam depuis le Perforce Public Depot.
522
+ Pour installer votre client, vous devez exporter la variable d'environnement `P4PORT` qui pointe sur le dépôt Perforce :
523
+
524
+ $ export P4PORT=public.perforce.com:1666
525
+
526
+ Lancez la commande `git-p4 clone` pour importer le projet Jam depuis le serveur Perforce, en fournissant le dépôt avec le chemin du projet et le chemin dans lequel vous souhaitez importer le projet :
527
+
528
+ $ git-p4 clone //public/jam/src@all /opt/p4import
529
+ Importing from //public/jam/src@all into /opt/p4import
530
+ Reinitialized existing Git repository in /opt/p4import/.git/
531
+ Import destination: refs/remotes/p4/master
532
+ Importing revision 4409 (100%)
533
+
534
+ Si vous vous rendez dans le répertoire `/opt/p4import` et lancez la commande `git log`, vous pouvez examiner votre projet importé :
535
+
536
+ $ git log -2
537
+ commit 1fd4ec126171790efd2db83548b85b1bbbc07dc2
538
+ Author: Perforce staff <support@perforce.com>
539
+ Date: Thu Aug 19 10:18:45 2004 -0800
540
+
541
+ Drop 'rc3' moniker of jam-2.5. Folded rc2 and rc3 RELNOTES into
542
+ the main part of the document. Built new tar/zip balls.
543
+
544
+ Only 16 months later.
545
+
546
+ [git-p4: depot-paths = "//public/jam/src/": change = 4409]
547
+
548
+ commit ca8870db541a23ed867f38847eda65bf4363371d
549
+ Author: Richard Geiger <rmg@perforce.com>
550
+ Date: Tue Apr 22 20:51:34 2003 -0800
551
+
552
+ Update derived jamgram.c
553
+
554
+ [git-p4: depot-paths = "//public/jam/src/": change = 3108]
555
+
556
+ Vous pouvez visualiser l'identifiant `git-p4` de chaque *commit*.
557
+ Il n'y a pas de problème à garder cet identifiant ici, au cas où vous auriez besoin de référencer dans l'avenir le numéro de modification Perforce.
558
+ Cependant, si vous souhaitez supprimer l'identifiant, c'est le bon moment, avant de commencer à travailler avec le nouveau dépôt.
559
+ Vous pouvez utiliser `git filter-branch` pour faire un retrait en masse des chaînes d'identifiant :
560
+
561
+ $ git filter-branch --msg-filter '
562
+ sed -e "/^\[git-p4:/d"
563
+ '
564
+ Rewrite 1fd4ec126171790efd2db83548b85b1bbbc07dc2 (123/123)
565
+ Ref 'refs/heads/master' was rewritten
566
+
567
+ Si vous lancez `git log`, vous vous rendez compte que toutes les sommes de contrôle SHA-1 des *commits* ont changé, mais aussi que plus aucune chaîne `git-p4` n'apparaît dans les messages de validation :
568
+
569
+ $ git log -2
570
+ commit 10a16d60cffca14d454a15c6164378f4082bc5b0
571
+ Author: Perforce staff <support@perforce.com>
572
+ Date: Thu Aug 19 10:18:45 2004 -0800
573
+
574
+ Drop 'rc3' moniker of jam-2.5. Folded rc2 and rc3 RELNOTES into
575
+ the main part of the document. Built new tar/zip balls.
576
+
577
+ Only 16 months later.
578
+
579
+ commit 2b6c6db311dd76c34c66ec1c40a49405e6b527b2
580
+ Author: Richard Geiger <rmg@perforce.com>
581
+ Date: Tue Apr 22 20:51:34 2003 -0800
582
+
583
+ Update derived jamgram.c
584
+
585
+ Votre import est fin prêt pour être poussé sur un nouveau serveur Git.
586
+
587
+ ### Un outil d'import personnalisé ###
588
+
589
+ Si votre système n'est ni Subversion, ni Perforce, vous devriez rechercher sur Internet un outil d'import spécifique — il en existe de bonne qualité pour CVS, Clear Case, Visual Source Safe ou même pour un répertoire d'archives.
590
+ Si aucun de ses outils ne fonctionne pour votre cas, que vous ayez un outil plus rare ou que vous ayez besoin d'un mode d'import personnalisé, `git fast-import` peut être la solution.
591
+ Cette commande lit de simples instructions sur `stdin` pour écrire les données spécifiques Git.
592
+ C'est tout de même plus simple pour créer les objets Git que de devoir utiliser les commandes Git brutes ou d'essayer d'écrire directement les objets (voir chapitre 9 pour plus d'information).
593
+ De cette façon, vous écrivez un script d'import qui lit les informations nécessaires depuis le système d'origine et affiche des instructions directes sur `stdout`.
594
+ Vous pouvez alors simplement lancer ce programme et rediriger sa sortie dans `git fast-import`.
595
+
596
+ Pour démontrer rapidement cette fonctionnalité, nous allons écrire un script simple d'import.
597
+ Supposons que vous travailliez dans `en_cours` et que vous fassiez des sauvegardes de temps en temps dans des répertoires nommés avec la date `back_AAAA_MM_JJ` et que vous souhaitiez importer ceci dans Git.
598
+ Votre structure de répertoire ressemble à ceci :
599
+
600
+ $ ls /opt/import_depuis
601
+ back_2009_01_02
602
+ back_2009_01_04
603
+ back_2009_01_14
604
+ back_2009_02_03
605
+ en_cours
606
+
607
+ Pour importer un répertoire dans Git, vous devez savoir comment Git stocke ses données.
608
+ Comme vous pouvez vous en souvenir, Git est à la base une liste chaînée d'objets de *commits* qui pointent sur un instantané de contenu.
609
+ Tout ce qu'il y a à faire donc, et d'indiquer à `fast-import` ce que sont les instantanés de contenu, quelles données de *commit* pointent dessus et l'ordre dans lequel ils s'enchaînent.
610
+ La stratégie consistera à parcourir les instantanés un par un et à créer des *commits* avec le contenu de chaque répertoire, en le reliant à son prédécesseur.
611
+
612
+ Comme déjà fait dans la section « Un exemple de règle appliquée par Git » du chapitre 7, nous l'écrirons en Ruby parce que c'est le langage avec lequel je travaille en général et qu'il est assez facile à lire.
613
+ Vous pouvez facilement retranscrire cet exemple dans votre langage de prédilection, la seule contrainte étant qu'il doit pouvoir afficher les informations appropriées sur `stdout`.
614
+ Si vous travaillez sous Windows, cela signifie que vous devrez faire particulièrement attention à ne pas introduire de retour chariot à la fin de vos lignes.
615
+ `git fast-import` n'accepte particulièrement que les sauts de ligne (line feed LF) et pas les retour chariot saut de ligne (CRLF) utilisés par Windows.
616
+
617
+ Pour commencer, déplaçons-nous dans le répertoire cible et identifions chaque sous-répertoire, chacun représentant un instantané que vous souhaitez importer en tant que *commit*.
618
+ Nous visiterons chaque sous-répertoire et afficherons les commandes nécessaires à son export.
619
+ La boucle principale ressemble à ceci :
620
+
621
+ last_mark = nil
622
+
623
+ # loop through the directories
624
+ Dir.chdir(ARGV[0]) do
625
+ Dir.glob("*").each do |dir|
626
+ next if File.file?(dir)
627
+
628
+ # move into the target directory
629
+ Dir.chdir(dir) do
630
+ last_mark = print_export(dir, last_mark)
631
+ end
632
+ end
633
+ end
634
+
635
+ Dans chaque répertoire, nous lançons `print_export` qui prend le manifeste et la marque de l'instantané précédent et retourne le manifeste et la marque de l'actuel ; de cette manière, vous pouvez les chaîner correctement.
636
+ « Marque » est le terme de `fast-import` pour nommer un identifiant que vous donnez à un *commit*.
637
+ Au fur et à mesure de la création des *commits*, vous leur attribuez une marque individuelle qui pourra être utilisée pour y faire référence depuis d'autres *commits*.
638
+ La première chose à faire dans `print_export` est donc de générer une marque à partir du nom du répertoire :
639
+
640
+ mark = convert_dir_to_mark(dir)
641
+
642
+ Cela sera réalisé en créant un tableau des répertoires et en utilisant l'indice comme marque, celle-ci devant être un nombre entier.
643
+ Votre méthode ressemble à ceci :
644
+
645
+ $marks = []
646
+ def convert_dir_to_mark(dir)
647
+ if !$marks.include?(dir)
648
+ $marks << dir
649
+ end
650
+ ($marks.index(dir) + 1).to_s
651
+ end
652
+
653
+ Après une représentation entière de votre *commit*, vous avez besoin d'une date pour les méta-données du *commit*.
654
+ La date est présente dans le nom du répertoire, alors analysons-le.
655
+ La ligne suivante du fichier `print_export` est donc :
656
+
657
+ date = convert_dir_to_date(dir)
658
+
659
+ où `convert_dir_to_date` est défini comme :
660
+
661
+ def convert_dir_to_date(dir)
662
+ if dir == 'en_cours'
663
+ return Time.now().to_i
664
+ else
665
+ dir = dir.gsub('back_', '')
666
+ (year, month, day) = dir.split('_')
667
+ return Time.local(year, month, day).to_i
668
+ end
669
+ end
670
+
671
+ Elle retourne une nombre entier pour la date de chaque répertoire.
672
+ La dernière partie des méta-informations nécessaires à chaque *commit* est l'information du validateur qui sera stockée en dur dans une variable globale :
673
+
674
+ $author = 'Scott Chacon <schacon@example.com>'
675
+
676
+ Nous voilà prêt à commencer à écrire les informations de *commit* du script d'import.
677
+ La première information indique qu'on définit un objet *commit* et la branche sur laquelle il se trouve, suivi de la marque qui a été générée, l'information du validateur et le message de validation et enfin le *commit* précédent, s'il existe.
678
+ Le code ressemble à ceci :
679
+
680
+ # print the import information
681
+ puts 'commit refs/heads/master'
682
+ puts 'mark :' + mark
683
+ puts "committer #{$author} #{date} -0700"
684
+ export_data('imported from ' + dir)
685
+ puts 'from :' + last_mark if last_mark
686
+
687
+ Nous codons en dur le fuseau horaire (-0700) car c'est simple.
688
+ Si vous importez depuis un autre système, vous devez spécifier le fuseau horaire comme un décalage.
689
+ Le message de validation doit être exprimé dans un format spécial :
690
+
691
+ data (taille)\n(contenu)
692
+
693
+ Le format est composé du mot « data », la taille des données à lire, un caractère saut de ligne, et finalement les données.
694
+ Ce format est réutilisé plus tard, alors autant créer une méthode auxiliaire, `export_data` :
695
+
696
+ def export_data(string)
697
+ print "data #{string.size}\n#{string}"
698
+ end
699
+
700
+ Il reste seulement à spécifier le contenu en fichiers de chaque instantané.
701
+ C'est facile, car vous les avez dans le répertoire.
702
+ Git va alors enregistrer de manière appropriée chaque instantané :
703
+
704
+ puts 'deleteall'
705
+ Dir.glob("**/*").each do |file|
706
+ next if !File.file?(file)
707
+ inline_data(file)
708
+ end
709
+
710
+ Note: Comme de nombreux systèmes conçoivent leurs révisions comme des modifications d'un *commit* à l'autre, fast-import accepte aussi avec chaque *commit* des commandes qui spécifient quels fichiers ont été ajoutés, effacés ou modifiés et ce que sont les nouveaux contenus.
711
+ Vous pourriez calculer les différences entre chaque instantané et ne fournir que ces données, mais cela est plus complexe — vous pourriez tout aussi bien fournir à Git toutes les données et lui laisser faire le travail.
712
+ Si c'est ce qui convient mieux à vos données, référez-vous à la page de manuel de `fast-import` pour savoir comment fournir les données de cette façon.
713
+
714
+ Le format pour lister le contenu d'un nouveau fichier ou spécifier le nouveau contenu d'un fichier modifié est comme suit :
715
+
716
+ M 644 inline chemin/du/fichier
717
+ data (taille)
718
+ (contenu du fichier)
719
+
720
+ Ici, 644 est le mode (si vous avez des fichiers exécutables, vous devez le détecter et spécifier plutôt 755), « inline » signifie que le contenu du fichier sera listé immédiatement après cette ligne.
721
+ La méthode `inline_data` ressemble à ceci :
722
+
723
+ def inline_data(file, code = 'M', mode = '644')
724
+ content = File.read(file)
725
+ puts "#{code} #{mode} inline #{file}"
726
+ export_data(content)
727
+ end
728
+
729
+ Nous réutilisons la méthode `export_data` définie plus tôt, car c'est la même méthode que pour spécifier les données du message de validation.
730
+
731
+ La dernière chose à faire consiste à retourner la marque actuelle pour pouvoir la passer à la prochaine itération :
732
+
733
+ return mark
734
+
735
+ NOTE : si vous utilisez Windows, vous devrez vous assurer d'ajouter une étape supplémentaire.
736
+ Comme mentionné auparavant, Windows utilise CRLF comme caractère de retour à la ligne tandis que `git fast-import` s'attend à LF.
737
+ Pour contourner ce problème et satisfaire `git fast-import`, il faut forcer Ruby à utiliser LF au lieu de CRLF :
738
+
739
+ $stdout.binmode
740
+
741
+ Et voilà.
742
+ Si vous lancez ce script, vous obtiendrez un contenu qui ressemble à ceci :
743
+
744
+ $ ruby import.rb /opt/import_from
745
+ commit refs/heads/master
746
+ mark :1
747
+ committer Scott Chacon <schacon@geemail.com> 1230883200 -0700
748
+ data 29
749
+ imported from back_2009_01_02deleteall
750
+ M 644 inline file.rb
751
+ data 12
752
+ version two
753
+ commit refs/heads/master
754
+ mark :2
755
+ committer Scott Chacon <schacon@geemail.com> 1231056000 -0700
756
+ data 29
757
+ imported from back_2009_01_04from :1
758
+ deleteall
759
+ M 644 inline file.rb
760
+ data 14
761
+ version three
762
+ M 644 inline new.rb
763
+ data 16
764
+ new version one
765
+ (...)
766
+
767
+ Pour lancer l'outil d'import, redirigez cette sortie dans `git fast-import` alors que vous vous trouvez dans le projet Git dans lequel vous souhaitez importer.
768
+ Vous pouvez créer un nouveau répertoire, puis l'initialiser avec `git init`, puis lancer votre script :
769
+
770
+ $ git init
771
+ Initialized empty Git repository in /opt/import_to/.git/
772
+ $ ruby import.rb /opt/import_from | git fast-import
773
+ git-fast-import statistics:
774
+ ---------------------------------------------------------------------
775
+ Alloc'd objects: 5000
776
+ Total objects: 18 ( 1 duplicates )
777
+ blobs  : 7 ( 1 duplicates 0 deltas)
778
+ trees  : 6 ( 0 duplicates 1 deltas)
779
+ commits: 5 ( 0 duplicates 0 deltas)
780
+ tags  : 0 ( 0 duplicates 0 deltas)
781
+ Total branches: 1 ( 1 loads )
782
+ marks: 1024 ( 5 unique )
783
+ atoms: 3
784
+ Memory total: 2255 KiB
785
+ pools: 2098 KiB
786
+ objects: 156 KiB
787
+ ---------------------------------------------------------------------
788
+ pack_report: getpagesize() = 4096
789
+ pack_report: core.packedGitWindowSize = 33554432
790
+ pack_report: core.packedGitLimit = 268435456
791
+ pack_report: pack_used_ctr = 9
792
+ pack_report: pack_mmap_calls = 5
793
+ pack_report: pack_open_windows = 1 / 1
794
+ pack_report: pack_mapped = 1356 / 1356
795
+ ---------------------------------------------------------------------
796
+
797
+ Comme vous pouvez le remarquer, lorsqu'il se termine avec succès, il affiche quelques statistiques sur ses réalisations.
798
+ Dans ce cas, 18 objets ont été importés en 5 validations dans 1 branche.
799
+ À présent, `git log` permet de visualiser le nouvel historique :
800
+
801
+ $ git log -2
802
+ commit 10bfe7d22ce15ee25b60a824c8982157ca593d41
803
+ Author: Scott Chacon <schacon@example.com>
804
+ Date: Sun May 3 12:57:39 2009 -0700
805
+
806
+ imported from en_cours
807
+
808
+ commit 7e519590de754d079dd73b44d695a42c9d2df452
809
+ Author: Scott Chacon <schacon@example.com>
810
+ Date: Tue Feb 3 01:00:00 2009 -0700
811
+
812
+ imported from back_2009_02_03
813
+
814
+ Et voilà !
815
+ Un joli dépôt Git tout propre.
816
+ Il est important de noter que rien n'a été extrait.
817
+ Présentement, aucun fichier n'est présent dans votre copie de travail.
818
+ Pour les avoir, vous devez réinitialiser votre branche sur `master` :
819
+
820
+ $ ls
821
+ $ git reset --hard master
822
+ HEAD is now at 10bfe7d imported from en_cours
823
+ $ ls
824
+ file.rb lib
825
+
826
+ Vous pouvez faire bien plus avec l'outil `fast-import` — gérer différents modes, les données binaires, les branches multiples et la fusion, les étiquettes, les indicateurs de progrès, et plus encore.
827
+ Des exemples de scénarios plus complexes sont disponibles dans le répertoire `contrib/fast-import` du code source Git ; un des meilleurs est justement le script `git-p4` traité précédemment.
828
+
829
+ ## Résumé ##
830
+
831
+ Vous devriez être à l'aise à l'utilisation de Git avec Subversion ou pour l'import de quasiment toutes les sortes de dépôts dans un nouveau Git sans perdre de données.
832
+ Le chapitre suivant traitera des structures internes de Git pour vous permettre d'en retailler chaque octet, si le besoin s'en fait sentir.