Merge lp:bzr-ch into lp:bzr

Proposed by Jack Yu
Status: Needs review
Proposed branch: lp:bzr-ch
Merge into: lp:bzr
Diff against target: 20264 lines (+19762/-1)
92 files modified
doc/ch/_static/en/Makefile (+23/-0)
doc/ch/_static/en/bzr-en-quick-reference.svg (+1598/-0)
doc/ch/_templates/index.html (+84/-0)
doc/ch/_templates/layout.html (+8/-0)
doc/ch/admin-guide/advanced.txt (+107/-0)
doc/ch/admin-guide/backup.txt (+119/-0)
doc/ch/admin-guide/code-browsing.txt (+82/-0)
doc/ch/admin-guide/hooks-plugins.txt (+199/-0)
doc/ch/admin-guide/index-plain.txt (+24/-0)
doc/ch/admin-guide/index.txt (+26/-0)
doc/ch/admin-guide/integration.txt (+14/-0)
doc/ch/admin-guide/introduction.txt (+30/-0)
doc/ch/admin-guide/licence.txt (+4/-0)
doc/ch/admin-guide/migration.txt (+41/-0)
doc/ch/admin-guide/other-setups.txt (+32/-0)
doc/ch/admin-guide/security.txt (+57/-0)
doc/ch/admin-guide/simple-setups.txt (+90/-0)
doc/ch/admin-guide/upgrade.txt (+29/-0)
doc/ch/conf.py (+106/-0)
doc/ch/index.txt (+20/-0)
doc/ch/mini-tutorial/index.txt (+212/-0)
doc/ch/tutorials/centralized_workflow.txt (+318/-0)
doc/ch/tutorials/index.txt (+11/-0)
doc/ch/tutorials/licence.txt (+7/-0)
doc/ch/tutorials/tutorial.txt (+647/-0)
doc/ch/tutorials/using_bazaar_with_launchpad.txt (+323/-0)
doc/ch/user-guide/adv_merging.txt (+78/-0)
doc/ch/user-guide/annotating_changes.txt (+28/-0)
doc/ch/user-guide/bazaar_workflows.txt (+122/-0)
doc/ch/user-guide/branching_a_project.txt (+80/-0)
doc/ch/user-guide/browsing_history.txt (+75/-0)
doc/ch/user-guide/bug_trackers.txt (+34/-0)
doc/ch/user-guide/bzrtools_plugin.txt (+31/-0)
doc/ch/user-guide/central_intro.txt (+20/-0)
doc/ch/user-guide/configuring_bazaar.txt (+147/-0)
doc/ch/user-guide/controlling_registration.txt (+67/-0)
doc/ch/user-guide/core_concepts.txt (+86/-0)
doc/ch/user-guide/distributed_intro.txt (+19/-0)
doc/ch/user-guide/entering_commands.txt (+33/-0)
doc/ch/user-guide/filtered_views.txt (+119/-0)
doc/ch/user-guide/getting_help.txt (+19/-0)
doc/ch/user-guide/gpg_signatures.txt (+64/-0)
doc/ch/user-guide/hooks.txt (+82/-0)
doc/ch/user-guide/http_smart_server.txt (+243/-0)
doc/ch/user-guide/images/workflows_centralized.svg (+1542/-0)
doc/ch/user-guide/images/workflows_gatekeeper.svg (+2137/-0)
doc/ch/user-guide/images/workflows_localcommit.svg (+1575/-0)
doc/ch/user-guide/images/workflows_peer.svg (+1589/-0)
doc/ch/user-guide/images/workflows_pqm.svg (+1794/-0)
doc/ch/user-guide/images/workflows_shared.svg (+1594/-0)
doc/ch/user-guide/images/workflows_single.svg (+1079/-0)
doc/ch/user-guide/index-plain.txt (+121/-0)
doc/ch/user-guide/index.txt (+144/-0)
doc/ch/user-guide/installing_bazaar.txt (+80/-0)
doc/ch/user-guide/introducing_bazaar.txt (+85/-0)
doc/ch/user-guide/licence.txt (+4/-0)
doc/ch/user-guide/merging_changes.txt (+65/-0)
doc/ch/user-guide/organizing_branches.txt (+77/-0)
doc/ch/user-guide/organizing_your_workspace.txt (+140/-0)
doc/ch/user-guide/part2_intro.txt (+7/-0)
doc/ch/user-guide/partner_intro.txt (+31/-0)
doc/ch/user-guide/partner_intro.txt-bak (+39/-0)
doc/ch/user-guide/plugins.txt (+70/-0)
doc/ch/user-guide/publishing_a_branch.txt (+57/-0)
doc/ch/user-guide/recording_changes.txt (+50/-0)
doc/ch/user-guide/releasing_a_project.txt (+36/-0)
doc/ch/user-guide/resolving_conflicts.txt (+60/-0)
doc/ch/user-guide/reusing_a_checkout.txt (+56/-0)
doc/ch/user-guide/reviewing_changes.txt (+50/-0)
doc/ch/user-guide/sending_changes.txt (+43/-0)
doc/ch/user-guide/server.txt (+79/-0)
doc/ch/user-guide/setting_up_email.txt (+77/-0)
doc/ch/user-guide/shared_repository_layouts.txt (+267/-0)
doc/ch/user-guide/shelving_changes.txt (+92/-0)
doc/ch/user-guide/solo_intro.txt (+18/-0)
doc/ch/user-guide/specifying_revisions.txt (+143/-0)
doc/ch/user-guide/stacked.txt (+91/-0)
doc/ch/user-guide/starting_a_project.txt (+40/-0)
doc/ch/user-guide/svn_plugin.txt (+84/-0)
doc/ch/user-guide/switch_store.txt (+76/-0)
doc/ch/user-guide/undoing_mistakes.txt (+123/-0)
doc/ch/user-guide/using_aliases.txt (+50/-0)
doc/ch/user-guide/using_checkouts.txt (+66/-0)
doc/ch/user-guide/using_gatekeepers.txt (+31/-0)
doc/ch/user-guide/version_info.txt (+70/-0)
doc/ch/user-guide/web_browsing.txt (+11/-0)
doc/ch/user-guide/working_offline_central.txt (+39/-0)
doc/ch/user-guide/writing_a_plugin.txt (+46/-0)
doc/ch/user-guide/zen.txt (+153/-0)
doc/en/user-guide/Makefile (+121/-0)
doc/en/user-guide/index-plain.txt (+1/-1)
doc/index.txt (+1/-0)
To merge this branch: bzr merge lp:bzr-ch
Reviewer Review Type Date Requested Status
Jack Yu (community) Approve
bzr-core Pending
John A Meinel Pending
Martin Pool Pending
Review via email: mp+135679@code.launchpad.net

Commit message

add four chinese documents

Description of the change

This branch translates four docs to chinese, including user guide, admin guide, bazaar in five minutes and using bazaar with launchpad. We add a directory 'doc/ch'. You can test it using 'make html' at that directory.

To post a comment you must log in.
Revision history for this message
Jack Yu (jackyu) :
review: Approve
lp:bzr-ch updated
6595. By Jack Yu

mature version of 4 chinese docs

Unmerged revisions

6595. By Jack Yu

mature version of 4 chinese docs

6594. By Jack Yu

merge newest bazaar code

6593. By Jack Yu

all done

6592. By Jack Yu

error in user guide

6591. By Jack Yu

modify some errors

6590. By Jack Yu

modify the index.html

6589. By Jack Yu

test

6588. By Jack Yu

modify some errors

6587. By Jack Yu

modify some errors

6586. By Jack Yu

modify some errors

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added directory 'doc/ch'
=== added directory 'doc/ch/_static'
=== added file 'doc/ch/_static/bzr icon 16.png'
0Binary files doc/ch/_static/bzr icon 16.png 1970-01-01 00:00:00 +0000 and doc/ch/_static/bzr icon 16.png 2012-11-23 02:18:19 +0000 differ0Binary files doc/ch/_static/bzr icon 16.png 1970-01-01 00:00:00 +0000 and doc/ch/_static/bzr icon 16.png 2012-11-23 02:18:19 +0000 differ
=== added file 'doc/ch/_static/bzr.ico'
1Binary files doc/ch/_static/bzr.ico 1970-01-01 00:00:00 +0000 and doc/ch/_static/bzr.ico 2012-11-23 02:18:19 +0000 differ1Binary files doc/ch/_static/bzr.ico 1970-01-01 00:00:00 +0000 and doc/ch/_static/bzr.ico 2012-11-23 02:18:19 +0000 differ
=== added directory 'doc/ch/_static/en'
=== added file 'doc/ch/_static/en/Makefile'
--- doc/ch/_static/en/Makefile 1970-01-01 00:00:00 +0000
+++ doc/ch/_static/en/Makefile 2012-11-23 02:18:19 +0000
@@ -0,0 +1,23 @@
1# If you feel the need to duplicate this file, you'll win the right to refactor
2# doc/*/quick-reference/Makefile and update TARGETS and OBJECTS usages in
3# doc/Makefile
4
5TARGETS=bzr-en-quick-reference.png bzr-en-quick-reference.pdf
6OBJECTS=bzr-en-quick-reference.svg Makefile
7
8all: $(TARGETS)
9
10.SUFFIXES: .svg .png .pdf
11
12.svg.pdf:
13 rsvg-convert -d 300 -p 300 -f pdf -o $@ $<
14
15.svg.png:
16 rsvg-convert -d 300 -p 300 -z 3.3346 -f png -o $@ $<
17
18bzr-en-quick-reference.png: $(OBJECTS)
19
20bzr-en-quick-reference.pdf: $(OBJECTS)
21
22clean:
23 rm -f $(TARGETS)
024
=== added file 'doc/ch/_static/en/bzr-en-quick-reference.pdf'
1Binary files doc/ch/_static/en/bzr-en-quick-reference.pdf 1970-01-01 00:00:00 +0000 and doc/ch/_static/en/bzr-en-quick-reference.pdf 2012-11-23 02:18:19 +0000 differ25Binary files doc/ch/_static/en/bzr-en-quick-reference.pdf 1970-01-01 00:00:00 +0000 and doc/ch/_static/en/bzr-en-quick-reference.pdf 2012-11-23 02:18:19 +0000 differ
=== added file 'doc/ch/_static/en/bzr-en-quick-reference.png'
2Binary files doc/ch/_static/en/bzr-en-quick-reference.png 1970-01-01 00:00:00 +0000 and doc/ch/_static/en/bzr-en-quick-reference.png 2012-11-23 02:18:19 +0000 differ26Binary files doc/ch/_static/en/bzr-en-quick-reference.png 1970-01-01 00:00:00 +0000 and doc/ch/_static/en/bzr-en-quick-reference.png 2012-11-23 02:18:19 +0000 differ
=== added file 'doc/ch/_static/en/bzr-en-quick-reference.svg'
--- doc/ch/_static/en/bzr-en-quick-reference.svg 1970-01-01 00:00:00 +0000
+++ doc/ch/_static/en/bzr-en-quick-reference.svg 2012-11-23 02:18:19 +0000
@@ -0,0 +1,1598 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3<svg
4 xmlns:dc="http://purl.org/dc/elements/1.1/"
5 xmlns:cc="http://creativecommons.org/ns#"
6 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
7 xmlns:svg="http://www.w3.org/2000/svg"
8 xmlns="http://www.w3.org/2000/svg"
9 xmlns:xlink="http://www.w3.org/1999/xlink"
10 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12 width="1052.3622"
13 height="744.09448"
14 id="svg2766"
15 sodipodi:version="0.32"
16 inkscape:version="0.46"
17 version="1.0"
18 sodipodi:docbase="/home/ian/bzr/repo.packs/bzr.quick-start-tweaks/doc/en/quick-reference"
19 sodipodi:docname="quick-start-summary.svg"
20 inkscape:output_extension="org.inkscape.output.svg.inkscape"
21 inkscape:export-filename="/home/iacobs/work/pers/bzr-quickref.png"
22 inkscape:export-xdpi="300"
23 inkscape:export-ydpi="300">
24 <defs
25 id="defs2768">
26 <linearGradient
27 id="linearGradient3382">
28 <stop
29 style="stop-color:#2753b0;stop-opacity:1;"
30 offset="0"
31 id="stop3384" />
32 <stop
33 style="stop-color:#cecece;stop-opacity:1;"
34 offset="1"
35 id="stop3386" />
36 </linearGradient>
37 <linearGradient
38 inkscape:collect="always"
39 xlink:href="#linearGradient3382"
40 id="linearGradient5465"
41 x1="164.4165"
42 y1="380.09448"
43 x2="164.4165"
44 y2="436.59479"
45 gradientUnits="userSpaceOnUse" />
46 <linearGradient
47 inkscape:collect="always"
48 xlink:href="#linearGradient3382"
49 id="linearGradient5473"
50 x1="164.4165"
51 y1="380.09448"
52 x2="164.4165"
53 y2="436.59479"
54 gradientUnits="userSpaceOnUse" />
55 <linearGradient
56 inkscape:collect="always"
57 xlink:href="#linearGradient3382"
58 id="linearGradient5603"
59 gradientUnits="userSpaceOnUse"
60 x1="150.39197"
61 y1="104.09448"
62 x2="151.10625"
63 y2="155.92776"
64 gradientTransform="translate(0,26)" />
65 <linearGradient
66 inkscape:collect="always"
67 xlink:href="#linearGradient3382"
68 id="linearGradient5605"
69 gradientUnits="userSpaceOnUse"
70 x1="165.19594"
71 y1="104.09448"
72 x2="165.19594"
73 y2="156.84296"
74 gradientTransform="translate(0,26)" />
75 <linearGradient
76 inkscape:collect="always"
77 xlink:href="#linearGradient3382"
78 id="linearGradient8641"
79 x1="852.71942"
80 y1="104.09448"
81 x2="852.71942"
82 y2="153.842"
83 gradientUnits="userSpaceOnUse" />
84 <linearGradient
85 inkscape:collect="always"
86 xlink:href="#linearGradient3382"
87 id="linearGradient8649"
88 x1="852.71942"
89 y1="104.09448"
90 x2="852.71942"
91 y2="153.842"
92 gradientUnits="userSpaceOnUse" />
93 <linearGradient
94 inkscape:collect="always"
95 xlink:href="#linearGradient3382"
96 id="linearGradient8696"
97 x1="814.96497"
98 y1="364.08444"
99 x2="814.96497"
100 y2="412.09879"
101 gradientUnits="userSpaceOnUse" />
102 <linearGradient
103 inkscape:collect="always"
104 xlink:href="#linearGradient3382"
105 id="linearGradient8704"
106 x1="814.96497"
107 y1="364.08444"
108 x2="814.96497"
109 y2="412.09879"
110 gradientUnits="userSpaceOnUse" />
111 <linearGradient
112 inkscape:collect="always"
113 xlink:href="#linearGradient3382"
114 id="linearGradient13456"
115 gradientUnits="userSpaceOnUse"
116 x1="401.62418"
117 y1="104.09448"
118 x2="402.0069"
119 y2="152.69125" />
120 <linearGradient
121 inkscape:collect="always"
122 xlink:href="#linearGradient3382"
123 id="linearGradient13458"
124 gradientUnits="userSpaceOnUse"
125 x1="401.62418"
126 y1="104.09448"
127 x2="402.0069"
128 y2="152.69125" />
129 <linearGradient
130 gradientTransform="matrix(1.027169,0,0,1,118.6039,77.1455)"
131 gradientUnits="userSpaceOnUse"
132 y2="0"
133 x2="372.24512"
134 y1="69.037941"
135 x1="372.24512"
136 id="linearGradient2200"
137 xlink:href="#linearGradient5444"
138 inkscape:collect="always" />
139 <linearGradient
140 id="linearGradient5444">
141 <stop
142 style="stop-color:#729fcf;stop-opacity:1;"
143 offset="0"
144 id="stop5446" />
145 <stop
146 id="stop4547"
147 offset="0.5"
148 style="stop-color:#3465a4;stop-opacity:1;" />
149 <stop
150 style="stop-color:#204ab7;stop-opacity:1;"
151 offset="1"
152 id="stop5448" />
153 </linearGradient>
154 <linearGradient
155 inkscape:collect="always"
156 xlink:href="#linearGradient5444"
157 id="linearGradient3338"
158 gradientUnits="userSpaceOnUse"
159 gradientTransform="matrix(1.027169,0,0,1,417.31189,-41.4259)"
160 x1="372.24512"
161 y1="69.037941"
162 x2="372.24512"
163 y2="0" />
164 <linearGradient
165 inkscape:collect="always"
166 xlink:href="#linearGradient3382"
167 id="linearGradient2645"
168 gradientUnits="userSpaceOnUse"
169 x1="625.15149"
170 y1="104.09448"
171 x2="625.15149"
172 y2="154.2104" />
173 <linearGradient
174 inkscape:collect="always"
175 xlink:href="#linearGradient3382"
176 id="linearGradient2647"
177 gradientUnits="userSpaceOnUse"
178 x1="625.15149"
179 y1="104.09448"
180 x2="625.15149"
181 y2="154.2104" />
182 </defs>
183 <sodipodi:namedview
184 id="base"
185 pagecolor="#ffffff"
186 bordercolor="#666666"
187 borderopacity="1.0"
188 gridtolerance="10000"
189 guidetolerance="10"
190 objecttolerance="10"
191 inkscape:pageopacity="0.0"
192 inkscape:pageshadow="2"
193 inkscape:zoom="0.70710678"
194 inkscape:cx="800.64614"
195 inkscape:cy="357.97261"
196 inkscape:document-units="px"
197 inkscape:current-layer="g3488"
198 width="1052.3622px"
199 height="744.09449px"
200 inkscape:showpageshadow="false"
201 showgrid="false"
202 inkscape:window-width="1280"
203 inkscape:window-height="752"
204 inkscape:window-x="0"
205 inkscape:window-y="25" />
206 <metadata
207 id="metadata2771">
208 <rdf:RDF>
209 <cc:Work
210 rdf:about="">
211 <dc:format>image/svg+xml</dc:format>
212 <dc:type
213 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
214 <cc:license
215 rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
216 <dc:title>Bazaar-NG quick reference</dc:title>
217 <dc:date>2007-07-23</dc:date>
218 <dc:creator>
219 <cc:Agent>
220 <dc:title>Sabin Iacob</dc:title>
221 </cc:Agent>
222 </dc:creator>
223 <dc:language>en</dc:language>
224 <dc:subject>
225 <rdf:Bag>
226 <rdf:li>bzr</rdf:li>
227 <rdf:li>bazaar</rdf:li>
228 <rdf:li>reference</rdf:li>
229 </rdf:Bag>
230 </dc:subject>
231 </cc:Work>
232 <cc:License
233 rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
234 <cc:permits
235 rdf:resource="http://web.resource.org/cc/Reproduction" />
236 <cc:permits
237 rdf:resource="http://web.resource.org/cc/Distribution" />
238 <cc:requires
239 rdf:resource="http://web.resource.org/cc/Notice" />
240 <cc:permits
241 rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
242 <cc:requires
243 rdf:resource="http://web.resource.org/cc/ShareAlike" />
244 <cc:requires
245 rdf:resource="http://web.resource.org/cc/SourceCode" />
246 </cc:License>
247 </rdf:RDF>
248 </metadata>
249 <g
250 inkscape:label="Layer 1"
251 inkscape:groupmode="layer"
252 id="layer1">
253 <rect
254 style="opacity:1;fill:none;fill-opacity:0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
255 id="rect2983"
256 width="1052.1749"
257 height="744"
258 x="0"
259 y="0.094482422"
260 ry="0" />
261 <g
262 id="g3762">
263 <g
264 id="g8706">
265 <rect
266 style="fill:none;fill-opacity:0;fill-rule:nonzero;stroke:#cecece;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
267 id="rect2190"
268 width="228.60797"
269 height="216.41451"
270 x="50.891964"
271 y="144.31995"
272 ry="8.1168776" />
273 <path
274 style="fill:url(#linearGradient5603);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient5605);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
275 d="M 59.296663,130.59448 C 54.644771,130.59448 50.891959,134.22213 50.891959,138.71888 L 50.891959,167.43551 C 50.891959,162.93876 54.644771,159.31111 59.296663,159.31111 L 271.12755,159.31111 C 275.77946,159.31111 279.49993,162.93876 279.49993,167.43551 L 279.49993,138.71888 C 279.49993,134.22213 275.77946,130.59448 271.12755,130.59448 L 59.296663,130.59448 z "
276 id="rect3430" />
277 <text
278 xml:space="preserve"
279 style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
280 x="108.32876"
281 y="150.97269"
282 id="text3164"
283 sodipodi:linespacing="100%"><tspan
284 sodipodi:role="line"
285 id="tspan3166"
286 x="108.32876"
287 y="150.97269">Initialization</tspan></text>
288 </g>
289 <g
290 transform="translate(1e-4,-2.2095387)"
291 id="g3209">
292 <text
293 xml:space="preserve"
294 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
295 x="63.794312"
296 y="193.07361"
297 id="text2167"
298 sodipodi:linespacing="110%"><tspan
299 sodipodi:role="line"
300 x="63.794312"
301 y="193.07361"
302 id="tspan2171">bzr init myproject</tspan></text>
303 <text
304 xml:space="preserve"
305 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
306 x="58.209351"
307 y="179.83536"
308 id="text3168"
309 sodipodi:linespacing="100%"><tspan
310 sodipodi:role="line"
311 id="tspan3170"
312 x="58.209351"
313 y="179.83536">New project</tspan></text>
314 </g>
315 <g
316 transform="translate(1e-4,-1.1449276)"
317 id="g3215">
318 <text
319 xml:space="preserve"
320 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
321 x="64.448624"
322 y="226.45848"
323 id="text2175"
324 sodipodi:linespacing="110%"><tspan
325 sodipodi:role="line"
326 id="tspan2177"
327 x="64.448624"
328 y="226.45848">cd myproject</tspan><tspan
329 sodipodi:role="line"
330 x="64.448624"
331 y="237.53181"
332 id="tspan2179">bzr init</tspan><tspan
333 sodipodi:role="line"
334 x="64.448624"
335 y="248.60515"
336 id="tspan2181">bzr add .</tspan><tspan
337 sodipodi:role="line"
338 x="64.448624"
339 y="259.67848"
340 id="tspan2183" /></text>
341 <text
342 xml:space="preserve"
343 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
344 x="58.174194"
345 y="213.22023"
346 id="text3172"
347 sodipodi:linespacing="100%"><tspan
348 sodipodi:role="line"
349 id="tspan3174"
350 x="58.174194"
351 y="213.22023">Existing project</tspan></text>
352 </g>
353 <g
354 transform="translate(1e-4,5.3457864e-2)"
355 id="g3224">
356 <text
357 xml:space="preserve"
358 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
359 x="64.448624"
360 y="277.48495"
361 id="text2185"
362 sodipodi:linespacing="110%"><tspan
363 sodipodi:role="line"
364 id="tspan2187"
365 x="64.448624"
366 y="277.48495">bzr branch myproject newproject</tspan></text>
367 <text
368 xml:space="preserve"
369 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
370 x="58.209351"
371 y="266.6666"
372 id="text3176"
373 sodipodi:linespacing="100%"><tspan
374 sodipodi:role="line"
375 id="tspan3178"
376 x="58.209351"
377 y="266.6666">New branch</tspan></text>
378 </g>
379 <g
380 transform="translate(1e-4,1.1181147)"
381 id="g3230">
382 <text
383 xml:space="preserve"
384 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
385 x="64.448624"
386 y="308.44989"
387 id="text3404"
388 sodipodi:linespacing="110%"><tspan
389 sodipodi:role="line"
390 id="tspan3406"
391 x="64.448624"
392 y="308.44989">bzr checkout srcproject myproject</tspan></text>
393 <text
394 xml:space="preserve"
395 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
396 x="58.209351"
397 y="297.63153"
398 id="text3408"
399 sodipodi:linespacing="100%"><tspan
400 sodipodi:role="line"
401 id="tspan3410"
402 x="58.209351"
403 y="297.63153">New checkout</tspan></text>
404 </g>
405 <g
406 transform="translate(1e-4,2.1828937)"
407 id="g3236">
408 <text
409 xml:space="preserve"
410 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
411 x="64.448624"
412 y="341.88864"
413 id="text3414"
414 sodipodi:linespacing="110%"><tspan
415 id="tspan3424"
416 sodipodi:role="line"
417 x="64.448624"
418 y="341.88864">bzr checkout --lightweight \</tspan><tspan
419 sodipodi:role="line"
420 x="64.448624"
421 y="352.96197"
422 id="tspan2780"> srcproject myproject</tspan></text>
423 <text
424 xml:space="preserve"
425 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
426 x="58.209351"
427 y="328.59634"
428 id="text3418"
429 sodipodi:linespacing="100%"><tspan
430 id="tspan3422"
431 sodipodi:role="line"
432 x="58.209351"
433 y="328.59634">New &quot;lightweight&quot; checkout</tspan></text>
434 </g>
435 </g>
436 <g
437 id="g3798">
438 <g
439 transform="translate(0,26)"
440 id="g10801">
441 <rect
442 style="fill:none;fill-opacity:0;fill-rule:nonzero;stroke:#cecece;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
443 id="rect3658"
444 width="188.26918"
445 height="135.69968"
446 x="317.78247"
447 y="119.55301"
448 ry="9.6352606" />
449 <path
450 style="fill:url(#linearGradient13456);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient13458);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
451 d="M 327.43269,104.59448 C 322.09476,104.59448 317.77644,108.88155 317.77644,114.21948 L 317.77644,144.21948 C 317.77644,138.88155 322.09476,134.59448 327.43269,134.59448 L 496.43269,134.59448 C 501.77063,134.59448 506.05769,138.88155 506.05769,144.21948 L 506.05769,114.21948 C 506.05769,108.88155 501.77063,104.59448 496.43269,104.59448 L 327.43269,104.59448 z "
452 id="rect3648" />
453 <text
454 xml:space="preserve"
455 style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
456 x="333.44049"
457 y="124.94995"
458 id="text3563"
459 sodipodi:linespacing="100%"><tspan
460 sodipodi:role="line"
461 id="tspan3565"
462 x="333.44049"
463 y="124.94995">File Manipulation</tspan></text>
464 </g>
465 <g
466 transform="translate(1e-4,-1.9729054)"
467 id="g3243">
468 <text
469 xml:space="preserve"
470 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
471 x="332.47345"
472 y="191.36041"
473 id="text3610"
474 sodipodi:linespacing="110%"><tspan
475 sodipodi:role="line"
476 x="332.47345"
477 y="191.36041"
478 id="tspan3612">bzr add foo.py</tspan><tspan
479 id="tspan3618"
480 sodipodi:role="line"
481 x="332.47345"
482 y="202.43375">bzr add bar/</tspan></text>
483 <text
484 xml:space="preserve"
485 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
486 x="326.88849"
487 y="179.59872"
488 id="text3614"
489 sodipodi:linespacing="110%"><tspan
490 sodipodi:role="line"
491 id="tspan3616"
492 x="326.88849"
493 y="179.59872">Add/&quot;version&quot; files</tspan></text>
494 </g>
495 <g
496 transform="translate(1e-4,-0.9323495)"
497 id="g3250">
498 <text
499 xml:space="preserve"
500 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
501 x="331.78732"
502 y="233.11641"
503 id="text3622"
504 sodipodi:linespacing="110%"><tspan
505 sodipodi:role="line"
506 x="331.78732"
507 y="233.11641"
508 id="tspan3624">bzr remove --keep foo.py</tspan></text>
509 <text
510 xml:space="preserve"
511 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
512 x="326.20236"
513 y="221.35472"
514 id="text3626"
515 sodipodi:linespacing="100%"><tspan
516 sodipodi:role="line"
517 id="tspan3628"
518 x="326.20236"
519 y="221.35472">Remove/&quot;unversion&quot; files</tspan></text>
520 </g>
521 <g
522 transform="translate(1e-4,0.1322158)"
523 id="g3256">
524 <text
525 xml:space="preserve"
526 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
527 x="331.81714"
528 y="264.08142"
529 id="text3632"
530 sodipodi:linespacing="110%"><tspan
531 sodipodi:role="line"
532 x="331.81714"
533 y="264.08142"
534 id="tspan3634">bzr remove --no-backup foo.py</tspan></text>
535 <text
536 xml:space="preserve"
537 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
538 x="326.23218"
539 y="253.26308"
540 id="text3636"
541 sodipodi:linespacing="100%"><tspan
542 sodipodi:role="line"
543 id="tspan3638"
544 x="326.23218"
545 y="253.26308">Remove and delete files</tspan></text>
546 </g>
547 </g>
548 <g
549 id="g3524">
550 <g
551 id="g8747">
552 <rect
553 style="fill:none;fill-opacity:0;fill-rule:nonzero;stroke:#cecece;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
554 id="rect3780"
555 width="229.94412"
556 height="319.25848"
557 x="49.444439"
558 y="394.427"
559 ry="9.9539938" />
560 <path
561 style="fill:url(#linearGradient5465);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient5473);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
562 d="M 57.795026,380.59448 C 53.111409,380.59448 49.333004,384.22215 49.333004,388.71892 L 49.333004,417.43572 C 49.333004,412.93894 53.111409,409.31127 57.795026,409.31127 L 271.07052,409.31127 C 275.75416,409.31127 279.5,412.93894 279.5,417.43572 L 279.5,388.71892 C 279.5,384.22215 275.75416,380.59448 271.07052,380.59448 L 57.795026,380.59448 z "
563 id="path3784" />
564 <text
565 xml:space="preserve"
566 style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
567 x="111.15869"
568 y="400.96985"
569 id="text3786"
570 sodipodi:linespacing="100%"><tspan
571 sodipodi:role="line"
572 id="tspan3788"
573 x="111.15869"
574 y="400.96985">Information</tspan></text>
575 </g>
576 <g
577 transform="translate(1e-4,0.4441055)"
578 id="g3281">
579 <text
580 xml:space="preserve"
581 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
582 x="62.69976"
583 y="441.34354"
584 id="text3234"
585 sodipodi:linespacing="110%"><tspan
586 sodipodi:role="line"
587 x="62.69976"
588 y="441.34354"
589 id="tspan3236">bzr status</tspan></text>
590 <text
591 xml:space="preserve"
592 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
593 x="57.114799"
594 y="428.10529"
595 id="text3238"
596 sodipodi:linespacing="100%"><tspan
597 sodipodi:role="line"
598 id="tspan3240"
599 x="57.114799"
600 y="428.10529">Working tree status</tspan></text>
601 </g>
602 <g
603 transform="translate(1e-4,1.4958392)"
604 id="g3287">
605 <text
606 xml:space="preserve"
607 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
608 x="62.721241"
609 y="472.84393"
610 id="text3244"
611 sodipodi:linespacing="110%"><tspan
612 sodipodi:role="line"
613 x="62.721241"
614 y="472.84393"
615 id="tspan3250">bzr log</tspan><tspan
616 id="tspan3294"
617 sodipodi:role="line"
618 x="62.721241"
619 y="483.91727">bzr log foo.py</tspan><tspan
620 sodipodi:role="line"
621 x="62.721241"
622 y="494.9906"
623 id="tspan3252" /></text>
624 <text
625 xml:space="preserve"
626 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
627 x="56.446827"
628 y="459.55164"
629 id="text3254"
630 sodipodi:linespacing="100%"><tspan
631 sodipodi:role="line"
632 id="tspan3256"
633 x="56.446827"
634 y="459.55164">Revision log</tspan></text>
635 </g>
636 <g
637 transform="translate(1e-4,2.6343158)"
638 id="g3295">
639 <text
640 xml:space="preserve"
641 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
642 x="63.354061"
643 y="517.29712"
644 id="text3260"
645 sodipodi:linespacing="110%"><tspan
646 sodipodi:role="line"
647 id="tspan3262"
648 x="63.354061"
649 y="517.29712">bzr diff</tspan></text>
650 <text
651 xml:space="preserve"
652 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
653 x="57.114803"
654 y="504.05884"
655 id="text3264"
656 sodipodi:linespacing="100%"><tspan
657 sodipodi:role="line"
658 id="tspan3266"
659 x="57.114803"
660 y="504.05884">Working tree changes</tspan></text>
661 </g>
662 <g
663 transform="translate(1e-4,5.8149666)"
664 id="g3314">
665 <text
666 xml:space="preserve"
667 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
668 x="62.744678"
669 y="625.09357"
670 id="text3298"
671 sodipodi:linespacing="110%"><tspan
672 sodipodi:role="line"
673 id="tspan3300"
674 x="62.744678"
675 y="625.09357">bzr missing</tspan></text>
676 <text
677 xml:space="preserve"
678 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
679 x="56.505421"
680 y="611.85535"
681 id="text3302"
682 sodipodi:linespacing="100%"><tspan
683 sodipodi:role="line"
684 id="tspan3304"
685 x="56.505421"
686 y="611.85535">Missing revisions</tspan></text>
687 </g>
688 <g
689 transform="translate(1e-4,7.9315687)"
690 id="g3326">
691 <text
692 xml:space="preserve"
693 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
694 x="62.756401"
695 y="687.57349"
696 id="text3308"
697 sodipodi:linespacing="110%"><tspan
698 sodipodi:role="line"
699 id="tspan3310"
700 x="62.756401"
701 y="687.57349">bzr cat -r3 foo.py</tspan></text>
702 <text
703 xml:space="preserve"
704 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
705 x="56.517143"
706 y="674.33521"
707 id="text3312"
708 sodipodi:linespacing="100%"><tspan
709 id="tspan3326"
710 sodipodi:role="line"
711 x="56.517143"
712 y="674.33521">Contents of foo.py at revision 3</tspan></text>
713 </g>
714 <g
715 transform="translate(1e-4,6.8799266)"
716 id="g3320">
717 <text
718 xml:space="preserve"
719 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
720 x="62.686089"
721 y="656.12701"
722 id="text3318"
723 sodipodi:linespacing="110%"><tspan
724 sodipodi:role="line"
725 id="tspan3320"
726 x="62.686089"
727 y="656.12701">bzr info</tspan></text>
728 <text
729 xml:space="preserve"
730 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
731 x="56.446831"
732 y="645.30865"
733 id="text3322"
734 sodipodi:linespacing="100%"><tspan
735 sodipodi:role="line"
736 id="tspan3324"
737 x="56.446831"
738 y="645.30865">Branch information:</tspan></text>
739 </g>
740 <g
741 transform="translate(1e-4,3.685897)"
742 id="g3301">
743 <text
744 xml:space="preserve"
745 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
746 x="62.879452"
747 y="548.74365"
748 id="text3330"
749 sodipodi:linespacing="110%"><tspan
750 sodipodi:role="line"
751 id="tspan3332"
752 x="62.879452"
753 y="548.74365">bzr diff foo.py</tspan></text>
754 <text
755 xml:space="preserve"
756 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
757 x="56.640194"
758 y="535.50537"
759 id="text3334"
760 sodipodi:linespacing="100%"><tspan
761 sodipodi:role="line"
762 id="tspan3336"
763 x="56.640194"
764 y="535.50537">foo.py changes</tspan></text>
765 </g>
766 <g
767 transform="translate(1e-4,4.7504623)"
768 id="g3307">
769 <text
770 xml:space="preserve"
771 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
772 x="62.000679"
773 y="591.70862"
774 id="text3699"
775 sodipodi:linespacing="110%"><tspan
776 sodipodi:role="line"
777 id="tspan3701"
778 x="62.000679"
779 y="591.70862">bzr diff -r1..3 foo.py</tspan></text>
780 <text
781 xml:space="preserve"
782 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
783 x="55.761421"
784 y="568.89032"
785 id="text3703"
786 sodipodi:linespacing="100%"><tspan
787 sodipodi:role="line"
788 id="tspan3705"
789 x="55.761421"
790 y="568.89032">foo.py changes between </tspan><tspan
791 id="tspan3707"
792 sodipodi:role="line"
793 x="55.761421"
794 y="580.89032">revisions 1 and 3</tspan></text>
795 </g>
796 </g>
797 <g
798 id="g3821">
799 <g
800 transform="translate(0,26)"
801 id="g10830">
802 <rect
803 style="fill:none;fill-opacity:0;fill-rule:nonzero;stroke:#cecece;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
804 id="rect4132"
805 width="188.26918"
806 height="135.69968"
807 x="544.34027"
808 y="119.55301"
809 ry="9.6352606" />
810 <path
811 style="fill:url(#linearGradient2645);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2647);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
812 d="M 553.99046,104.59448 C 548.65253,104.59448 544.33421,108.88155 544.33421,114.21948 L 544.33421,144.21948 C 544.33421,138.88155 548.65253,134.59448 553.99046,134.59448 L 722.99046,134.59448 C 728.3284,134.59448 732.61546,138.88155 732.61546,144.21948 L 732.61546,114.21948 C 732.61546,108.88155 728.3284,104.59448 722.99046,104.59448 L 553.99046,104.59448 z "
813 id="path4130" />
814 <text
815 xml:space="preserve"
816 style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
817 x="569.3811"
818 y="124.94995"
819 id="text4134"
820 sodipodi:linespacing="100%"><tspan
821 sodipodi:role="line"
822 id="tspan4136"
823 x="569.3811"
824 y="124.94995">Version Control</tspan></text>
825 </g>
826 <g
827 transform="translate(1e-4,-2.4445851)"
828 id="g3262">
829 <text
830 xml:space="preserve"
831 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
832 x="559.03162"
833 y="190.88873"
834 id="text4140"
835 sodipodi:linespacing="110%"><tspan
836 sodipodi:role="line"
837 x="559.03162"
838 y="190.88873"
839 id="tspan4142">bzr commit foo.py -m &quot;foo&quot;</tspan><tspan
840 id="tspan4144"
841 sodipodi:role="line"
842 x="559.03162"
843 y="201.96207">bzr commit -m &quot;the rest&quot;</tspan></text>
844 <text
845 xml:space="preserve"
846 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
847 x="553.44666"
848 y="180.0704"
849 id="text4146"
850 sodipodi:linespacing="100%"><tspan
851 sodipodi:role="line"
852 id="tspan4148"
853 x="553.44666"
854 y="180.0704">Commit</tspan></text>
855 </g>
856 <g
857 transform="translate(1e-4,-2.6967609)"
858 id="g3269">
859 <text
860 xml:space="preserve"
861 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
862 x="558.37482"
863 y="232.2924"
864 id="text4152"
865 sodipodi:linespacing="110%"><tspan
866 sodipodi:role="line"
867 x="558.37482"
868 y="232.2924"
869 id="tspan4154">bzr uncommit</tspan></text>
870 <text
871 xml:space="preserve"
872 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
873 x="552.78986"
874 y="221.47408"
875 id="text4156"
876 sodipodi:linespacing="100%"><tspan
877 sodipodi:role="line"
878 id="tspan4158"
879 x="552.78986"
880 y="221.47408">Undo last commit</tspan></text>
881 </g>
882 <g
883 transform="translate(1e-4,-1.6451646)"
884 id="g3275">
885 <text
886 xml:space="preserve"
887 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
888 x="558.37488"
889 y="263.73889"
890 id="text4162"
891 sodipodi:linespacing="110%"><tspan
892 sodipodi:role="line"
893 x="558.37488"
894 y="263.73889"
895 id="tspan4164">bzr revert</tspan></text>
896 <text
897 xml:space="preserve"
898 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
899 x="552.78992"
900 y="250.50064"
901 id="text4166"
902 sodipodi:linespacing="100%"><tspan
903 sodipodi:role="line"
904 id="tspan4168"
905 x="552.78992"
906 y="250.50064">Revert changes</tspan></text>
907 </g>
908 </g>
909 <g
910 id="g3844">
911 <g
912 transform="translate(0,26)"
913 id="g10882">
914 <rect
915 style="fill:none;fill-opacity:0;fill-rule:nonzero;stroke:#cecece;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
916 id="rect4232"
917 width="228.60797"
918 height="216.41451"
919 x="770.89197"
920 y="118.31993"
921 ry="8.1168776" />
922 <path
923 style="fill:url(#linearGradient8641);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient8649);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
924 d="M 779.29669,104.59448 C 774.6448,104.59448 770.89199,108.22213 770.89199,112.71887 L 770.89199,141.4355 C 770.89199,136.93875 774.6448,133.3111 779.29669,133.3111 L 991.12758,133.3111 C 995.77949,133.3111 999.5,136.93875 999.5,141.4355 L 999.5,112.71887 C 999.5,108.22213 995.77949,104.59448 991.12758,104.59448 L 779.29669,104.59448 z "
925 id="path4234" />
926 <text
927 xml:space="preserve"
928 style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
929 x="847.87567"
930 y="124.97269"
931 id="text4236"
932 sodipodi:linespacing="100%"><tspan
933 sodipodi:role="line"
934 id="tspan4238"
935 x="847.87567"
936 y="124.97269">Merging</tspan></text>
937 </g>
938 <g
939 transform="translate(1e-4,-1.0888417)"
940 id="g3392">
941 <text
942 xml:space="preserve"
943 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
944 x="783.75751"
945 y="191.95291"
946 id="text4242"
947 sodipodi:linespacing="110%"><tspan
948 sodipodi:role="line"
949 x="783.75751"
950 y="191.95291"
951 id="tspan4244">cd myproject</tspan><tspan
952 sodipodi:role="line"
953 x="783.75751"
954 y="203.02624"
955 id="tspan4296">bzr merge ../myproject-foo</tspan><tspan
956 sodipodi:role="line"
957 x="783.75751"
958 y="214.09958"
959 id="tspan4298">bzr commit</tspan></text>
960 <text
961 xml:space="preserve"
962 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
963 x="778.17255"
964 y="178.71466"
965 id="text4246"
966 sodipodi:linespacing="100%"><tspan
967 sodipodi:role="line"
968 id="tspan4248"
969 x="778.17255"
970 y="178.71466">Merge two branches</tspan></text>
971 </g>
972 <g
973 transform="translate(1e-4,0.1095133)"
974 id="g3384">
975 <text
976 xml:space="preserve"
977 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
978 x="784.44696"
979 y="245.39931"
980 id="text4252"
981 sodipodi:linespacing="110%"><tspan
982 sodipodi:role="line"
983 id="tspan4254"
984 x="784.44696"
985 y="245.39931">cd myproject-foo</tspan><tspan
986 sodipodi:role="line"
987 x="784.44696"
988 y="256.47264"
989 id="tspan4258">bzr pull ../myproject</tspan><tspan
990 sodipodi:role="line"
991 x="784.44696"
992 y="267.54597"
993 id="tspan4260" /></text>
994 <text
995 xml:space="preserve"
996 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
997 x="778.17255"
998 y="232.16106"
999 id="text4262"
1000 sodipodi:linespacing="100%"><tspan
1001 sodipodi:role="line"
1002 id="tspan4264"
1003 x="778.17255"
1004 y="232.16106">Pull changes from myproject</tspan></text>
1005 </g>
1006 <g
1007 transform="translate(1e-4,1.2474884)"
1008 id="g3378">
1009 <text
1010 xml:space="preserve"
1011 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
1012 x="784.4118"
1013 y="289.69043"
1014 id="text4268"
1015 sodipodi:linespacing="110%"><tspan
1016 sodipodi:role="line"
1017 id="tspan4270"
1018 x="784.4118"
1019 y="289.69043">bzr update</tspan></text>
1020 <text
1021 xml:space="preserve"
1022 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1023 x="778.17255"
1024 y="276.5459"
1025 id="text4272"
1026 sodipodi:linespacing="100%"><tspan
1027 sodipodi:role="line"
1028 id="tspan4274"
1029 x="778.17255"
1030 y="276.5459">Update a checkout</tspan></text>
1031 </g>
1032 <g
1033 transform="translate(1e-4,2.3122978)"
1034 id="g3372">
1035 <text
1036 xml:space="preserve"
1037 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
1038 x="785.45477"
1039 y="320.70923"
1040 id="text4278"
1041 sodipodi:linespacing="110%"><tspan
1042 sodipodi:role="line"
1043 id="tspan4280"
1044 x="785.45477"
1045 y="320.70923">bzr resolve</tspan></text>
1046 <text
1047 xml:space="preserve"
1048 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1049 x="779.21552"
1050 y="309.83685"
1051 id="text4282"
1052 sodipodi:linespacing="100%"><tspan
1053 sodipodi:role="line"
1054 id="tspan4284"
1055 x="779.21552"
1056 y="309.83685">Auto-detect resolved conflicts</tspan></text>
1057 </g>
1058 <g
1059 transform="translate(1e-4,3.3643062)"
1060 id="g3366">
1061 <text
1062 xml:space="preserve"
1063 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
1064 x="784.65204"
1065 y="352.20935"
1066 id="text4288"
1067 sodipodi:linespacing="110%"><tspan
1068 id="tspan4290"
1069 sodipodi:role="line"
1070 x="784.65204"
1071 y="352.20935">bzr resolve foo.py</tspan></text>
1072 <text
1073 xml:space="preserve"
1074 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1075 x="778.41278"
1076 y="338.91705"
1077 id="text4292"
1078 sodipodi:linespacing="100%"><tspan
1079 id="tspan4294"
1080 sodipodi:role="line"
1081 x="778.41278"
1082 y="338.91705">Specify resolved conflict</tspan></text>
1083 </g>
1084 </g>
1085 <g
1086 id="g3488">
1087 <g
1088 transform="translate(0,16.01004)"
1089 id="g10924">
1090 <rect
1091 style="fill:none;fill-opacity:0;fill-rule:nonzero;stroke:#cecece;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1092 id="rect4531"
1093 width="229.94412"
1094 height="319.25848"
1095 x="771.12964"
1096 y="378.41696"
1097 ry="9.9539938" />
1098 <path
1099 style="fill:url(#linearGradient8704);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient8696);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1100 d="M 779.48025,364.58444 C 774.79663,364.58444 771.01822,368.21211 771.01822,372.70888 L 771.01822,401.42568 C 771.01822,396.9289 774.79663,393.30123 779.48025,393.30123 L 992.75574,393.30123 C 997.43938,393.30123 1001.1852,396.9289 1001.1852,401.42568 L 1001.1852,372.70888 C 1001.1852,368.21211 997.43938,364.58444 992.75574,364.58444 L 779.48025,364.58444 z "
1101 id="path4533" />
1102 <text
1103 xml:space="preserve"
1104 style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1105 x="838.59387"
1106 y="384.95981"
1107 id="text4535"
1108 sodipodi:linespacing="100%"><tspan
1109 sodipodi:role="line"
1110 id="tspan4537"
1111 x="838.59387"
1112 y="384.95981">Publishing</tspan></text>
1113 </g>
1114 <g
1115 transform="translate(1e-4,-1.7634544)"
1116 id="g3354">
1117 <text
1118 xml:space="preserve"
1119 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
1120 x="781.75745"
1121 y="475.58072"
1122 id="text4616"
1123 sodipodi:linespacing="110%"><tspan
1124 sodipodi:role="line"
1125 x="781.75745"
1126 y="475.58072"
1127 id="tspan4618">bzr push sftp://host/myproject-fo1</tspan></text>
1128 <text
1129 xml:space="preserve"
1130 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1131 x="776.17249"
1132 y="462.34244"
1133 id="text4620"
1134 sodipodi:linespacing="100%"><tspan
1135 sodipodi:role="line"
1136 id="tspan4622"
1137 x="776.17249"
1138 y="462.34244">Push revisions remotely</tspan></text>
1139 </g>
1140 <g
1141 transform="translate(1e-4,-1.1779953)"
1142 id="g3360">
1143 <text
1144 xml:space="preserve"
1145 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
1146 x="782.38519"
1147 y="440.54575"
1148 id="text4457"
1149 sodipodi:linespacing="110%"><tspan
1150 sodipodi:role="line"
1151 x="782.38519"
1152 y="440.54575"
1153 id="tspan4459">bzr push ../myproject-fo1</tspan></text>
1154 <text
1155 xml:space="preserve"
1156 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1157 x="776.80023"
1158 y="429.72739"
1159 id="text4461"
1160 sodipodi:linespacing="100%"><tspan
1161 sodipodi:role="line"
1162 id="tspan4463"
1163 x="776.80023"
1164 y="429.72739">Push revisions</tspan></text>
1165 </g>
1166 <g
1167 transform="translate(1e-4,0.3362061)"
1168 id="g3346">
1169 <text
1170 xml:space="preserve"
1171 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
1172 x="782.40674"
1173 y="505.56467"
1174 id="text4467"
1175 sodipodi:linespacing="110%"><tspan
1176 id="tspan8805"
1177 sodipodi:role="line"
1178 x="782.40674"
1179 y="505.56467">bzr send</tspan><tspan
1180 sodipodi:role="line"
1181 x="782.40674"
1182 y="516.638"
1183 id="tspan4473" /></text>
1184 <text
1185 xml:space="preserve"
1186 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1187 x="776.13232"
1188 y="494.69229"
1189 id="text4475"
1190 sodipodi:linespacing="100%"><tspan
1191 id="tspan4608"
1192 sodipodi:role="line"
1193 x="776.13232"
1194 y="494.69229">Email a merge directive</tspan></text>
1195 </g>
1196 <g
1197 transform="translate(1e-4,31.004958)"
1198 id="g3339">
1199 <text
1200 xml:space="preserve"
1201 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
1202 x="783.03955"
1203 y="562.4187"
1204 id="text4481"
1205 sodipodi:linespacing="110%"><tspan
1206 sodipodi:role="line"
1207 id="tspan4483"
1208 x="783.03955"
1209 y="562.4187">bzr export ../myproject-dist/</tspan></text>
1210 <text
1211 xml:space="preserve"
1212 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1213 x="776.80029"
1214 y="537.18048"
1215 id="text4485"
1216 sodipodi:linespacing="100%"><tspan
1217 sodipodi:role="line"
1218 id="tspan4487"
1219 x="776.80029"
1220 y="537.18048">Export current revision as a </tspan><tspan
1221 id="tspan4610"
1222 sodipodi:role="line"
1223 x="776.80029"
1224 y="549.18048">directory</tspan></text>
1225 </g>
1226 <g
1227 transform="translate(1e-4,33.600285)"
1228 id="g3332">
1229 <text
1230 xml:space="preserve"
1231 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
1232 x="782.565"
1233 y="605.85291"
1234 id="text4521"
1235 sodipodi:linespacing="110%"><tspan
1236 sodipodi:role="line"
1237 id="tspan4523"
1238 x="782.565"
1239 y="605.85291">bzr export ../myproject-dist.zip</tspan></text>
1240 <text
1241 xml:space="preserve"
1242 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1243 x="776.32574"
1244 y="583.03461"
1245 id="text4525"
1246 sodipodi:linespacing="100%"><tspan
1247 sodipodi:role="line"
1248 id="tspan4527"
1249 x="776.32574"
1250 y="583.03461">Export current revision as an</tspan><tspan
1251 id="tspan4612"
1252 sodipodi:role="line"
1253 x="776.32574"
1254 y="595.03461">archive</tspan></text>
1255 </g>
1256 <g
1257 transform="translate(-1.4135726,38.47762)"
1258 id="g2446">
1259 <text
1260 xml:space="preserve"
1261 style="font-size:10.0666666px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
1262 x="782.40674"
1263 y="505.56467"
1264 id="text2448"
1265 sodipodi:linespacing="110%"><tspan
1266 id="tspan2450"
1267 sodipodi:role="line"
1268 x="782.40674"
1269 y="505.56467">bzr send -o ../base.patch</tspan><tspan
1270 sodipodi:role="line"
1271 x="782.40674"
1272 y="516.638"
1273 id="tspan2452" /></text>
1274 <text
1275 xml:space="preserve"
1276 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1277 x="776.13232"
1278 y="494.69229"
1279 id="text2454"
1280 sodipodi:linespacing="100%"><tspan
1281 id="tspan2456"
1282 sodipodi:role="line"
1283 x="776.13232"
1284 y="494.69229">Create a merge directive</tspan></text>
1285 </g>
1286 </g>
1287 <text
1288 xml:space="preserve"
1289 style="font-size:40px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1290 x="144.32812"
1291 y="64.254639"
1292 id="text2774"
1293 sodipodi:linespacing="100%"><tspan
1294 sodipodi:role="line"
1295 id="tspan2776"
1296 x="144.32812"
1297 y="64.254639">Bazaar </tspan></text>
1298 <g
1299 style="display:inline"
1300 id="g3653"
1301 transform="matrix(0.6461515,0,0,0.6526216,160.93614,144.01237)"
1302 inkscape:export-filename="/home/matt/Projects/Ubuntu/Bazaar Website/bzr icon 64.png"
1303 inkscape:export-xdpi="45.012665"
1304 inkscape:export-ydpi="45.012665">
1305 <path
1306 id="path2749"
1307 d="M -143.51431,-75.4275 C -158.48768,-90.57687 -171.17625,-103.66019 -171.7111,-104.50153 C -174.63909,-109.10738 -172.34363,-112.16647 -143.7155,-141.81059 C -119.96256,-166.4065 -114.08422,-171.84722 -111.26302,-171.84722 C -108.45655,-171.84722 -102.57922,-166.49332 -79.566158,-142.97326 C -59.704508,-122.67403 -51.314608,-113.24681 -51.314608,-111.22876 C -51.314608,-107.03298 -109.21126,-47.88319 -113.31814,-47.88319 C -115.49463,-47.88319 -123.57621,-55.25503 -143.51431,-75.4275 z "
1308 style="opacity:1;fill:#fce94f;fill-opacity:1;stroke:#fce94f;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
1309 <path
1310 id="path2721"
1311 d="M -118.75152,-74.850683 C -119.22012,-75.319283 -119.60352,-85.958443 -119.60352,-98.493313 L -119.60352,-121.28395 L -124.85215,-121.28395 C -131.2088,-121.28395 -131.22918,-121.19503 -121.27316,-136.90004 C -116.77235,-143.99978 -113.38241,-148.09169 -112.19584,-147.85705 C -110.34853,-147.49175 -95.321883,-124.90849 -95.321883,-122.4975 C -95.321883,-121.83004 -97.640303,-121.28395 -100.47393,-121.28395 C -103.84689,-121.28395 -105.87693,-120.6299 -106.35276,-119.38989 C -107.55959,-116.24495 -103.45251,-106.32746 -97.296233,-97.520823 C -90.988133,-88.497013 -90.461803,-86.665103 -93.461883,-84.175253 C -95.128693,-82.791933 -96.185063,-83.268713 -100.25177,-87.239733 C -102.90055,-89.826193 -105.46285,-91.547323 -105.94572,-91.064423 C -106.42862,-90.581523 -106.8237,-86.544203 -106.8237,-82.092573 L -106.8237,-73.998703 L -112.36162,-73.998703 C -115.40746,-73.998703 -118.28294,-74.382103 -118.75152,-74.850683 z "
1312 style="opacity:1;fill:#c4a000;fill-opacity:1;stroke:#c4a000;display:inline" />
1313 <path
1314 id="path2727"
1315 d="M -120.75152,-76.85072 C -121.22012,-77.31932 -121.60352,-87.95848 -121.60352,-100.49335 L -121.60352,-123.28399 L -126.85215,-123.28399 C -133.2088,-123.28399 -133.22918,-123.19507 -123.27316,-138.90007 C -118.77235,-145.99981 -115.38241,-150.09172 -114.19584,-149.85708 C -112.34853,-149.49178 -97.321888,-126.90852 -97.321888,-124.49754 C -97.321888,-123.83008 -99.640308,-123.28399 -102.47393,-123.28399 C -105.84689,-123.28399 -107.87693,-122.62994 -108.35276,-121.38993 C -109.55959,-118.24499 -105.45251,-108.3275 -99.296238,-99.52086 C -92.988138,-90.49705 -92.461808,-88.66514 -95.461888,-86.17529 C -97.128698,-84.79197 -98.185068,-85.26875 -102.25177,-89.23977 C -104.90055,-91.82623 -107.46285,-93.54736 -107.94572,-93.06446 C -108.42862,-92.58156 -108.8237,-88.54424 -108.8237,-84.09261 L -108.8237,-75.99874 L -114.36162,-75.99874 C -117.40746,-75.99874 -120.28294,-76.38214 -120.75152,-76.85072 z "
1316 style="opacity:1;fill:#555753;fill-opacity:1;stroke:#2e3436;stroke-opacity:1;display:inline" />
1317 <path
1318 d="M -143.51431,-75.4275 C -158.48768,-90.57687 -171.17625,-103.66019 -171.7111,-104.50153 C -174.63909,-109.10738 -172.34363,-112.16647 -143.7155,-141.81059 C -119.96256,-166.4065 -114.08422,-171.84722 -111.26302,-171.84722 C -108.45655,-171.84722 -102.57922,-166.49332 -79.566162,-142.97326 C -59.704512,-122.67403 -51.314612,-113.24681 -51.314612,-111.22876 C -51.314612,-107.03298 -109.21126,-47.88319 -113.31814,-47.88319 C -115.49463,-47.88319 -123.57621,-55.25503 -143.51431,-75.4275 z M -82.734602,-78.80831 C -63.284082,-98.78654 -53.870592,-109.3496 -53.870592,-111.19708 C -53.870592,-114.35673 -108.28764,-170.68595 -111.26979,-170.61328 C -113.31427,-170.56346 -167.39892,-115.6112 -169.81635,-111.12752 C -171.82156,-107.40842 -170.53236,-105.76188 -145.24612,-79.74648 C -117.66227,-51.36719 -115.36413,-49.16116 -113.38369,-49.16116 C -112.40192,-49.16116 -98.609822,-62.50237 -82.734602,-78.80831 z "
1319 style="opacity:1;fill:#555753;fill-opacity:1;stroke:#2e3436;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
1320 id="path2736" />
1321 </g>
1322 <text
1323 xml:space="preserve"
1324 style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1325 x="146.57143"
1326 y="97.808769"
1327 id="text3409"
1328 sodipodi:linespacing="100%"><tspan
1329 sodipodi:role="line"
1330 id="tspan3411"
1331 x="146.57143"
1332 y="97.808769">Quick Reference Card</tspan></text>
1333 <g
1334 id="g12314"
1335 transform="translate(17.946423,1.7472534)"
1336 style="fill:#333333;fill-opacity:1">
1337 <text
1338 sodipodi:linespacing="100%"
1339 id="text8833"
1340 y="527.43823"
1341 x="297.99408"
1342 style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1343 xml:space="preserve"><tspan
1344 style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;font-family:Bitstream Vera Sans"
1345 y="527.43823"
1346 x="297.99408"
1347 id="tspan8835"
1348 sodipodi:role="line">Supported URL Prefixes</tspan></text>
1349 <g
1350 id="g12288"
1351 style="fill:#333333;fill-opacity:1">
1352 <text
1353 xml:space="preserve"
1354 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:150%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1355 x="299.33002"
1356 y="547.94214"
1357 id="text8837"
1358 sodipodi:linespacing="150%"><tspan
1359 sodipodi:role="line"
1360 id="tspan8841"
1361 x="299.33002"
1362 y="547.94214">aftp://</tspan><tspan
1363 sodipodi:role="line"
1364 id="tspan8843"
1365 x="299.33002"
1366 y="565.94214">bzr://</tspan><tspan
1367 sodipodi:role="line"
1368 x="299.33002"
1369 y="583.94214"
1370 id="tspan10799">bzr+ssh://</tspan><tspan
1371 sodipodi:role="line"
1372 id="tspan8847"
1373 x="299.33002"
1374 y="601.94214">file:// </tspan><tspan
1375 sodipodi:role="line"
1376 id="tspan8849"
1377 x="299.33002"
1378 y="619.94214">ftp:// </tspan><tspan
1379 sodipodi:role="line"
1380 id="tspan8851"
1381 x="299.33002"
1382 y="637.94214">http://</tspan><tspan
1383 sodipodi:role="line"
1384 id="tspan8853"
1385 x="299.33002"
1386 y="655.94214">https://</tspan><tspan
1387 sodipodi:role="line"
1388 x="299.33002"
1389 y="673.94214"
1390 id="tspan10797" /><tspan
1391 sodipodi:role="line"
1392 id="tspan8855"
1393 x="299.33002"
1394 y="691.94214">sftp://</tspan><tspan
1395 sodipodi:role="line"
1396 id="tspan8857"
1397 x="299.33002"
1398 y="709.94214" /></text>
1399 <text
1400 xml:space="preserve"
1401 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:150%;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1402 x="379.22845"
1403 y="547.94214"
1404 id="text12260"
1405 sodipodi:linespacing="150%"><tspan
1406 sodipodi:role="line"
1407 id="tspan12262"
1408 x="379.22845"
1409 y="547.94214">Access using active FTP.</tspan><tspan
1410 sodipodi:role="line"
1411 x="379.22845"
1412 y="565.94214"
1413 id="tspan12264">Fast access using the Bazaar smart server.</tspan><tspan
1414 sodipodi:role="line"
1415 x="379.22845"
1416 y="583.94214"
1417 id="tspan12270">Fast access using the Bazaar smart server over SSH.</tspan><tspan
1418 sodipodi:role="line"
1419 x="379.22845"
1420 y="601.94214"
1421 id="tspan12286">Access using the standard filesystem (default)</tspan><tspan
1422 sodipodi:role="line"
1423 x="379.22845"
1424 y="619.94214"
1425 id="tspan12272">Access using passive FTP.</tspan><tspan
1426 sodipodi:role="line"
1427 x="379.22845"
1428 y="637.94214"
1429 id="tspan12274">Read-only access of branches exported on the web.</tspan><tspan
1430 sodipodi:role="line"
1431 x="379.22845"
1432 y="655.94214"
1433 id="tspan12276">Read-only access of branches exported on the web </tspan><tspan
1434 sodipodi:role="line"
1435 x="379.22845"
1436 y="673.94214"
1437 id="tspan12278">using SSL.</tspan><tspan
1438 sodipodi:role="line"
1439 x="379.22845"
1440 y="691.94214"
1441 id="tspan12280">Access using SFTP (most SSH servers provide SFTP).</tspan><tspan
1442 sodipodi:role="line"
1443 x="379.22845"
1444 y="709.94214"
1445 id="tspan12282" /></text>
1446 </g>
1447 </g>
1448 <g
1449 id="g13619"
1450 style="fill:#333333;fill-opacity:1">
1451 <text
1452 sodipodi:linespacing="100%"
1453 id="text4624"
1454 y="320.09448"
1455 x="316.78033"
1456 style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1457 xml:space="preserve"><tspan
1458 style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;font-family:Bitstream Vera Sans"
1459 y="320.09448"
1460 x="316.78033"
1461 id="tspan4626"
1462 sodipodi:role="line">Concepts</tspan></text>
1463 <text
1464 sodipodi:linespacing="150%"
1465 id="text12146"
1466 y="341.21167"
1467 x="447.92319"
1468 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:150%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1469 xml:space="preserve"><tspan
1470 y="341.21167"
1471 x="447.92319"
1472 id="tspan12148"
1473 sodipodi:role="line">line of development for a project</tspan><tspan
1474 id="tspan12150"
1475 y="359.21167"
1476 x="447.92319"
1477 sodipodi:role="line">version controlled directory </tspan><tspan
1478 id="tspan12152"
1479 y="377.21167"
1480 x="447.92319"
1481 sodipodi:role="line">store for Bazaar revisions</tspan><tspan
1482 id="tspan12154"
1483 y="395.21167"
1484 x="447.92319"
1485 sodipodi:role="line">version of the source code committed to the </tspan><tspan
1486 id="tspan12156"
1487 y="413.21167"
1488 x="447.92319"
1489 sodipodi:role="line">repository</tspan><tspan
1490 id="tspan12158"
1491 y="431.21167"
1492 x="447.92319"
1493 sodipodi:role="line">named revision</tspan><tspan
1494 id="tspan12160"
1495 y="449.21167"
1496 x="447.92319"
1497 sodipodi:role="line">branches having a common ancestor</tspan><tspan
1498 id="tspan12164"
1499 y="467.21167"
1500 x="447.92319"
1501 sodipodi:role="line">the operation of applying to a branch all the </tspan><tspan
1502 y="485.21167"
1503 x="447.92319"
1504 sodipodi:role="line"
1505 id="tspan3886">changes introduced by another one</tspan></text>
1506 <text
1507 sodipodi:linespacing="150%"
1508 id="text12400"
1509 y="341.21167"
1510 x="317.27643"
1511 style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:150%;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1512 xml:space="preserve"><tspan
1513 y="341.21167"
1514 x="317.27643"
1515 id="tspan12402"
1516 sodipodi:role="line">Branch:</tspan><tspan
1517 id="tspan12404"
1518 y="359.21167"
1519 x="317.27643"
1520 sodipodi:role="line">Working tree:</tspan><tspan
1521 id="tspan12406"
1522 y="377.21167"
1523 x="317.27643"
1524 sodipodi:role="line">Repository:</tspan><tspan
1525 id="tspan12408"
1526 y="395.21167"
1527 x="317.27643"
1528 sodipodi:role="line">Revision:</tspan><tspan
1529 id="tspan12410"
1530 y="413.21167"
1531 x="317.27643"
1532 sodipodi:role="line" /><tspan
1533 id="tspan12412"
1534 y="431.21167"
1535 x="317.27643"
1536 sodipodi:role="line">Tag:</tspan><tspan
1537 id="tspan12414"
1538 y="449.21167"
1539 x="317.27643"
1540 sodipodi:role="line">Related branches:</tspan><tspan
1541 id="tspan12416"
1542 y="467.21167"
1543 x="317.27643"
1544 sodipodi:role="line">Merge:</tspan><tspan
1545 id="tspan12418"
1546 y="485.21167"
1547 x="317.27643"
1548 sodipodi:role="line"> </tspan></text>
1549 </g>
1550 <g
1551 id="g6327"
1552 transform="translate(6.5601196,0)"
1553 style="fill:#333333;fill-opacity:1">
1554 <text
1555 sodipodi:linespacing="100%"
1556 id="text6294"
1557 y="50.289795"
1558 x="775.77582"
1559 style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1560 xml:space="preserve"><tspan
1561 y="50.289795"
1562 x="775.77582"
1563 id="tspan6296"
1564 sodipodi:role="line">More Information</tspan></text>
1565 <g
1566 id="g6320"
1567 style="fill:#333333;fill-opacity:1">
1568 <text
1569 xml:space="preserve"
1570 style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans Mono"
1571 x="787.72699"
1572 y="76.095581"
1573 id="text6298"
1574 sodipodi:linespacing="100%"><tspan
1575 sodipodi:role="line"
1576 id="tspan6300"
1577 x="787.72699"
1578 y="76.095581">bzr help</tspan></text>
1579 <a
1580 id="a6316"
1581 style="fill:#333333;fill-opacity:1"
1582 xlink:href="http://bazaar.canonical.com">
1583 <text
1584 sodipodi:linespacing="100%"
1585 id="text6302"
1586 y="97.901367"
1587 x="787.79535"
1588 style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans"
1589 xml:space="preserve"><tspan
1590 y="97.901367"
1591 x="787.79535"
1592 id="tspan6304"
1593 sodipodi:role="line">http://bazaar.canonical.com</tspan></text>
1594 </a>
1595 </g>
1596 </g>
1597 </g>
1598</svg>
01599
=== added directory 'doc/ch/_templates'
=== added file 'doc/ch/_templates/index.html'
--- doc/ch/_templates/index.html 1970-01-01 00:00:00 +0000
+++ doc/ch/_templates/index.html 2012-11-23 02:18:19 +0000
@@ -0,0 +1,84 @@
1{% extends "layout.html" %}
2
3{% set title = 'Table of Contents' %}
4{% block body %}
5
6 <h2>核心文档</h2>
7
8 <table class="contentstable" align="center" style="margin-left: 30px"><tr>
9 <td width="50%">
10<!-- <p class="biglink"><a class="biglink" href="{{ pathto("whats-new/whats-new-in-2.6") }}">What's New in Bazaar 2.6?</a><br/>
11 <span class="linkdescr">what's new in this release</span>
12 </p> -->
13 <p class="biglink"><a class="biglink" href="{{ pathto("user-guide/index") }}">用户手册</a><br/>
14 <span class="linkdescr">如何使用命令行客户端</span>
15 </p>
16 <p class="biglink"><a class="biglink" href="{{ pathto("tutorials/using_bazaar_with_launchpad") }}">Bazaar和Launchpad结合使用</a><br/>
17 <span class="linkdescr">如何结合使用Bazaar和Launchpad</span>
18 </p>
19 <p class="biglink"><a class="biglink" href="{{ pathto("mini-tutorial/index") }}">五分钟快速学习Bazaar</a><br/>
20 <span class="linkdescr">快速学习Bazaar的基本操作和使用</span>
21 </p>
22 <p class="biglink"><a class="biglink" href="{{ pathto("admin-guide/index") }}">系统管理员手册</a><br/>
23 <span class="linkdescr">安全,备份等等。</span>
24 </p>
25<!-- <p class="biglink"><a class="biglink" href="{{ pathto("quick-reference/index") }}">Quick Reference</a><br/>
26 <span class="linkdescr">for your wall</span>
27 </p> -->
28 </td>
29<!-- <td width="50%">
30 <p class="biglink"><a class="biglink" href="{{ pathto("release-notes/index") }}">Release Notes</a><br/>
31 <span class="linkdescr">a detailed log of changes</span>
32 </p>
33 <p class="biglink"><a class="biglink" href="{{ pathto("upgrade-guide/index") }}">Upgrade Guide</a><br/>
34 <span class="linkdescr">moving to Bazaar 2.x</span>
35 </p>
36 <p class="biglink"><a class="biglink" href="{{ pathto("user-reference/index") }}">User Reference</a><br/>
37 <span class="linkdescr">all the gory details</span>
38 </p>
39 <p class="biglink"><a class="biglink" href="{{ pathto("admin-guide/index") }}">System Admin Guide</a><br/>
40 <span class="linkdescr">security, backups, etc.</span>
41 </p>
42 </td> -->
43 </tr>
44 </table>
45
46<!-- <h2>Related links</h2>
47
48 <table class="contentstable" align="center" style="margin-left: 30px"><tr>
49 <td width="50%">
50 <p class="biglink"><a class="biglink" href="http://doc.bazaar.canonical.com/explorer/en/guide/">Desktop Guide</a><br/>
51 <span class="linkdescr">how to use our GUI applications</span>
52 </p>
53 <p class="biglink"><a class="biglink" href="https://answers.launchpad.net/bzr/+faqs">FAQ</a><br/>
54 <span class="linkdescr">frequently asked questions</span>
55 </p>
56 <p class="biglink"><a class="biglink" href="http://wiki.bazaar.canonical.com/BzrGlossary/">Glossary</a><br/>
57 <span class="linkdescr">help with terminology</span>
58 </p>
59 </td>
60 <td width="50%">
61 <p class="biglink"><a class="biglink" href="../developers/">Developer Docs</a><br/>
62 <span class="linkdescr">improving and extending bzr</span>
63 </p>
64 <p class="biglink"><a class="biglink" href="http://doc.bazaar.canonical.com/migration/en/">Migration Docs</a><br/>
65 <span class="linkdescr">for refugees of other tools</span>
66 </p>
67 <p class="biglink"><a class="biglink" href="http://doc.bazaar.canonical.com/plugins/en/">Plugins Guide</a><br/>
68 <span class="linkdescr">help on popular plugins</span>
69 </p>
70 </td></tr>
71
72 <tr><td colspan="2">
73 These documents are also available in <a href="../es/index.html">Spanish</a>,
74 <a href="../ja/index.html">Japanese</a>,
75 and <a href="../ru/index.html">Russian</a>.
76 </td></tr>
77 </table> -->
78
79
80 <h2>团队说明</h2>
81
82 <p>欢迎加入bazaar文档中文简体翻译团队<a class="reference external" href="https://launchpad.net/~bzr-doc-chinese-contributors">bzr-doc-chinese-contributors</a>和<a class="reference external" href="https://code.launchpad.net/~bzr-doc-chinese-contributors/bzr/bzr-ch">bzr-ch项目</a>,我们致力于翻译Bazaar的所有文档,为中文用户提供快速入门和深入掌握Bazaar的平台。我们目前已完成了4个主要文档的翻译。另外,因为翻译人员翻译时理解不同及水平所限,文档中可能存在一些失误或争议。如有任何问题,请及时联系我们:pishuilu1128@126.com。
83主要贡献者:abel, Huan Peng, Jack Yu, jiaowen520li, shijing, testpi, wangyan.</p>
84{% endblock %}
085
=== added file 'doc/ch/_templates/layout.html'
--- doc/ch/_templates/layout.html 1970-01-01 00:00:00 +0000
+++ doc/ch/_templates/layout.html 2012-11-23 02:18:19 +0000
@@ -0,0 +1,8 @@
1{% extends "!layout.html" %}
2
3{% block rootrellink %}
4<li><a href="http://bazaar.canonical.com/">
5 <img src="{{ pathto("_static/bzr icon 16.png", 1) }}" /> Home</a>&nbsp;|&nbsp;</li>
6<a href="http://doc.bazaar.canonical.com/en/">Documentation</a>&nbsp;|&nbsp;</li>
7{{ super() }}
8{% endblock %}
09
=== added directory 'doc/ch/admin-guide'
=== added file 'doc/ch/admin-guide/advanced.txt'
--- doc/ch/admin-guide/advanced.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/admin-guide/advanced.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,107 @@
1前沿话题
2========
3
4系统监测
5--------
6
7容量规划技巧
8------------
9
10集群
11-----
12
13多站点设置
14----------
15
16分布式控制系统的“分配”应该表明Bazaar很适合多站点开发环境。这个优势来源于清晰简单的利用不同的历史来合并分支。需要注意的是,有很多不同的方式使用Bazaar 和它的分支和合并的性能来管理广泛的开发方案。这些可以作为政策在生效前被发现被检验。我们会在那里建立一个可行的方案。
17
18公司总部在美国德克萨斯州的奥斯汀市,考虑到公司的扩张,ProjectX在澳大利亚达尔文市拓展了一个新的分支办公室。覆盖面较大的多站点开发环境比如连接澳大利亚到德克萨斯州的网络既慢又不可靠。所以每个子办公室会像主分支一样把他们本地化。(在网络条件良好的状况下,只要支持多站点开发那么一个本地的分支会反过来远程操纵主分支。)
19
20当然,在两个主分支下,总会发生哪个更有权威性的争论。在管理多分支上Bazaar很流畅,我们不把Texas 或Australia私有化而是把他们放在两个主分支中统一管理。明显的我们会在德克萨斯的站点把主分支本地化。所以,我们会有三个分支分别存储在两个服务器上:主干和德克萨斯的整体在德克萨斯州站点,澳大利亚的整体在达尔文的站点上。这些分支因开发地点而得名,但是在很多案例中关于命名问题团队的名字要比地理因素被考虑的更多。由于我们尝试阐明多站点开发问题,所以我们坚持这种命名原则。
21
22
23配置
24~~~~~
25
26 使用我们在德克萨斯州预先的配置,我们会简单的对老的主干重命名然后作为新的主干然后分支一个复制作为德州的整体。
27
28::
29
30 $ cd /srv/bzr/projectx
31 $ mv trunk trunk # 可以很简单的在文件系统上重命名
32 $ bzr branch trunk texas-integration # 在一个共享库中非常快
33
34在澳大利亚,我们需要建立/srv/bzr/projectx目录然后对目前澳洲整体进行复制::
35
36 $ mkdir -p /srv/bzr
37 $ cd /srv/bzr
38 $ bzr init-repo --no-trees projectx
39 $ cd projectx
40 $ bzr branch bzr+ssh://server.example.com/srv/bzr/trunk
41 $ bzr branch trunk australia-integration
42
43融合到主分支
44~~~~~~~~~~~~
45
46每个办公工作在本地都会有主干的拷贝。整体速度的快慢来自于两个本地开发的速度,这两个本地的主干需要被合并。(实际上,自从多重合并没有障碍以后合并会快一点)在这个例子中,德州办公室的爱丽丝在他本地机器上对服务器上的分支进行合并::
47
48 # 在德克萨斯获取一份澳大利亚分支的拷贝。运行完分支的初始化命令之后,使用pull命令更新分支到最新状态。随着一个较慢网速,下面这个是唯一一个较慢的部分
49 $ bzr branch bzr+ssh://autralia.example.com/srv/bzr/projectx/australia-integration \
50 bzr+ssh://server.example.com/srv/bzr/projectx/australia-integration
51
52 # 从本地获取主分支来进行融合操作
53 $ cd ~/projectx
54 $ bzr checkout bzr+ssh://server.example.com/srv/bzr/projectx/trunk
55 $ cd trunk
56 $ bzr merge bzr+ssh://server.example.com/srv/bzr/projectx/texas-integration
57
58 # 运行测试套件并解决任何冲突
59 $ bzr commit -m "Merge Texas branch to master"
60
61 # 现在,融合澳大利亚和本地分支的备份
62 $ bzr merge bzr+ssh://server.example.com/srv/bzr/projectx/australia-integration
63
64 # 运行测试套件并解决他们之间的冲突
65 $ bzr commit -m "Merge Australia branch to master"
66
67注意:即使是很实用的合并Bazaar 也不会默认提交。这是因为尽管合并很清晰但是合并状态需要在提交前被检查(这是因为没有文件冲突并不意味着在合并之后一切都会正常工作)。一个替代的方案是,在可以pull的情况下通过 ``bzr merge --pull`` 来进行融合。
68
69合并回本地主干
70~~~~~~~~~~~~~~
71
72现在主分支是最新的版本而且所有的本地主干需要再融合并改变。如果没有德州整体新的提交,可以使用 ``bzr pull``::
73
74 $ cd ~/projectx
75 $ bzr checkout bzr+ssh://server.example.com/srv/bzr/projectx/texas-integration
76 $ cd texas-integration
77 $ bzr pull ../trunk # Use trunk from the local disk
78 # 不需要提交
79
80如果因为合并主干在德州整体发生了新的改变,会产生一个错误来使用融合::
81
82 $ bzr merge ../trunk
83 # Run test suite, resolve conflicts
84 $ bzr commit -m "Merging Australian changes"
85
86在澳大利亚,他们会更新本地复制::
87
88 $ cd /srv/bzr/projectx/trunk
89 $ bzr pull # 默认会使用本地的副本
90
91然后,他们需要从本地主干找出和合并改变。这件事应该由澳洲整体的开发者检查后来做,这样他们可以这样运行这些测试套件::
92
93 $ cd ~/projectx
94 $ bzr co bzr+ssh://australia.example.com/srv/bzr/projectx/australia-integration
95 $ cd australia-integration
96 $ bzr merge bzr+ssh://australia.example.com/srv/bzr/projectx/trunk
97 # 运行测试套件,整合德克萨斯州最近的变化
98 # 开发
99 $ bzr commit -m "Integrate work from Texas"
100
101其他的考虑
102~~~~~~~~~~
103
104多站点部署会很复杂,由于快速的发展所以会有许多可能的变化,分开劳动,网络链接,资源共享等等。之前的描述意味着有一种可能可以支持多站点开发(德州和澳洲都独享他们的结构)。在有一个主站点和其他小站点的情况,一个本地主分支可以被消除然后主干可以被用来发展主站点。
105
106本地的主干被频繁的整合到最高级主干。给整体一些特定的资源,一个开发者也许在两个团队中来回改变。这两个站点可以有一个良好的分工,当他们各个特性都被完成他们才会开始合并最高级主干。解决一个大合并中的冲突是很困难的但是在Bazaar里合并是很简单的,我们建议多多融合。
107
0108
=== added file 'doc/ch/admin-guide/backup.txt'
--- doc/ch/admin-guide/backup.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/admin-guide/backup.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,119 @@
1备份与还原
2==========
3
4备份bazaar分支可以以两种不同的方式实现。如果现存的文件系统备份模式已经存在,那它可以很容易的用于bazaar分支的备份。可选的是,bazaar自身可以将想要的分支镜像到另外的位置或者是从另外的地方来做镜像来达到备份的目的。
5
6文件系统备份
7------------
8
9从磁盘的形式来说,bazaar的事务是十分细微的以至于它在任何情况在都是十分活跃的。然而,备份是需要在有限的时间内完成的,在备份活动的分支或是库的时候,不同的磁盘磁盘结构可能会产生矛盾(bazaar自身通过一种定义良好的次序 *读取* 那些结构来管理现有的问题)。像LVM这样的工具,允许对磁盘上的内容进行瞬间的快照来备份bazaar分支和库上的文件系统。
10
11对于其他备份的方法,需要在备份时分支和库处于离线状态,以此保证不同的文件之间连续性而构成bazaar分支的历史记录。这样的要求可以通过将bazaar作为自己的备份客户端来缓和,因为这遵循一个读的顺序,这一顺序是为管理同时发生的接入事件而设计的(查看下一个章节了解更多)。依赖在分支上使用的不同的接入技术,存在很多使分支“离线”的方法。对于 ``bzr+ssh://`` 接入,暂时改变文件系统的接入许可来防止任何用户的写权限是有可能的。对于 ``http://`` 接入,改变接入许可,关闭HTTP服务器或者将服务器转向一个不允许接入的单独配置都是可行的使分支离线而备份的方法。最后,对于直接的文件系统接入,有必要使分支目录不可写入。
12
13由于这种停工期的操作是十分有破坏性的,我们强烈建议将bazaar作为自身的一个备份客户端,这样可以直接使用bazaar来对分支进行拷贝和更新。
14
15Bazaar的自身备份
16----------------
17
18使得bazaar成为一个优秀的分布式版本控制系统的那些特点也成为了备份自己的一个很好的选择。特别的,任何分支的完整的,一致性的副本可以由 ``branch`` 和
19``pull`` 两个命令轻易的获取。尤其是一个备份的过程可以通过简单的在副本的主分支上运行 ``bzr pull`` 来完全更新这个副本。如果这个过程周期性的运行,那这个备份就如同是最近一次运行 ``pull`` 那样的新(这更加证实了bazaar中修订版不可改变的事实,所以当修订版的id获知,那么一个分支的旧版的修订版是可以重新获取的)。
20
21举个例子,考虑到一个独立的备份服务器将备份储存在 ``/var/backup`` 目录下。在这个服务器上,最初我们可以运行
22
23::
24
25 $ cd /var/backup
26 $ bzr branch bzr+ssh://server.example.com/srv/bzr/trunk
27 $ bzr branch bzr+ssh://server.example.com/srv/bzr/feature-gui
28
29在备份服务器上创建分支。然后,我们可以经常的这样做(例子中来源于 ``cron`` )
30
31::
32
33 $ cd /var/backup/trunk
34 $ bzr pull # the location to pull from is remembered
35 $ cd ../var/backup/feature-gui
36 $ bzr pull # again, the parent location is remembered
37
38在某些目录中,父分支中拉取子分支是非常常见的,而且这可以由一个插件来完成。 `bzrtools`_ 插件包括 ``multi-pull`` 命令,可以在特定的目录下对所有的分支做 ``pull`` 操作。
39
40.. _bzrtools: http://launchpad.net/bzrtools
41
42在这一插件安装的前提下,以上经常性的命令操作可以是这样的
43
44::
45
46 $ cd /var/backup
47 $ bzr multi-pull
48
49要注意的是 ``multi-pull`` 是在特定的目录(默认是当前的目录)下对所有的分支进行pull操作,而且要注意这是我们想要的效果。一个简单的脚本也可以替代multi-pull命令,而且也提供了良好的灵活性。
50
51边界分支的备份
52~~~~~~~~~~~~~~
53
54当 ``bzr pull`` 经常性的运行来确保备份最新的时候,有可能原先分支的一些新的修订版没有被放到备份分支中来。为了解决这一问题,我们可以建立这样的分支,新的修订版总是 *pushed(被加入)* 备份而不是周期性的加入。一种方法是使用bazaar的边界分支,一个分支上的提交事件仅在这个分支中相同的提交成功时 `必然` 发生。像push-type技术一样,它设置在自身的服务器上而不是备份服务器上。对于每一个分支都要备份,你只需要使用 ``bind`` 命令为每个备份分支设置URL。在我们的例子中,首先我们需要在备份服务器上创建分支(我们使用 ``bzr push`` ,但是我们一样可以在备份服务器上轻易的使用 ``bzr branch`` )
55
56::
57
58 $ cd /srv/bzr/projectx/trunk
59 $ bzr push bzr+ssh://backup.example.com/var/backup/trunk
60 $ cd ../feature-gui
61 $ bzr push bzr+ssh://backup.example.com/var/backup/feature-gui
62
63然后我们需要将主分支与他们的备份分支捆绑
64
65::
66
67 $ cd ../trunk
68 $ bzr bind bzr+ssh://backup.example.com/var/backup/trunk
69 $ cd ../feature-gui
70 $ bzr bind bzr+ssh://backup.example.com/var/backup/feature-gui
71
72一个分支只能被捆绑到一个单一的位置,所以多个分支不能用这种方法创建.
73
74使用 `Hooks(钩子函数)和Plugins(插件) <hooks-plugins.html>`_ 章节中提到的 `automirror`_ 插件,它也可以制作一个push-type的备份系统来更加自然的处理多备份问题。为多个URLs设置 ``post_commit_mirror`` 选项,用逗号隔开。为了备份到备份服务器或是远程地址上,可以这样做
75
76::
77
78 $ cd /srv/bzr/trunk
79 $ echo "post_commit_mirror=bzr+ssh://backup.example.com/var/backup/trunk,\
80 bzr+ssh://offsite.example.org/projectx-corp/backup/trunk" >> .bzr/branch/branch.conf
81 $ cd ../feature-gui
82 $ echo "post_commit_mirror=bzr+ssh://backup.example.com/var/backup/feature-gui,\
83 bzr+ssh://offsite.example.org/projectx-corp/backup/feature-gui" >> .bzr/branch/branch.conf
84
85.. _automirror: http://launchpad.net/bzr-automirror
86
87对于任何push-type备份策略保持一致性这方面,这种方法的缺点是所有的备份都必须在初始的commit命令成功执行前先成功执行。如果有很多的镜像分支或是边界分支有一个很弱的网络连接,那延迟最初的commit操作将会是不可接受的时间长。既然如此,pull-type备份,或者他们的混合系统更为适合。
88
89从备份中恢复
90------------
91
92检查备份的一致性
93~~~~~~~~~~~~~~~
94
95很多的系统管理员都被备份过程所打败了,但是当要从备份中恢复数据的时候才发现很多的备份自身都是有缺陷的。因此,周期性的检查备份的质量是很重要的。在bazaar中有两种方法实现这种一致性的检查:使用 ``bzr check`` 和在备份中创建一个新的分支。 ``bzr check`` 命令检查一个分支中所有的修订版,通过bazaar内部的不变性来检查他们的有效性。由于它要检查每一个修订版,那对于庞大的分支来说可能十分的慢。另一个保证备份可用来恢复的方法是进行一次测试性的恢复。这意味这在一个临时的目录下进行测试恢复过程。在恢复过程之后, ``bzr check`` 将再次起检查恢复分支有效性的作用。下面的两章节将展示两种恢复的方法。
96
97恢复文件系统备份
98~~~~~~~~~~~~~~~
99
100有很多的不同的备份工具有访问备份数据的方法,所以在这里我们不再赘述。我们要说的是恢复 ``/srv/bzr`` 目录下的内容将完全恢复该目录下的分支到他们备份时的状态(查看 `文件系统备份`_ 了解关于活动分支的备份)。例如,如果备份挂载在 ``/mnt/backup/bzr`` 目录下,那我们可以这样简单的恢复::
101
102 $ cd /srv
103 $ mv bzr bzr.old
104 $ cp -r /mnt/backup/bzr bzr
105
106当然,要是只从备份中恢复一个单个的分支,拷贝那个分支就足够了。现在从备份中恢复已经成功的实践了,我们建议保持原来的目录。
107
108恢复以bazaar为基础的备份
109~~~~~~~~~~~~~~~~~~~~~~~
110
111为了从备份分支中恢复,我们可以将这些分支放到适当的位置::
112
113 $ cd /srv
114 $ mv bzr bzr.old
115 $ cd bzr
116 $ bzr branch bzr+ssh://backup.example.com/var/backup/trunk
117 $ bzr branch bzr+ssh://backup.example.com/var/backup/feature-gui
118
119如果有多个备份,可以改变上面的URL来从其他备份中恢复。
0120
=== added file 'doc/ch/admin-guide/code-browsing.txt'
--- doc/ch/admin-guide/code-browsing.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/admin-guide/code-browsing.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,82 @@
1基于网页的代码浏览
2=================
3
4在线浏览工程的历史记录是版本控制的一个重要部分,因为这允许人们轻松的看到分支上发生了什么,而不需要分支的一个本地的,最新的副本。在网页上浏览bazaar的分支有很多的选择,但是我们将详细介绍其中一个,并简明的涉及到与其他选择的区别。
5
6Loggerhead
7----------
8
9Loggerhead是为bazaar分支准备的浏览代码的接口(现在在launchpad中使用)。看一个loggerhead作用的例子,访问 http://bazaar.launchpad.net/~bzr-pqm/bzr/bzr.dev/files ,这是以loggerhead视角看bazaar的主分支的。loggerhead像一个网络应用一样运行在服务器上,通过一个RESTful接口由HTTP连接。这一应用是有可能运行在它自己特定的端口上的,比如 ``http://www.example.com:8080`` 或是把它放在一个分开的网络代理服务器后进行服务,比如在 ``http://www.example.com/loggerhead/`` 上。下面我们将讨论这两种配置。
10
11.. _Loggerhead: http://launchpad.net/loggerhead
12
13依赖
14~~~~
15
16loggerhead依赖很多其他的Python包,这些Python包使用来构建各种网络技术的。其中的一些必须安装以保证loggerhead的使用,虽然有些是可选的。从loggerhead的 `README` 文件中得知这些包有:
17
181) SimpleTAL(模板使用)。
19 在ubuntu上, 执行命令 `sudo apt-get install python-simpletal`
20 或者从 http://www.owlfish.com/software/simpleTAL/download.html 上下载。
212) Simplejson(产生JSON数据)。
22 在ubuntu上, 执行命令 `sudo apt-get install python-simplejson`
23 或者使用 `easy_install simplejson` 。
243) Paste(服务器使用,你需要1.2或是更高的版本)。
25 在ubuntu上, 执行命令 `sudo apt-get install python-paste`
26 或者使用 `easy_install Paste` 。
274) Paste Deploy(可选,当通过Apache代理服务时需要)。
28 在ubuntu上, 执行命令 `sudo apt-get install python-pastedeploy`
29 或者使用 `easy_install PasteDeploy` 。
305) flup(可选,当使用FastCGI,SCGI或是AJP时需要)。
31 在ubuntu上, 执行命令 `sudo apt-get install python-flup`
32 或者使用 `easy_install flup` 。
33
34虽然在ubuntu上安装这些包的指南已经给出了,大多数其他类型的GUN/Linux需要捆绑这些依赖,使得安装十分的方便。对于Windows和Mac OS X,他们应该能够通过 ``easy_install``- 来安装,最差情况下也要能够通过Python源来安装。
35
36内建的网络服务器
37~~~~~~~~~~~~~~~~
38
39Loggerhead有一个内置的网络服务器,而且当使用 ``serve-branches`` 命令时,该网络服务器运行在一个默认端口上来监听本地主机。如果默认端口是8080,可访问 ``www.example.com`` ,然后运行
40
41::
42
43 $ serve-branches --host=www.example.com --port=8080 /srv/bzr
44
45这将会列出在 ``http://www.example.com:8080/`` 上所有目录下可到达的分支,因此ProjectX主干可以通过 ``http://www.example.com:8080/projectx/trunk`` 来访问。要注意的是loggerhead提供了可访问潜在bazaar分支的HTTP(类似于在 `基于HTTP(S)智能服务器
46<other-setups.html#smart-server-over-http-s>`_ 中描述的),因此该命令应该由一个在 ``/srv/bzr`` 目录下没有写权限的用户运行。默认情况下,Loggerhead只在本地主机上监听,而不是所有的拓展端口,除非具体的指出了。
47
48基于代理服务器
49~~~~~~~~~~~~~~
50
51一个运行loggerhead更为常用、更为安全的方法是把它放在另一台网络服务器之后,这台网络服务器将会代理处理本地主机到loggerhead的请求。要做到此,你需要安装PasteDeploy(参考 `依赖`_ )。假设你的服务器已经运行了Apache,你需要添加如下的设置来搭建代理服务器
52
53::
54
55 <Location "/loggerhead/">
56 ProxyPass http://127.0.0.1:8080/
57 ProxyPassReverse http://127.0.0.1:8080/
58 </Location>
59
60如果你的代理服务器运行在这一服务器的某些路径上,那么 ``serve-branches`` 命令和 ``--prefix`` 选项都必须运行。例如,我们可以通过下面的命令来运行loggerhead
61
62::
63
64 $ serve-branches --prefix=/loggerhead /srv/bzr
65
66这将允许ProjectX的主分支通过 ``http://www.example.com/loggerhead/projectx/trunk`` 来访问。
67
68Loggerhead由一个脚本发展而来,这一脚本允许在Unix系列的系统上作为 ``init.d`` 的一项服务运行。如果想要在windows的服务器上做同样的事,欢迎访问 http://launchpad.net/loggerhead 。
69
70其他网络接口
71------------
72
73有很多关于bazaar分支的其他的网络接口(在 http://wiki.bazaar.canonical.com/WebInterfaces 上查看列表),在这里我们只涉及到其中的一组,具体讨论他们在特殊情况下的优点。
74
75trac+bzr (http://launchpad.net/trac-bzr)
76 trac是一个十分流行的网络应用,它为分支整合了一个浏览器,一个问题跟踪器和一个wiki。trac+bzr是trac的一个拓展,允许在bazaar中使用。
77
78webbzr ( http://thoughts.enseed.com/webbzr )
79 这是一个著名的方案,因为它是用纯PHP语言为网络主机所写的,它不提供运行随意的python应用的方法,比如说,Trac和Loggerhead。
80
81Redmine ( http://redmine.org/ )
82 像tarc一样,Redmine是一个在Rails框架中使用Ruby的完整的工程管理应用。它包括对bazaar分支的支持。
083
=== added file 'doc/ch/admin-guide/hooks-plugins.txt'
--- doc/ch/admin-guide/hooks-plugins.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/admin-guide/hooks-plugins.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,199 @@
1用svn钩子函数和插件来拓展bazaar
2==========================
3
4Bazaar提供了一套强有力的拓展机制来增加功能。除了提供了面向所有结构的API接口库,bazaar还可以加载 *插件* 来完成特殊的任务,这些特殊的任务是由 *hooks(钩子函数)* 指出的,运行在版本控制过程中的特定的步骤,这对于想要与bazaar分支进行交互的外部程序是十分有利的。
5
6想查看文档中全部可用的钩子函数,可以通过命令 ``bzr help hooks`` 来了解。在这些钩子函数中,从管理员的角度来说最重要的有 `pre_commit`, `post_commit` 和 `post_change_branch_tip` 。 `pre_commit` 钩子函数能够在一个事件发生之前就检测到它,如果该事件的某些标准没有达到, `pre_commit` 钩子函数还能撤销它。这有利于保证代码规范的强制实施,比如line_endings(截止符)和whitespace(空白字符)规则的实施。 `post_commit` 能够在刚发生的提交上进行操作,比如说提供各种不同类型的通知信息。最后, `post_change_branch_tip` 钩子函数是 `post_commit` 更为通用的一种形式,用于分支的顶端被改变的时候。也可以被用作通知的目的,备份或是做镜像。
7
8Bazaar的所有插件的信息都在 http://doc.bazaar.canonical.com/plugins/en/ 上。为了便于安装,插件都是简单的python包。他们可以用各自插件中的 ``setup.py`` 和bazaar中的 ``bzrlib.plugins`` 包一同安装。他们也可以安装在插件的路径上,该路径可以是用户的 ``~/.bazaar/plugins`` 目录或是 ``BZR_PLUGIN_PATH`` 环境变量具体定义的。查看 ``bzr help configuration`` 了解更多指明插件位置的信息.
9
10
11邮件通知
12--------
13
14一般的需求是分支上的每一个改变都需要发送一个邮件信息到一些地址上,通常是一个邮件列表。这些插件以很多方式提供了这一项功能。
15
16`email` 这一插件从每一个单个的开发者计算机上发送邮件。这对于追踪每个单个的开发者在从事什么是很有益的。不好的方面是,这要求每个开发者的分支单独的配置相同的插件。
17
18下面的两个插件 `hookless-email` 和 `email-notifier` 通过运行一个中央服务器来专注于集中存储分支上发生的变化。
19
20email插件
21~~~~~~~~~
22
23为了配置这一插件,需要简单的安装这一插件,再在每一个分支上配置 ``post_commit_to`` 选项。这一配置可以在 ``locations.conf`` 中进行或是在每一个分支的 ``branch.conf`` 文件中单独进行。如果发送者的邮件地址通过 ``bzr whoami`` 报告比较困难的话,可以像 ``post_commit_sender`` 一样被指出。 ``post_commit_mailer`` 选项指出了邮件应该怎样被发送。如果没有设置的话,邮件将会通过 ``/usr/bin/mail`` 发送。这也可以被设置为直接与SMTP服务器进行交互。更多的关于插件配置的细节请访问 http://doc.bazaar.canonical.com/plugins/en/email-plugin.html 。接下来的例子给出两个可能的配置。
24
25一个最简单的例子(使用 ``/usr/bin/mail``)
26
27::
28
29 [DEFAULT]
30 post_commit_to = projectx-commits@example.com
31
32一个复杂点的例子(使用所以操作)
33
34::
35
36 [DEFAULT]
37 post_commit_url = http://www.example.com/code/projectx/trunk
38 post_commit_to = projectx-commits@example.com
39 post_commit_sender = donotreply@example.com
40 post_commit_mailer = smtplib
41 smtp_server = mail.example.com:587
42 smtp_username = bob
43 # smtp_password = 'not specified, will prompt'
44
45hookless-mail插件
46~~~~~~~~~~~~~~~~~
47
48该插件基本上是 `email` 插件的服务器端版本。它是可通过命令行运行的程序或是作为一个守护程序管理在命令行中具体指出变化了的分支。当任何被控制的分支发生变化时,它将会向特定的地址发送邮件。用一个简单的例子来说明, ``/srv/bzr`` 目录下的任何一个分支最后一次运行这一命令时,该命令将会向 ``projectx-commits@example.com`` 发送邮件。(该命令可以设置成周期运行,例如 ``cron`` 。)
49
50::
51
52 $ bzr_hookless_email.py --email=projectx-commits@example.com \
53 --recurse /srv/bzr
54
55email-notifier插件
56~~~~~~~~~~~~~~~~~~
57
58这是 `hookless-email` 插件更为精巧的一个版本,它可发送模板HTML邮件。在提交的信息中提出wiki风格的标记,在服务器上更新运行的备份文件 (类似 `push_and_update`_)。也可以发送邮件来报告新的分支的建立或者是具体目录下分支的移除(这里指 ``/srv/bzr/projectx`` 目录)。由于它的功能更复杂了,配置也变得更加复杂了,这里我们就不重复这一部分的文档了。关于发送提交,创建或是删除分支的邮件的一个简单的配置是这样的
59
60::
61
62 [smtp]
63
64 server=smtp.example.com
65 # If user is not provided then no authentication will be performed.
66 user=bob
67 password=pAssW0rd
68
69 [commits]
70
71 # The address to send commit emails to.
72 to=projctx-commits@example.com
73 from=$revision.committer
74
75 # A Cheetah template used to construct the subject of the email message.
76 subject=$relative_path: $revision_number $summary
77
78 [new-branches]
79 to=projectx-commits@example.com
80 from=donotreply@example.com
81 subject=$relative_path: New branch created
82
83 [removed-branches]
84 to=projectx-commits@example.com
85 from=donotreply@example.com
86 subject=$relative_path: Branch removed
87
88如果该文件保存为 ``/srv/bzr/email-notifier.conf`` ,命令如下
89
90::
91
92 $ bzr-email-notifier.py --config=/srv/bzr/email-notifier.conf /srv/bzr/projectx
93
94这样可以在给定的目录下查看分支的提交,创建和删除状态。
95
96
97Feed接口时代
98-------------
99
100发送电子邮件时,分支的变化就是新一代的新闻源的相关概念从每个分支上的变化。感兴趣的人就可以追随这些新闻源来了解每个分支上发生的变化。选择那些信息接口而不是群体来了解在一个分支上发生了什么。
101
102branchfeed
103~~~~~~~~~~
104
105这一插件为每一个分支创建了一个分支变化(比如commit等)的ATOM接口。保存为 ``.bzr/branch/branch.atom`` ,它将这些文件存放在每个分支的内部。目前,在每一个feed接口上它包含最多20条最近的变化。要使用它,只要很简单的安装这一插件,然后设置你的源读者参照 ``branch.atom`` 文件即可。
106
107另外的,还有一些非插件工具能够创建Bazaar分支的新闻源。您可以查看 http://wiki.bazaar.canonical.com/FeedGenerators 了解更多关于这些工具的信息。
108
109
110镜像
111-----
112
113有时候确保一个分支作为另一分支的副本存在是很有好处的。这可以被用来提供简单的备份设备或是冗余(更多详细信息参考 `Back-up and restore <backup.html>`_)。实现的一种方法是使用bazaar的工作流程,也就是让发生变化的分支变为镜像分支的一个相近的分支。然后,当commits发生在工作分支上时,那也会发生在镜像分支上。要注意的是发生在相近分支上的commits不会更新镜像分支的工作文档。所以,如果镜像分支不只是分支历史的一个完全的备份,比如说,可以用作网页服务,那么就需要附加的插件。
114
115push_and_update
116~~~~~~~~~~~~~~~
117
118这一插件可以得到bazaar的 ``push`` 命令的更新,也可以更新远程的工作文档。这只能通过连接来工作,表明文件系统或是SSH可连接远程的工作文档(``bzr+ssh://``, ``sftp://`` 和
119``file://``)。当然只有远程的分支由明确的 ``push`` 命令更新了它才能有作用。
120
121automirror
122~~~~~~~~~~
123
124这一插件和 `push_and_update` 比较相似,因为它也是用来更新远程分支的工作文档的。不同的是,这一插件是设计用来当工作分支发生任何的变化时,更新远程分支。要配置它,只要在一个分支上设置 ``post_commit_mirror = URL`` 选项。这个选项可以包含多个分支URLs,通过逗号分开,创建多个镜像。例如,如果我们想要把 ``/srv/bzr/projectx/trunk`` 分支镜像到URL ``sftp://www.example.com/var/www/projectx`` 上(如果ProjectX是一个网络上的工程,而且我们想要连接到 ``http://www.example.com/projectx``),然后我们可以包含
125
126::
127
128 [DEFAULT]
129 post_commit_mirror = sftp://www.example.com/var/www/branches/trunk
130
131在 ``/srv/bzr/projectx/trunk/.bzr/branch/branch.conf`` 文件中。
132
133其他有用的插件
134--------------
135
136pqm(插件)
137~~~~~~~~~
138
139为了促进与 `PQM
140<integration.html#patch-queue-manager-pqm>`_ 的交互,该插件提供了向远程补丁队列管理提交融合请求的支持。PQM提供了在融合主分支的变化之前自动运行测试套件的方法。
141
142testrunner
143~~~~~~~~~~
144
145有时在PQM方面的新手,这个插件只需在一个更新的修改版上(在一个临时目录)运行一个简单的命令,如果这一命令返回0,那这个修改版可以被提交到那个分支上。例如,如果测试套件和 ``nosetests`` 命令一起运行在分支的根目录下(如果通过了返回0,没通过返回1),那么可以这样设置
146
147::
148
149 [DEFAULT]
150 pre_change_branch_tip_test_command = nosetests
151
152在 ``.bzr/branch/branch.conf``文件中。
153
154checkeol
155~~~~~~~~
156
157这一插件是 `pre_commit` 钩子函数检查被提交的修改版是否达到相关标准的例子。既然这样,它将检查所有有特殊截至符的文件。它在工作树的根目录使用一个名为 ``.bzreol`` 的配置文件(类似于 ``.bzrignore`` 文件)。该配置文件有关于关于LF,CRLF,CR结束符的章节,对于一个不一样的例子,不同的文件有特定的截至符,这样的文件看起来像这样子
158
159::
160
161 [LF]
162 *.py
163 *.[ch]
164
165 [CRLF]
166 *.txt
167 *.ini
168
169 [CR]
170 foo.mac
171
172或者你想要在分支上强制使用单个截至符标准,可以这样用
173
174::
175
176 [LF]
177 *
178
179这个插件需要安装在分支可能会改变的服务器上,而且每一个强制使用规定截至符的分支都必须要有 ``.bzreol`` 文件(通过命令 ``bzr add .bzreol`` 把它加入到分支中是件很容易的事,虽然这意味着运行在服务器上的分支必须有工作树)。
180
181text_checker
182~~~~~~~~~~~~
183
184这一插件是 `checkeol` 更加先进的一个版本,它可以检查这样风格的代码,像结尾是空白字符的、长串的和不以新的一行结尾的文件。它可以用在 ``BZR_HOME/rules`` 中的bazaar内置的规则说明书来配置(查看 ``bzr help rules`` 获得更多信息)。对于不同类型的意料之外的改变,你可以采取不同的措施。例如
185
186::
187
188 [name NEWS README]
189 trailing_whitespace=fail
190 long_lines=warn
191 newline_at_eof=ignore
192
193 [name *.py]
194 tabs=fail
195 long_line_length=78
196 long_lines=fail
197 trailing_whitespace=fail
198
199可以防止因为增加新的结尾空白字符而带来的特定的文件的改变,同时保持python源文件免于tabs和lines超过78个字符。防止提交时违反这些规则,可以通过 ``--text-check-warn-only`` 选项来提交。
0200
=== added file 'doc/ch/admin-guide/index-plain.txt'
--- doc/ch/admin-guide/index-plain.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/admin-guide/index-plain.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,24 @@
1###################################
2Bazaar System Administrator's Guide
3###################################
4
5.. Please mark sections in included files as following:
6.. level 1 ========
7.. level 2 --------
8.. level 3 ~~~~~~~~
9.. level 4 ^^^^^^^^ (it is better not to use nesting deeper than 3 levels)
10
11.. contents:: :depth: 3
12
13.. include:: introduction.txt
14.. include:: simple-setups.txt
15.. include:: other-setups.txt
16.. include:: migration.txt
17.. include:: hooks-plugins.txt
18.. include:: code-browsing.txt
19.. include:: integration.txt
20.. include:: security.txt
21.. include:: backup.txt
22.. include:: upgrade.txt
23.. include:: advanced.txt
24.. include:: licence.txt
025
=== added file 'doc/ch/admin-guide/index.txt'
--- doc/ch/admin-guide/index.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/admin-guide/index.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,26 @@
1###################################
2Bazaar 系统管理员手册
3###################################
4
5.. 请将章节包含的文件按如下方式标记:
6.. level 1 ========
7.. level 2 --------
8.. level 3 ~~~~~~~~
9.. level 4 ^^^^^^^^ (嵌套深度最好不要超过3层)
10
11
12.. toctree::
13 :maxdepth: 2
14
15 introduction
16 simple-setups
17 other-setups
18 migration
19 hooks-plugins
20 code-browsing
21 integration
22 security
23 backup
24 upgrade
25 advanced
26 licence
027
=== added file 'doc/ch/admin-guide/integration.txt'
--- doc/ch/admin-guide/integration.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/admin-guide/integration.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,14 @@
1与其他工具的整合
2================
3
4补丁队列管理 (PQM)
5------------------
6
7BUG追踪器
8----------
9
10持续集成工具
11------------
12
13Bundle Buggy
14------------
015
=== added file 'doc/ch/admin-guide/introduction.txt'
--- doc/ch/admin-guide/introduction.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/admin-guide/introduction.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,30 @@
1介绍
2====
3
4欢迎使用Bazaar版本控制系统的管理员使用手册。Bazaar是一个灵活的系统,提供了许多可能选择服务项目的方式来满足您的需求。如果您有些需求Bazaar现在的系统状态不能满足您, 请通过邮件 bazaar@lists.canonical.com 或者在Launchpad https://launchpad.net/bzr 中告知我们。
5
6该手册适用的范围
7----------------
8
9在这个手册中, 我们将讨论各种技术包括获取Bazaar项目,从其他版本控制系统迁移,通过网页浏览代码以及Bazaar与其他工具的结合。在这些类别中,存在多个选项,我们会尽量解释的各种选项的代价和好处。
10
11本指南的目标读者是服务于计算机管理的个人。大部分的配置在我们讨论时都需要管理员权限,但不是每个点都需要。这就是说,对于那些想要充分利用Bazaar并且有兴趣和系统管理员进行交流的人而言,阅读这个手册是非常有帮助的。
12
13运行Bazaar服务器您需要的
14------------------------
15
16在可能的情况下,我们将讨论在Unix(包括GNU/Linux)和Windows服务器环境。鉴于本文档的目的,我们会把Mac OS X考虑为一种类型的Unix。
17
18通常,Bazaar需要Python_ 2.6或以上的版本。
19如果您想要 *可选*
20例如想要通过SFTP访问分支,那么您需要 `paramiko and pycrypto`_ 。
21
22.. _Python: http://www.python.org/
23.. _paramiko and pycrypto: http://www.lag.net/paramiko/
24
25为了获得最佳性能,Bazaar可以使用编译版本中的一些的重要组件的代码。纯Python的替代品存在于这些组件中,但是它们可能是相当慢的。为了编译这些扩展,您需要一个C编译器和包含相关头文件的Python包。在GNU/Linux,这些可能在一个单独的包中。其他的操作系统需要默认安装这些头文件。
26
27如果您安装的是开发版的Bazaar,而不是一个稳定发行版,那么您需要Pyrex 来创建C扩展。发行版的源码包中已经帮您创建了这些扩展。
28
29.. _Pyrex: http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/
30
031
=== added file 'doc/ch/admin-guide/licence.txt'
--- doc/ch/admin-guide/licence.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/admin-guide/licence.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,4 @@
1证书
2====
3
4版权2008-2011Canonical Ltd。Bazaar是免费的软件,你可以在GNU General Public License版本2或是更后的版本下使用,修改或是再发布Bazaar和这篇文档。更多请查看<http://www.gnu.org/licenses/>。
05
=== added file 'doc/ch/admin-guide/migration.txt'
--- doc/ch/admin-guide/migration.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/admin-guide/migration.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,41 @@
1迁移
2====
3
4版本控制系统之间的移植是一个十分复杂的过程,在 http://doc.bazaar.canonical.com/migration/en 上bazaar有关于这一过程的附加文档,在此就不在赘述了。我们将尽量给出一些生动的关于Mercurial和Subversion迁移的例子。
5
6快速导入
7--------
8
9很多的工程都希望能使用bazaar,需要考虑的是存在一个先前的代码库。bazaar支持着一个交互式的版式,起初是为Git开发的,叫做 `fast-import` ,向其他的许多版本控制系统提供移植的策略。为了支持fast-import文件,bazaar需要 `fastimport`_ 插件。这些插件可以像bazaar的所有插件一样一起安装。
10
11.. _fastimport: http://launchpad.net/bzr-fastimport
12
13Fast-import可以用来移植在于它将已经存在的历史记录输出到了一个fast-import文档中,然后使用 ``bzr fast-import`` 命令。 `fastimport` 的插件包括exporters for CVS,Git,Subversion,Git,Mercurial和darcs,像 ``fast-export-from-XXX`` 命令一样易于使用。值得注意的是如果在一个分支中已经有存在的历史记录那 ``fast-import`` 就不能再使用了。
14
15假设PeojectX在Mercurical在转变为bazaar之前第一次被开发,而Mercurical库在 ``/srv/hg/projectx`` 目录下,下面的命令将把历史记录引进到新创建的 ``trunk(主分支)`` 中(之前我们在 `进一步的配置 <simple-setups.html#further-configuration>`_ 中将 ``/srv/bzr/projectx`` 目录创建成为一个共享的库)。
16
17::
18
19 $ cd /srv/bzr/projectx
20 $ bzr fast-export-from-hg ../../hg/projectx projectx.fi
21 $ bzr init trunk
22 $ bzr fast-import projectx.fi trunk
23
24Subversion转换
25--------------
26
27像大多数集中式的版本控制系统一样,对于任何的一个新的版本控制系统,从Subversion移植都是十分重要的。bazaar的 `svn`_ 插件提供了与Subversion工程交互的工具。实际上,bazaar可以很简单的使用存放在Subversion中的工程,但这已经超出了这篇文档的范围(浏览 http://doc.bazaar.canonical.com/migration/en/foreign/bzr-on-svn-projects.html 了解更多关于这一项目的信息)。与之相关的是该插件提供的是 ``svn-import`` 命令。这可以导入整个subversion库,包括标记和分支,特别是当他们存放在Subversion的推荐目录 ``/tags/``, ``/branches/`` 和 ``/trunk/`` 下。
28
29这一指令有很灵活的方法来指明Subversion库中哪些路径包含分支,哪些路径包含标记。例如,在Subversion工程(svn插件称为 ``trunk``)中被推荐的布局可以这样在 ``~/.bazaar/subversion.conf`` 中指出
30
31::
32
33 [203ae883-c723-44c9-aabd-cb56e4f81c9a]
34 branches = branches/*
35 tags = tags/*
36
37这允许将大量复杂的Subversion库转变为一系列独立的bazaar分支。安装svn插件后,查看 ``bzr help svn-import`` 和 ``bzr help svn-layout`` 。
38
39.. _svn: http://launchpad.net/bzr-svn
40
41.. TODO: Legacy VCS to bzr sync. Tailor? Incremental conversions?
042
=== added file 'doc/ch/admin-guide/other-setups.txt'
--- doc/ch/admin-guide/other-setups.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/admin-guide/other-setups.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,32 @@
1其他配置
2========
3
4傻瓜服务器
5----------
6
7Bazaar同样可以通过协议来提供分支服务,而这些协议可以完全不知道bazaar的具体需求。这种方式被叫做“傻瓜服务器”以此来和bazaar本地的协议区分,目前的HTTP,HTTPS,FTP,SFTP和HTTP+WebDAV可以用来对分支进行远程的读作。FTP,SFTP和HTTP+WebDAV也可以用来进行写操作。要使用这些协议,只需要在 ``/srv/bzr`` 目录下提供服务器文件系统的通道。
8
9例如,Apache在 ``/srv/bzr`` 目录下提供分支的只读服务的配置可以是这样的::
10
11 Alias /code /srv/bzr
12 <Directory /srv/bzr>
13 Options Indexes
14 # ...
15 </Directory>
16
17用户也可以用URL ``http://server.example.com/code/projectx/trunk`` 来访问主分支。
18
19需要注意的是,只要SSH服务存在,SFTP通道通常是可行的。而且当bazaar安装服务器上不能提供 ``bzr+ssh://`` 接口的时候这是一个很好的选择。傻瓜服务器相对于本地的协议来是要慢一点的,因为他们是纯粹的服务器,但是当软件和协议在服务器或是网络上使用受限时,他们是一个很好的选择。
20
21
22基于HTTP(S)的智能服务器
23-----------------------
24
25Bazaar可以使用本地的协议来进行HTTP或是HTTPS请求。由于HTTP是一个在很多网络上都使用的网络协议,如果SSH接口不能实现的话这可以是一个很好的选择。这一设置的另外一个好处是,所有对HTTP服务器(basic, LDAP, ActiveDirectory等)适用的身份验证和接入控制的方法同样适用于bazaar分支。更多的关于用Apache和FastCGI或是mod_python,WSGI来建立这种接口的信息在 `用户指南的智能服务器章节 <../user-guide/http_smart_server.html>`_ 中。
26
27
28直接的智能服务器通道
29--------------------
30
31被 ``bzr+ssh://`` 使用的内置服务器在一个专用的端口同样可以用作长久的服器。bazaar的官方端口是4155,但端口可以配置。更多关于通过端口监视程序或直接从shell运行bazaar的智能服务器信息在 `用户指南 <../user-guide/server.html#inetd>`_ 中。专用的bazaar服务器目前还没有身份验证,所以该服务器默认只提供只读权限。他可以进行 ``--allow-writes`` 选项,但智能服务器不提供任何附加的接入控制,所以可能会让一些无意的人改变了分支(当然也可以恢复)。如果用户在服务器的文件系统上有写的权限,那任何接入服务器4155端口的人都能对存放在那的分支进行修改。
32
033
=== added file 'doc/ch/admin-guide/security.txt'
--- doc/ch/admin-guide/security.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/admin-guide/security.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,57 @@
1安全
2====
3
4身份认证
5--------
6
7Bazaar的身份认证思想是最好使用已存在的身份验证技术,而不是尝试重新创造可能的方法来进行安全的用户验证。这样的话,我们描述使用两个已经存在的软件的使用方法来达到身份验证的目的。
8
9使用SSH
10~~~~~~~~
11
12对于身份验证的用户来说SSH是一种经过很好测试的,很有特色的技术。对于所有开发者在服务器上都有本地账户的情况,提供安全的 ``bzr+ssh://`` 身份认证接口是十分寻常的。这种方法需要关心的一点是,它让开发者不满意的地方是不能在服务器机子上使用shell接入。既然如此,bazaar提供了 ``bzr_ssh_path_limiter`` 脚本,这一脚本能够以特定的路径在服务器机子上运行bazaar的智能服务器,而不允许任何其他的接入。
13
14要设置它,需要::
15
16 command="/path/to/bzr_ssh_path_limiter <path>" <typical key line>
17
18在服务器上每一个用户的 ``~/.ssh/authorized_keys`` 文件中指出,其中 `<path>` 就是接入受限的路径(以及它的主目录)。关于 ``authorized_keys`` 文件中句法的文档,请查看SSH服务器上的文档。这将只允许bazaar接入指定的路径,而不为用户提供其他的SSH接入。
19
20如果在服务器上不需要给每一个用户一个帐号,那么只需要用 ``~sshuser/.ssh/authorized_keys`` 文件下的一个单个的SSH帐号来包含多个公/私密钥对。而且每一个开发者可以授予他们自己的私钥。然后他们可以使用 ``bzr+ssh://sshuser@server.example.com/`` URLs来访问服务器。
21
22使用HTTP身份验证的方法
23~~~~~~~~~~~~~~~~~~~~~~
24
25接入控制
26---------
27
28很多工程都需要对对分支有读写权限的人有很好的接入控制。包括操作系统层的组用户和文件系统权限的控制,这都是十分困难的,在某些情况下甚至是不允许的。bazaar提供了一个名为 ``bzr_access`` 的脚本用来进行接入控制,这一脚本是基于用户名进行的,而且通过SSH来进行身份验证。要达到这样的目的,我们需要在SSH上建立私钥验证。这可以通过使用服务器上单个的SSH账户或是一个用户一个帐号的方法来实现。核心思想是用SSH的 ``authorized_keys`` 文件来指明 ``bzr_access`` 脚本,只有被特定的密钥对验证了的用户才能够运行这一命令。
29
30首先,您需要为所有有可能接入到库的用户产生一个公/私密钥对。私钥需要传送给用户,而公钥需要在服务器上来验证该用户。在服务器上,在SSH用户的 ``~/.ssh/authorized_keys`` 文件中,每一个库使用者和相一致的公钥要使用下面这一行代码::
31
32 command="/path/to/bzr_access /path/to/bzr /path/to/repository <username>",no- port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-<type> <key>
33
34其中 `<key>` (可能很长)就是公钥, `<type>` 就是SSH密钥的类型, `<username>` 就是和那公钥相关联的用户名。
35
36从 ``/path/to/repository/bzr_access.conf`` 文件中我们可以看到 ``bzr_access`` 包含它的配置信息。该文件不应该放在位于 ``/path/to/repository`` 的版本控制分支上,因为那样将允许所有能够接入库的人来改变接入控制的规则。 ``bzr_access.conf`` 文件是一个简单INI-style的形式,有些章节是由 ``[groups]`` 和 ``[/]`` 来定义的。 ``[groups]`` 章节的选项是组的名称,那些选项的值应该是组中用户的名称。在 ``[/]`` 章节中,选项应该是用户名或是组的名称(以 ``@`` 为前缀,值是 ``rw``, ``r`` 或者为空,表示可读写、只读和不可访)。 ``bzr_access.conf`` 的一个简单的例子是这样的::
37
38 [groups]
39 admins = alpha
40 devels = beta, gamma, delta
41
42 [/]
43 @admins = rw
44 @devels = r
45 upsilon =
46
47其中,用户的值是 `alpha` ,那他有读写的权限,是 `beta`, `gamma` 和 `delta` 的话,有只读的权限,是 `upsilon` 的话,那他将不能够访问 ``/path/to/repository`` 目录下的分支。
48
49关于bzr_access的额外考虑
50~~~~~~~~~~~~~~~~~~~~~~~~
51
52如刚刚所写, ``bzr_access`` 只允每个公钥关联到一个单个的库地址。这意味着如果开发者需要访问两个或者更多不同的库时,那么他们需要两个或是更多SSH私钥而且能够选择其中的两个(查看 ``man ssh`` 了解更多关于配置多密钥的信息)。
53
54而且,每一个库只能有一个单一的配置文件,有分支中所有库的接入配置,这意味着如果不同的项目需要不同的接入准则,那么那些项目必须在不同的库中。那就像刚刚描述的那样,多个私钥是十分有必要的。
55
56最后,像以上讲述的那样,在 `使用SSH`_ 的前提下,所有的公钥都应该包含在服务器上单个用户的 ``authorized_keys`` 文件中。所有的开发者使用一个单个的公/私密钥对也是有可能的,但只允许一个单一的用户名控制接入库(因为用户名关联到 ``authorized_keys`` 中的私钥)。但是这似乎很有可能违背接入控制的目的,虽然像之前所说的它提供了受限的SSH接入。
57
058
=== added file 'doc/ch/admin-guide/simple-setups.txt'
--- doc/ch/admin-guide/simple-setups.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/admin-guide/simple-setups.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,90 @@
1简单配置
2========
3
4考虑到下面这个简单场景,我们将把Bazaar分支放在一个单个的服务器上。这些分支在 ``/srv/bzr`` (或者 ``C:\bzr``) 的子目录上并且他们将被关联到一个叫做"ProjectX"的单个工程中。ProjectX将会有一个主分支和至少一个特征分支。当我们逐步深入的时候,我们将考虑其他的方案,但这将是一个十分生动的例子。
5
6智能服务器
7----------
8
9为外部提供途径来访问服务器上的分支的最简单可行的办法是使用bazaar内置的,提供SSH通道的智能服务器。这样,通过SSH能访问你的服务器的人对你服务器上的分支就有读写的权限。这一配置使用了SSH的身份验证机制包括私钥和服务器系统的接入控制机制。特别的,在服务器上使用了“组”的概念,这样使得为不同的开发者提供不同的接入权限变成了可能。
10
11.. _SSH: http://www.openssh.org/
12
13配置
14~~~~
15
16在服务器上除了安装好bazaar以及为你的开发者提供的可行的SSH接入,不再需要其他的配置。通过SSH的配置可以限制开发者使用 *除* bazaar以外的其他任何东西,以此可以限制他们访问文件系统的特定部分。
17
18客户端
19~~~~~~
20
21客户可以使用以 ``bzr+ssh://`` 为前缀的URLs来访问分支。例如:要得到ProjectX主干的一个本地副本,开发者可以这样做::
22
23 $ bzr branch bzr+ssh://server.example.com/srv/bzr/projectx/trunk projectx
24
25如果开发者对 ``/srv/bzr/projectx`` 目录有写的权限,他们可以创建他们自己使用的新的分支::
26
27 $ bzr branch bzr+ssh://server.example.com/srv/bzr/projectx/trunk \
28 bzr+ssh://server.example.com/srv/bzr/projectx/feature-gui
29
30当然,如果没有这些需求,开发者对 ``/srv/bzr/projectx`` 目录将不会有写的权限。
31
32进一步的配置
33~~~~~~~~~~~~
34
35对于一个有多个相关分支的工程,最好的方式是使用一个共享的库来存放这些分支。可以这样做::
36
37 $ cd /srv/bzr
38 $ bzr init-repo --no-trees projectx
39
40``--no-trees`` 选项通过不备份服务器上文件系统的工作文档来节约空间。而且,所有创建在 ``/srv/bzr/projectx`` (参考 `Migration <migration.html>`_ 寻求一些方法)目录下的分支都共享存储空间,这样对于那些有很多共同修改部分的分支来说是很有好处的,比如说一个工程的主分支与特征分支。
41
42如果bazaar没有安装为用户的路径或是在SSH配置中没有指出,客户可以使用 ``BZR_REMOTE_PATH`` 环境变量来具体的指出它的路径。例如:如果bazaar是安装在 ``/usr/local/bzr-2.0/bin/bzr`` 目录下的,那开发者可以这样做::
43
44 $ BZR_REMOTE_PATH=/usr/local/bzr-2.0/bin/bzr bzr info \
45 bzr+ssh://server.example.com/srv/bzr/proectx/trunk
46
47以此来获得该主分支的信息.远程的路径同样能够在bazaar配置文档的特定位置中指出。阅读 ``bzr help configuration`` 获得更多信息。
48
49如果开发者在服务器上有家目录,他们可以在URLs中使用 ``/~/`` 来访问他们的家目录。他们同样可以使用 ``/~username/`` 来访问他们家目录中的用户username。例如:如果有两个开发者 ``alice`` 和 ``bob`` ,bob可以使用::
50
51 $ bzr log bzr+ssh://server.example.com/~/fix-1023
52
53来访问他的一个错误修复分支,且::
54
55 $ bzr log bzr+ssh://server.example.com/~alice/fix-2047
56
57来访问alice的分支。 [#]_
58
59.. [#] 服务器上安装的bazaar必须是2.1.0b1版本或是更高的版本才能支持在bzr+ssh URLs中使用 ``/~/`` 。
60
61
62用一个受限的SSH账户来组织多用户和库
63~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
64
65一旦用一个bzr+ssh的配置来使用一个可共享的库,你也许想要在一个开发者小组中共享这个库。使用共享的SSH接入可以完成这项任务,而不需要任何复杂的配置或是不间断的管理。
66
67为了允许多用户通过ssh来访问bazaar,我们可以允许ssh有权接入一个共用的账户,这个帐户只允许运行一个特定的命令。用一个单一的账户简化了调度,因为对于文件系统来说权限管理问题不存在了。在服务器的层次上,所有的用户都是一样的了。bazaar将不同用户的请求作上标签,这样就不需要将服务器上的账户分开了。
68
69为了保证这一配置,我们更新 ``~/.ssh/authorized_keys`` 目录来为那些相关的用户提供受限的命令。
70
71在这些例子中,用户被称为 ``bzruser`` 。
72
73下面的例子展示了一个单一的线路是怎样配置的::
74
75 command="bzr serve --inet --allow-writes --directory=/srv/bzr",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAA...= my bzr key
76
77这一条命令使得用户只允许访问bzr而废除了SSH的其他用途。对于 ``/srv/bzr`` 目录下每一个库的写权限已经通过--allow-writes授予了,同时对于那些只要求读权限的个别用户,写权限也可以被禁用。对于每一个用户,目录结构的根也能够被改变而让他们只看到库的主干。下面的例子假设alice和bob有两个分开的库。这种方法将不允许你限制访问库的一部分,你也许只被限制访问目录结构的一个单一部分::
78
79 command="bzr serve --inet --allow-writes --directory=/srv/bzr/alice/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAA...= Alice's SSH Key
80 command="bzr serve --inet --allow-writes --directory=/srv/bzr/bob/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAA...= Bob's SSH Key
81 command="bzr serve --inet --allow-writes --directory=/srv/bzr/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAA...= Repo Manager SSH Key
82
83Ailce和bob都能够访问他们各自的库,repo管理员能够访问他们两个中的任何一个人的库。用户不被允许访问系统的任何一部分除非在目录中特别指出了。提供的 ``bzr serve`` 和 ``--directory`` 选项简化了bzr+ssh URLs。如果alice登录了,她的fix-1023分支可以使用以下命令::
84
85 $ bzr log bzr+ssh://bzruser@server.example.com/fix-1023
86
87如果repo管理员登录了,他可以使用以下的命令来访问alice的fix-1023分支::
88
89 $ bzr log bzr+ssh://bzruser@server.example.com/alice/fix-1023
90
091
=== added file 'doc/ch/admin-guide/upgrade.txt'
--- doc/ch/admin-guide/upgrade.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/admin-guide/upgrade.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,29 @@
1升级
2====
3
4Bazaar致力于内部版本的通用性,无论在磁盘上还是网络上。在服务器上新的客户端应该能够和旧的版本交互(也许速度不是很理想),而且在服务器上旧的客户端也应该能和bazaar的新版本交流。这一原则的分歧是考虑错误和在之后的版本中解决这些错误。
5
6也就是说,bazaar是不断改善的,而且很多当前的版本都是最有特色,有很好的表现的。特别的,bazaar 2.0和之后的版本较之前的版本有很重要的优点,包括更紧密的磁盘格式,更快的网络运行和整体工作性能的提升。伴随着2.0版本的发放,bazaar开始变为了稳定版/开发版的模式,而且2.x系列维持了bug修复版本的发放长达六个月。同时2.(x+1)系列发展成了每月发放的beta版本,适合于每天的使用。bazaar的发展有一个稳定的主线和一个拓展的测试套件,所以不需要担心开发版系列的日常使用,它改变的要比稳定版频繁。很多的用户运行的是开发版的bazaar而且经常的升级,包括很多bazaar开发者自身。
7
8
9软件升级
10--------
11
12更新bazaar的软件包就像用windows或是Mac OS X下最新的二进制包重新安装python包一样的简单,二进制包由你的GUN/Linux分布提供,或者从发布的源中安装。查看 http://wiki.bazaar.canonical.com/Downloads 了解最新发布的所有支持的平台。
13
14Bazaar之后的版本支持所有早期版本的磁盘格式,所以在更新软件时不需要对磁盘上的分支进行更新。为了更好的使用新的功能,可能需要在服务器和开发者的机子上都更新版本,这不要求客户端或是服务器上已经先升级了。
15
16
17磁盘格式的升级
18--------------
19
20在发展演变中,bazaar使用过顺序的磁盘格式来提高储存的效率和速度。随着2.0版本新的磁盘格式的发放,保持了这种磁盘格式直到3.0版本的发布,目前还没有计划出新的版本(bazaar2.0大致是bazaar1.0发布两年后发布的)。其结果,磁盘格式的升级几乎是极其罕见的。
21
22如果在旧版本的格式中存在分支,而且你想要将它升级到最新的版本,你可以查看2.0升级指南来了解更多的信息。从系统管理员的观点来看,在这一过程中协调各种升级的时机是很重要的。接下来,开发者的任何本地的镜像都需要被升级。最后,开发者的本地分支需要被升级。这些升级当他们运行时需要一个合适的版本(通过网络来对分支进行远程升级是有可能的,但是这可能很慢)。
23
24
25插件升级
26---------
27
28当bazaar的版本升级的时候,bazaar API使用的插件也需要被升级来反映API的变化。有些插件对于bazaar API的版本有很严格的版本依赖。如果是这种情况,你需要确保你依赖的插件在你的bazaar版本升级之前已经升级了,避免出现你的插件在新安装的bazaar版本中不能使用的情况。如果真的发生了,解决的方法是安装你的插件之前确实能够工作的bazaar版本。对于安装,依赖很多的插件,这种版本升级应该在安全的沙盒中进行过测试来保证bazaar的完整的采集和插件能够一起工作。
29
030
=== added file 'doc/ch/conf.py'
--- doc/ch/conf.py 1970-01-01 00:00:00 +0000
+++ doc/ch/conf.py 2012-11-23 02:18:19 +0000
@@ -0,0 +1,106 @@
1# -*- coding: utf-8 -*-
2#
3# Bazaar documentation build configuration file, created by
4# sphinx-quickstart on Tue Jul 21 17:04:52 2009.
5#
6# This file is execfile()d with the current directory set to its containing dir.
7
8import sys, os
9
10# If extensions (or modules to document with autodoc) are in another directory,
11# add these directories to sys.path here. If the directory is relative to the
12# documentation root, use os.path.abspath to make it absolute, like shown here.
13sys.path = [os.path.abspath('../..')] + sys.path
14
15# Most of the configuration for Bazaar docs is defined here ...
16from bzrlib.doc_generate.conf import *
17
18## Configuration specific to this site ##
19
20# The locale code for this documentation set
21bzr_locale = 'ch'
22
23# Translations & supporting helper function
24bzr_titles = {
25 u'Table of Contents (%s)': u'目录(%s)',
26 u'Bazaar User Guide': u'Bazaar用户手册',
27 u'Bazaar User Reference': u'Bazaar用户索引',
28 u'Bazaar Release Notes': u'Bazaar发布日志',
29 u'Bazaar Upgrade Guide': None,
30 u"Bazaar System Administrator's Guide": u'Bazaar系统管理员手册',
31 u'Bazaar in five minutes': u'五分钟学会Bazaar',
32 u'Bazaar Tutorial': None,
33 u'Using Bazaar With Launchpad': u'将Bazaar与Launchpad结合使用',
34 u'Centralized Workflow Tutorial': None,
35 u"What's New in Bazaar 2.1?": None,
36 }
37def bzr_title(s):
38 return bzr_titles.get(s) or s
39
40# A shorter title for the navigation bar. Default is the same as html_title.
41html_short_title = bzr_title(u"Table of Contents (%s)") % (release,)
42
43# Additional templates that should be rendered to pages, maps page names to
44# template names.
45html_additional_pages = {'index': 'index.html'}
46
47# Output file base name for HTML help builder.
48htmlhelp_basename = 'bzr-%s' % (bzr_locale,)
49
50# Grouping the document tree into files. List of tuples
51# (source start file, target name, title, author, documentclass [howto/manual]).
52bzr_documents = [
53 # Manuals
54 ('user-guide/index', 'bzr-%s-user-guide' % (bzr_locale,),
55 bzr_title(u'Bazaar User Guide'), bzr_team, 'manual'),
56 ('user-reference/index', 'bzr-%s-user-reference' % (bzr_locale,),
57 bzr_title(u'Bazaar User Reference'), bzr_team, 'manual'),
58 ('release-notes/index', 'bzr-%s-release-notes' % (bzr_locale,),
59 bzr_title(u'Bazaar Release Notes'), bzr_team, 'manual'),
60 ('upgrade-guide/index', 'bzr-%s-upgrade-guide' % (bzr_locale,),
61 bzr_title(u'Bazaar Upgrade Guide'), bzr_team, 'manual'),
62 ('admin-guide/index', 'bzr-%s-admin-guide' % (bzr_locale,),
63 bzr_title(u"Bazaar System Administrator's Guide"), bzr_team, 'manual'),
64 # Tutorials
65 ('mini-tutorial/index', 'bzr-%s-tutorial-mini' % (bzr_locale,),
66 bzr_title(u'Bazaar in five minutes'), bzr_team, 'howto'),
67 ('tutorials/tutorial', 'bzr-%s-tutorial' % (bzr_locale,),
68 bzr_title(u'Bazaar Tutorial'), bzr_team, 'howto'),
69 ('tutorials/using_bazaar_with_launchpad',
70 'bzr-%s-tutorial-with-launchpad' % (bzr_locale,),
71 bzr_title(u'Using Bazaar With Launchpad'), bzr_team, 'howto'),
72 ('tutorials/centralized_workflow',
73 'bzr-%s-tutorial-centralized' % (bzr_locale,),
74 bzr_title(u'Centralized Workflow Tutorial'), bzr_team, 'howto'),
75 ('whats-new/whats-new-in-2.1', 'bzr-%s-whats-new' % (bzr_locale,),
76 bzr_title(u"What's New in Bazaar 2.1?"), bzr_team, 'howto'),
77]
78
79latex_documents = [
80 (start, target+'.tex', title, author, doc_class)
81 for start, target, title, author, doc_class in bzr_documents
82 ]
83
84texinfo_documents = [
85 (start, target, title, author, doc_class)
86 for start, target, title, author, doc_class in bzr_documents
87 ]
88
89# List of documents that shouldn't be included in the build.
90unused_docs = [
91 # Subtopics that get included
92 'upgrade-guide/overview',
93 'upgrade-guide/data_migration',
94 'upgrade-guide/tips_and_tricks',
95 # Plain-style documentation generation stuff
96 'release-notes/NEWS',
97 'user-reference/bzr_man',
98 'user-guide/index-plain',
99 'admin-guide/index-plain',
100 # Templates
101 'release-notes/release-template',
102 'release-notes/series-template',
103 # Miscellaneous
104 'user-reference/readme',
105]
106
0107
=== added file 'doc/ch/index.txt'
--- doc/ch/index.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/index.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,20 @@
1.. Bazaar documentation master file, created by
2 sphinx-quickstart on Tue Jul 21 17:04:52 2009.
3 You can adapt this file completely to your liking, but it should at least
4 contain the root `toctree` directive.
5
6
7Table of Contents
8=================
9
10.. toctree::
11 :maxdepth: 1
12
13 whats-new/whats-new-in-2.6
14 user-guide/index
15 tutorials/index
16 quick-reference/index
17 release-notes/index
18 upgrade-guide/index
19 user-reference/index
20 admin-guide/index
021
=== added directory 'doc/ch/mini-tutorial'
=== added file 'doc/ch/mini-tutorial/index.txt'
--- doc/ch/mini-tutorial/index.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/mini-tutorial/index.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,212 @@
1======================
2五分钟快速学习Bazaar
3======================
4
5介绍
6============
7
8Bazaar是一个分布式的版本控制系统,它让人们更容易在软件项目中协同工作。
9
10在接下来的五分钟,您将学习如何在版本控制下放您的文件,如何记录它们的更改,检查您的工作,发布它并发送您的工作融合到项目的主干中。
11
12
13安装
14============
15
16本指南不介绍如何安装Bazaar,但它通常非常容易。您可以找到安装说明:
17
18- **GNU/Linux:** Bazaar可能已经在您的GNU/Linux发行版中。
19- **Windows:** `Windows安装说明`_.
20- **Mac OS X:** `Mac OS X安装说明`_.
21
22对于其他平台并从源代码安装,请看 Download_ 页和 Installation_ 页。
23
24.. _Windows安装说明: http://wiki.bazaar.canonical.com/WindowsDownloads
25.. _Mac OS X安装说明: http://wiki.bazaar.canonical.com/MacOSXBundle
26.. _Download: http://wiki.bazaar.canonical.com/Download
27.. _Installation: http://wiki.bazaar.canonical.com/InstallationFaq
28
29
30自我介绍
31====================
32
33Bazaar记录源代码的更改,并记录谁做了更改。这个人是通过他的名字和电子邮件地址来识别的。(如果您担心垃圾邮件,您不需要使用一个实际上您会读的真邮件地址。但约定是,它看起来像一个电子邮件地址。)
34
35在您开始工作之前,需要先告诉Bazaar您是谁。用您的名字和邮件地址替代John Doe的名字和邮件地址。范例为::
36
37 $ bzr whoami "John Doe <john.doe@gmail.com>"
38
39您可以核对什么身份被写进了Bazaar的配置文件中::
40
41 $ bzr whoami
42 John Doe <john.doe@gmail.com>
43
44
45启动新的项目
46======================
47
48假设我们要在Bazaar下存储一个新的项目。首先,我们要创建一个 *库目录* 来保存与此项目有关的所有工作。在库目录下开发人员可以创建分支来进行特定功能的测试开发或者,更一般的,进行工作文件设置的修改。
49
50创建库之后,切换到该目录,并创建项目的主干分支。
51
52::
53
54 $ bzr init-repo sample
55 Shared repository with trees (format: 2a)
56 Location:
57 shared repository: sample
58 $ bzr init sample/trunk
59 $ cd sample/trunk
60 Created a repository tree (format: 2a)                                         
61 Using shared repository: /home/john/sample/
62
63
64添加文件
65============
66
67现在我们有主干,我们需要移动到该目录,并为该项目的第一个版本创建一些示例文件。用文本编辑器(如emacs,nano或notepad)创建一个文件 ``test1.txt`` ,并保存。然后我们将"添加"文件,以此来告诉Bazaar我们想要它跟踪更改::
68
69 bzr add test1.txt
70
71然后提交,从而节省了所有版本文件的快照::
72
73 bzr commit -m "Added first line of text"
74
75
76更改文件
77============================
78
79
80我们更改一个文件,并提交更改到您的分支。
81
82在您最常用的编辑器中编辑文件 ``test1.txt`` ,然后用 ``bzr add`` 来告诉Bazaar跟踪这个文件的更改::
83
84 $ echo test test test > test1.txt
85 $ bzr add test1.txt
86 adding test1.txt
87
88`bzr diff` 显示这个分支和当前树(或者加上 ``-r`` 选项,显示任意的两树)中上个版本的更改。::
89
90 $ bzr diff
91 === modified file 'test1.txt'
92 --- test1.txt 2007-10-08 17:56:14 +0000
93 +++ test1.txt 2007-10-08 17:46:22 +0000
94 @@ -0,0 +1,1 @@
95 +test test test
96
97提交您的工作到Bazaar分支::
98
99 $ bzr commit -m "Added first line of text"
100 Committing to: /home/john/sample/trunk/                             
101 added test1.txt
102 Committed revision 1.
103
104查看修改日志
105========================
106
107您能通过浏览分支日志来查看分支的历史::
108
109 $ bzr log
110 revno: 1
111 committer: John Doe <john.doe@gmail.com>
112 branch nick: trunk
113 timestamp: Mon 2006-10-08 17:46:22 +0000
114 message:
115 Initial import
116
117
118在Launchpad上发布您的分支
119===================================
120
121Launchpad是软件项目的一套开发和托管工具。您能用它来发布您的分支。(您也可以发布分支到您自己的服务器或其它的托管服务。)
122
123在Launchpad上发布分支的步骤是:
124
1251. 创建一个Launchpad账户:访问 `Launchpad注册页面`_ 并选择创建一个新账户。
126
127.. _Launchpad注册页面: https://launchpad.net/+login
128
1292. Bazaar用SSH加解密和认证协议来连接到Launchpad。首先您需要在您自己的电脑上 `创建SSH密钥`_ ,运行命令::
130
131 $ ssh-keygen
132
133.. _创建SSH密钥: https://help.launchpad.net/YourAccount/CreatingAnSSHKeyPair
134
1353. `上传您的SSH公钥到Launchpad`_.
136
137.. _上传您的SSH公钥到Launchpad: https://launchpad.net/~/+editsshkeys
138
1394. `为您的项目创建团队`_. 即使开始时只有您一个人作为这个项目的开发人员,现在创建一个新的团队也会让您在以后加入其他人时更容易。
140
141.. _为您的项目创建团队: https://help.launchpad.net/Teams/CreatingAndRunning
142
1435. `创建项目`_.
144
145.. _创建项目: https://help.launchpad.net/Projects/Registering
146
1476. 告诉Bazaar您的Launchpad账户名。如果您的账户是john.doe,格式为 ::
148
149 $ bzr launchpad-login john.doe
150
1517. `推送您项目的分支`_ 。一旦您在本地提交了您的更改,您可以将它们作为新项目的主干发布,命令如下:
152
153 $ bzr push lp:~sample-developers/sample/trunk
154
155 (当然,使用团队和项目的名字就是您来选择了。)
156
157.. _推送您项目的分支: https://help.launchpad.net/Code/UploadingABranch
158
159制作您自己的其他分支副本
160========================================
161
162使用别人的代码来工作,您可以制作您自己的他们分支的副本。我们举一个真实的例子,Bazaar的GTK接口::
163
164 $ bzr init-repo ~/bzr-gtk
165 $ bzr branch lp:~bzr/bzr-gtk/trunk ~/bzr-gtk/john
166 Branched 292 revision(s).
167
168Bazaar将从bzr-gtk项目的主干分支下载所有的文件和完整的修订历史记录,并创建一个叫 ``john`` 的副本。
169
170现在,您有自己的分支副本,并且您可以在联网或不联网下提交更改。您可以在任何时候发布分支来分享您的分支,如果bzr-gtk团队要用到您的工作时,Bazaar让他们融合您的分支回到他们的主分支很容易。
171
172
173从主分支更新您的分支
174=========================================
175
176您提交更改到您的分支时,有可能其他人也继续提交代码到父分支。
177
178为了确保您的分支保持最新,您应该融合父分支上的更改到您的个人分支中::
179
180 $ bzr merge
181 Merging from saved parent location: http://bazaar.launchpad.net/~bzr/bzr-gtk/trunk
182 All changes applied successfully.
183
184核对什么东西被更改过::
185
186 $ bzr diff
187
188如果不同分支进行了相同文件的相同地方的修改,融合它们时可能会产生冲突。当这种情况发生时,Bazaar会放置像 ``<<<<<<<`` 的文本标记到文件中,并将它们记录到一个冲突文件列表。您应该编辑文件以反映您所希望的方式来解决冲突,用 ``bzr diff`` 命令来核对更改,然后用 ``bzr resolve`` 命令将它们标记为解决。
189
190如果您对更改满意,您可以提交它们到您的个人分支::
191
192 $ bzr commit -m "Merge from main branch"
193 Committed revision 295.
194
195
196学习更多
197=============
198
199在 `Bazaar User Guide <../user-guide/index.html>`_ 里,您能找到关于Bazaar更多的东西。
200
201在命令行上学习Bazaar::
202
203 $ bzr help
204
205学习''foo''规则或命令::
206
207 $ bzr help foo
208
209许可证
210=======
211
212版权所有2007-2011 Canonical有限公司。Bazaar是免费软件。在GNU通用公共许可证版本2或更高版本的条款下,您可以使用,修改和重新发布Bazaar和这个文档。请看<http://www.gnu.org/licenses/>.
0213
=== added directory 'doc/ch/tutorials'
=== added file 'doc/ch/tutorials/centralized_workflow.txt'
--- doc/ch/tutorials/centralized_workflow.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/tutorials/centralized_workflow.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,318 @@
1=============================
2Centralized Workflow Tutorial
3=============================
4
5
6Overview
7========
8
9This document describes a possible workflow for using Bazaar_. That of
10using Bazaar_, the distributed version control system, in a centralized
11manner. Bazaar_ is designed to be very flexible and allows several
12different workflows, from fully decentralized to mostly centralized. The
13workflow used here is meant to ease a new user into more advanced usage of
14Bazaar_, and allow them to work in a mix of centralized and decentralized
15operations.
16
17In general, this document is meant for users coming from a background of
18centralized version control systems such as CVS or subversion. It is
19common in work settings to have a single central server hosting the
20codebase, with several people working on this codebase, keeping their work
21in sync. This workflow is also applicable to a single developer working
22on several different machines.
23
24.. _Bazaar: http://bazaar.canonical.com
25
26
27Initial Setup
28=============
29
30These are some reasonably simple steps to setup Bazaar_ so that it works
31well for you.
32
33
34Setting User Email
35------------------
36
37Your user identity is stored with each commit. While this doesn't have to
38be accurate or unique, it will be used in log messages and
39annotations, so it is better to have something real.
40
41::
42
43 % bzr whoami "John Doe <jdoe@organization.com>"
44
45
46Setting up a local Repository
47-----------------------------
48
49Bazaar_ branches generally copy the history information around with them,
50which is part of how you can work in a fully decentralized manner. As an
51optimization, it is possible for related branches to combine their storage
52needs so that you do not need to copy around all of this history
53information whenever you create a new branch.
54
55The best way to do this is to create a `Shared Repository`_. In
56general, branches will share their storage if they exist in a
57subdirectory of a `Shared Repository`_. So let's set up a `Shared
58Repository`_ in our home directory, thus all branches we create
59underneath will share their history storage.
60
61::
62
63 % bzr init-repo --trees ~
64
65
66Setting up a remote Repository
67---------------------------------
68
69Many times you want a location where data is stored separately from where
70you do your work. This workflow is required by centralized systems
71(CVS/SVN). Usually they are on separate machines, but not always. This is
72actually a pretty good setup, especially in a work environment. Since it
73ensures a central location where data can be backed up, and means that if
74something happens to a developer's machine, no committed work has to be
75lost.
76
77So let's set up a shared location for our project on a remote machine
78called ``centralhost``. Again, we will use a
79`Shared Repository`_ to optimize disk usage.
80
81::
82
83 % bzr init-repo --no-trees bzr+ssh://centralhost/srv/bzr/
84
85You can think of this step as similar to setting up a new cvsroot, or
86subversion repository. The ``--no-trees`` option tells bzr to not
87populate the directory with a working tree. This is appropriate,
88since no one will be making changes directly in the branches within
89the central repository.
90
91Here we're using a ``bzr+ssh`` URL, which means to use Bazaar's own
92protocol on top of the SSH secure shell. See the Administrator Guide for
93information about setting up a bzr+ssh server.
94
95
96Migrating an existing project to Bazaar
97=======================================
98
99Now that we have a repository, let's create a versioned project. Most of
100the time, you will already have some code that you are working with,
101that you now want to version using Bazaar_. If the code was originally
102in source control, there are many ways to convert the project to Bazaar_
103without losing any history. However, this is outside the scope of this
104document. See `Tracking Upstream`_ for some possibilities (section
105"Converting and keeping history").
106
107.. _Tracking Upstream: http://wiki.bazaar.canonical.com/TrackingUpstream
108
109..
110 XXX: We really need a different document for discussing conversion of a
111 project. Right now TrackingUpstream is the best we have, though.
112
113
114Developer 1: Creating the first revision
115----------------------------------------
116
117So first, we want to create a branch in our remote Repository, where we
118want to host the project. Let's assume we have a project named
119"sigil" that we want to put under version control.
120
121::
122
123 % bzr init bzr+ssh://centralhost/srv/bzr/sigil
124
125This can be thought of as the "HEAD" branch in CVS terms, or as the "trunk"
126in Subversion terms. We will call this the ``dev`` branch.
127
128I prefer working in a subdirectory of my home directory to avoid collisions with all
129the other files that end up there. Also, we will want a project
130directory where we can hold all of the different branches we end up
131working on.
132
133::
134
135 % cd ~
136 % mkdir work
137 % cd work
138 % mkdir sigil
139 % cd sigil
140 % bzr checkout bzr+ssh://centralhost/srv/bzr/sigil dev
141 % cd dev
142 % cp -ar ~/sigil/* .
143 % bzr add
144 % bzr commit -m "Initial import of Sigil"
145
146
147In the previous section, we created an empty branch (the ``/sigil``
148branch) on ``centralhost``, and then checkout out this empty branch
149onto our workstation to add files from our existing project. There
150are many ways to set up your working directory, but the steps above
151make it easy to handle working with feature/bugfix branches. And one
152of the strong points of Bazaar_ is how well it works with branches.
153
154At this point, because you have a 'checkout' of the remote branch, any
155commits you make in ``~/work/sigil/dev/`` will automatically be saved
156both locally, and on ``centralhost``.
157
158
159Developer N: Getting a working copy of the project
160--------------------------------------------------
161
162Since the first developer did all of the work of creating the project,
163all other developers would just checkout that branch. **They should
164still follow** `Setting User Email`_ and `Setting up a local Repository`_.
165
166To get a copy of the current development tree::
167
168 % cd ~/work/sigil
169 % bzr checkout bzr+ssh://centralhost/srv/bzr/sigil dev
170
171Now that two people both have a checkout of
172``bzr+ssh://centralhost/srv/bzr/sigil``, there will be times when one of
173the checkouts will be out of date with the current version.
174At commit time, Bazaar_ will inform the user of this and prevent them from
175committing. To get up to date, use ``bzr update`` to update the
176tree with the remote changes. This may require resolving conflicts if the
177same files have been modified.
178
179
180Developing on separate branches
181===============================
182
183So far everyone is working and committing their changes into the same
184branch. This means that everyone needs to update fairly regularly and
185deal with other people's changes. Also, if one person commits something
186that breaks the codebase, then upon syncing, everyone will get the
187problem.
188
189Usually, it is better to do development on different branches, and then
190integrate those back into the main branch, once they are stable. This is
191one of the biggest changes from working with CVS/SVN. They both allow you
192to work on separate branches, but their merging algorithms are fairly
193weak, so it is difficult to keep things synchronized. Bazaar_ tracks
194what has already been merged, and can even apply changes to files that
195have been renamed.
196
197
198Creating and working on a new branch
199------------------------------------
200
201We want to keep our changes available for other people, even if they
202aren't quite complete yet. So we will create a new public branch on
203``centralhost``, and track it locally.
204
205::
206
207 % cd ~/work/sigil
208 % bzr branch bzr+ssh://centralhost/srv/bzr/sigil \
209 bzr+ssh://centralhost/srv/bzr/sigil/doodle-fixes
210 % bzr checkout bzr+ssh://centralhost/srv/bzr/sigil/doodle-fixes doodle-fixes
211 % cd doodle-fixes
212
213We now have a place to make any fixes we need to ``doodle``. And we would
214not interrupt people who are working on other parts of the code. Because
215we have a checkout, any commits made in the ``~/work/sigil/doodle-fixes/``
216will also show up on ``centralhost``. [#nestedbranches]_ It is also
217possible to have two developers collaborate on one of these branches, just
218like they would have collaborated on the ``dev`` branch. [#cbranch]_
219
220.. [#nestedbranches] It may look odd to have a branch in a subdirectory of
221 another branch. This is just fine, and you can think of it as a
222 hierarchical namespace where the nested branch is derived from the
223 outer branch.
224
225.. [#cbranch] When using lots of independent branches, having to retype
226 the full URL all the time takes a lot of typing. We are looking into
227 various methods to help with this, such as branch aliases, etc. For
228 now, though, the bzrtools_ plugin provides the ``bzr cbranch`` command.
229 Which is designed to take a base branch, create a new public branch,
230 and create a checkout of that branch, all with much less typing.
231 Configuring ``cbranch`` is outside the scope of this document, but the
232 final commands are similar to:
233
234::
235
236 % bzr cbranch dev my-feature-branch
237
238.. _bzrtools: http://wiki.bazaar.canonical.com/BzrTools
239
240
241Merging changes back
242--------------------
243
244When it is decided that some of the changes in ``doodle-fixes`` are ready
245to be merged into the main branch, simply do::
246
247 % cd ~/work/sigil/dev
248 % bzr merge ../doodle-fixes
249
250Now the changes are available in the ``dev`` branch, but they have not
251been committed yet. This is the time when you want to review the final
252changes, and double check the code to make sure it compiles cleanly and
253passes the test suite. The commands ``bzr status`` and ``bzr diff`` are
254good tools to use here. Also, this is the time to resolve any conflicts.
255Bazaar_ will prevent you from committing until you have resolved these
256conflicts. That way you don't accidentally commit the conflict markers.
257The command ``bzr status`` will show the conflicts along with the other
258changes, or you can use ``bzr conflicts`` to just list conflicts. Use
259``bzr resolve file/name`` or ``bzr resolve --all`` once conflicts have
260been handled. [#resolve]_ If you have a conflict that is particularly
261difficult to solve you may want to use the ``bzr remerge`` command. It
262will let you try different merge algorithms, as well as let you see the
263original source lines (``--show-base``).
264
265.. [#resolve] Some systems make you resolve conflicts as part of the merge
266 process. We have found that it is usually easier to resolve conflicts
267 when you have the view of the entire tree, rather than just a single
268 file. It gives you much more context, and also lets you run tests as
269 you resolve the problems.
270
271
272Recommended Branching
273---------------------
274
275One very common way to handle all of these branches is to give each
276developer their own branch, and their own place to work in the central
277location. This can be done with::
278
279 % bzr branch bzr+ssh://centralhost/srv/bzr/sigil \
280 bzr+ssh://centralhost/srv/bzr/sigil/user-a
281 % bzr branch bzr+ssh://centralhost/srv/bzr/sigil \
282 bzr+ssh://centralhost/srv/bzr/sigil/user-b
283
284This gives each developer their own branch to work on. And, they can
285easily create a new feature branch for themselves with just [#cbranch]_
286::
287
288 % bzr branch bzr+ssh://centralhost/srv/bzr/sigil/user-a \
289 bzr+ssh://centralhost/srv/bzr/sigil/user-a/feature
290 % cd ~/work/sigil
291 % bzr checkout bzr+ssh://centralhost/srv/bzr/sigil/user-a/feature myfeature
292
293
294Glossary
295========
296
297Shared Repository
298-----------------
299
300Bazaar_ has the concept of a "Shared Repository". This is similar to
301the traditional concept of a repository in other VCSs like CVS and
302Subversion. For example, in Subversion you have a remote repository,
303which is where all of the history is stored, and locally you don't
304have any history information, only a checkout of the working tree
305files. Note that "Shared" in this context means shared between
306branches. It *may* be shared between people, but standalone branches
307can also be shared between people.
308
309In Bazaar_ terms, a "Shared Repository" is a location where multiple
310branches can **share** their revision history information. In order to
311support decentralized workflows, it is possible for every branch to
312store its own revision history information. But this is often
313inefficient, since related branches share history, and they might as
314well share the storage as well.
315
316
317..
318 vim: tw=74 ft=rst spell spelllang=en_us
0319
=== added file 'doc/ch/tutorials/index.txt'
--- doc/ch/tutorials/index.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/tutorials/index.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,11 @@
1Tutorials
2=========
3
4.. toctree::
5 :maxdepth: 1
6
7 ../mini-tutorial/index
8 tutorial
9 using_bazaar_with_launchpad
10 centralized_workflow
11 licence
012
=== added file 'doc/ch/tutorials/licence.txt'
--- doc/ch/tutorials/licence.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/tutorials/licence.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,7 @@
1Licence
2===============
3
4Copyright 2005-2011 Canonical Ltd. Bazaar is free software, and you
5may use, modify and redistribute both Bazaar and this document under
6the terms of the GNU General Public License version 2 or later. See
7<http://www.gnu.org/licenses/>.
08
=== added file 'doc/ch/tutorials/tutorial.txt'
--- doc/ch/tutorials/tutorial.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/tutorials/tutorial.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,647 @@
1.. This file is in Python ReStructuredText format - it can be formatted
2.. into HTML or text. In the future we plan to extract the example commands
3.. and automatically test them.
4
5.. This text was previously on the wiki at
6.. http://bazaar.canonical.com/IntroductionToBzr
7.. but has been moved into the source tree so it can be kept in sync with
8.. the source and possibly automatically checked.
9
10===============
11Bazaar Tutorial
12===============
13
14
15Introduction
16============
17
18If you are already familiar with decentralized version control, then
19please feel free to skip ahead to "Introducing Yourself to Bazaar". If,
20on the other hand, you are familiar with version control but not
21decentralized version control, then please start at "How DVCS is
22different." Otherwise, get some coffee or tea, get comfortable and get
23ready to catch up.
24
25The purpose of version control
26==============================
27
28Odds are that you have worked on some sort of textual data -- the sources
29to a program, web sites or the config files that Unix system
30administrators have to deal with in /etc. The chances are also good that
31you have made some sort of mistake that you deeply regretted. Perhaps you
32deleted the configuration file for your mailserver or perhaps mauled the
33source code for a pet project. Whatever happened, you have just deleted
34important information that you would desperately like to get back. If this
35has ever happened to you, then you are probably ready for Bazaar.
36
37Version control systems (which I'll henceforth call VCS) such as
38Bazaar give you the ability to track changes for a directory by turning
39it into something slightly more complicated than a directory that we call
40a **branch**. The branch not only stores how the directory looks right
41now, but also how it looked at various points in the past. Then, when you
42do something you wish you hadn't, you can restore the directory to the way
43it looked at some point in the past.
44
45Version control systems give users the ability to save changes to a
46branch by "committing a **revision**". The revision created is essentially
47a summary of the changes that were made since the last time the tree was
48saved.
49
50These revisions have other uses as well. For example, one can comment
51revisions to record what the recent set of changes meant by providing an
52optional log message. Real life log messages include things like "Fixed
53the web template to close the table" and "Added SFTP suppport. Fixes #595"
54
55We keep these logs so that if later there is some sort of problem with
56SFTP, we can figure out when the problem probably happened.
57
58How DVCS is different
59=====================
60
61Many Version Control Systems (VCS) are stored on servers. If one wants to
62work on the code stored within a VCS, then one needs to connect to the
63server and "checkout" the code. Doing so gives one a directory in which a
64person can make changes and then commit. The VCS client then connects to
65the VCS server and stores the changes. This method is known as the
66centralized model.
67
68The centralized model can have some drawbacks. A centralized VCS requires
69that one is able to connect to the server whenever one wants to do version
70control work. This can be a bit of a problem if your server is on some other
71machine on the internet and you are not. Or, worse yet, you **are** on the
72internet but the server is missing!
73
74Decentralized Version Control Systems (which I'll call DVCS after this
75point) deal with this problem by keeping branches on the same machine as
76the client. In Bazaar's case, the branch is kept in the same place as
77the code that is being version controlled. This allows the user to save
78his changes (**commit**) whenever he wants -- even if he is offline. The
79user only needs internet access when he wants to access the changes in
80someone else's branch that are somewhere else.
81
82
83A common requirement that many people have is the need to keep track of
84the changes for a directory such as file and subdirectory changes.
85Performing this tracking by hand is a awkward process that over time
86becomes unwieldy. That is, until one considers version control tools such
87as Bazaar. These tools automate the process of storing data by creating
88a **revision** of the directory tree whenever the user asks.
89
90Version control software such as Bazaar can do much more than just
91storage and performing undo. For example, with Bazaar a developer can
92take the modifications in one branch of software and apply them to a
93related branch -- even if those changes exist in a branch owned by
94somebody else. This allows developers to cooperate without giving
95write access to the repository.
96
97Bazaar remembers the ''ancestry'' of a revision: the previous revisions
98that it is based upon. A single revision may have more than one direct
99descendant, each with different changes, representing a divergence in the
100evolution of the tree. By branching, Bazaar allows multiple people to
101cooperate on the evolution of a project, without all needing to work in
102strict lock-step. Branching can be useful even for a single developer.
103
104Introducing yourself to Bazaar
105==============================
106
107Bazaar installs a single new command, **bzr**. Everything else is a
108subcommand of this. You can get some help with ``bzr help``. Some arguments
109are grouped in topics: ``bzr help topics`` to see which topics are available.
110
111One function of a version control system is to keep track of who changed
112what. In a decentralized system, that requires an identifier for each
113author that is globally unique. Most people already have one of these: an
114email address. Bazaar is smart enough to automatically generate an email
115address by looking up your username and hostname. If you don't like the
116guess that Bazaar makes, then three options exist:
117
1181. Set an email address via ``bzr whoami``. This is the simplest way.
119
120 To set a global identity, use::
121
122 % bzr whoami "Your Name <email@example.com>"
123
124 If you'd like to use a different address for a specific branch, enter
125 the branch folder and use::
126
127 % bzr whoami --branch "Your Name <email@example.com>"
128
129#. Setting the email address in the ``~/.bazaar/bazaar.conf`` [1]_ by
130 adding the following lines. Please note that ``[DEFAULT]`` is case
131 sensitive::
132
133 [DEFAULT]
134 email=Your Name <email@isp.com>
135
136 As above, you can override this settings on a branch by branch basis
137 by creating a branch section in ``~/.bazaar/locations.conf`` and
138 adding the following lines::
139
140 [/the/path/to/the/branch]
141 email=Your Name <email@isp.com>
142
143
144#. Overriding the two previous options by setting the global environment
145 variable ``$BZR_EMAIL`` or ``$EMAIL`` (``$BZR_EMAIL`` will take
146 precedence) to your full email address.
147
148.. [1] On Windows, the users configuration files can be found in the
149 application data directory. So instead of ``~/.bazaar/branch.conf``
150 the configuration file can be found as:
151 ``C:\Documents and Settings\<username>\Application Data\Bazaar\2.0\branch.conf``.
152 The same is true for ``locations.conf``, ``ignore``, and the
153 ``plugins`` directory.
154
155Creating a branch
156=================
157
158History is by default stored in the .bzr directory of the branch. In a
159future version of Bazaar, there will be a facility to store it in a
160separate repository, which may be remote.
161
162We create a new branch by running ``bzr init`` in an existing directory::
163
164 % mkdir tutorial
165 % cd tutorial
166 % ls -a
167 ./ ../
168 % pwd
169 /home/mbp/work/bzr.test/tutorial
170 %
171 % bzr init
172 % ls -aF
173 ./ ../ .bzr/
174 %
175
176As with CVS, there are three classes of file: unknown, ignored, and
177versioned. The **add** command makes a file versioned: that is, changes
178to it will be recorded by the system::
179
180 % echo 'hello world' > hello.txt
181 % bzr status
182 unknown:
183 hello.txt
184 % bzr add hello.txt
185 added hello.txt
186 % bzr status
187 added:
188 hello.txt
189
190
191If you add the wrong file, simply use ``bzr remove`` to make it
192unversioned again. This does not delete the working copy in this case,
193though it may in others [2]_.
194
195.. [2] ``bzr remove`` will remove the working copy if it is currently
196 versioned, but has no changes from the last committed version. You
197 can force the file to always be kept with the ``--keep`` option to
198 ``bzr remove``, or force it to always be deleted with ``--force``.
199
200Branch locations
201================
202
203All history is stored in a branch, which is just an on-disk directory
204containing control files. By default there is no separate repository or
205database as used in svn or svk. You can choose to create a repository if
206you want to (see the ``bzr init-repo`` command). You may wish to do this
207if you have very large branches, or many branches of a moderately sized
208project.
209
210You'll usually refer to branches on your computer's filesystem just by
211giving the name of the directory containing the branch. bzr also supports
212accessing branches over SSH, HTTP and SFTP, amongst other things::
213
214 % bzr log bzr+ssh://bazaar.launchpad.net/~bzr-pqm/bzr/bzr.dev/
215 % bzr log http://bazaar.launchpad.net/~bzr-pqm/bzr/bzr.dev/
216 % bzr log sftp://bazaar.launchpad.net/~bzr-pqm/bzr/bzr.dev/
217
218By installing bzr plugins you can also access branches using the rsync
219protocol.
220
221See the `Publishing your branch`_ section for more about how to put your
222branch at a given location.
223
224Reviewing changes
225=================
226
227Once you have completed some work, you will want to **commit** it to the
228version history. It is good to commit fairly often: whenever you get a
229new feature working, fix a bug, or improve some code or documentation.
230It's also a good practice to make sure that the code compiles and passes
231its test suite before committing, to make sure that every revision is a
232known-good state. You can also review your changes, to make sure you're
233committing what you intend to, and as a chance to rethink your work before
234you permanently record it.
235
236Two bzr commands are particularly useful here: **status** and **diff**.
237
238bzr status
239----------
240
241The **status** command tells you what changes have been made to the
242working directory since the last revision::
243
244 % bzr status
245 modified:
246 foo
247
248``bzr status`` hides "boring" files that are either unchanged or ignored.
249The status command can optionally be given the name of some files or
250directories to check.
251
252bzr diff
253--------
254
255The **diff** command shows the full text of changes to all files as a
256standard unified diff. This can be piped through many programs such as
257''patch'', ''diffstat'', ''filterdiff'' and ''colordiff''::
258
259 % bzr diff
260 === added file 'hello.txt'
261 --- hello.txt 1970-01-01 00:00:00 +0000
262 +++ hello.txt 2005-10-18 14:23:29 +0000
263 @@ -0,0 +1,1 @@
264 +hello world
265
266
267With the ``-r`` option, the tree is compared to an earlier revision, or
268the differences between two versions are shown::
269
270 % bzr diff -r 1000.. # everything since r1000
271 % bzr diff -r 1000..1100 # changes from 1000 to 1100
272
273The ``--diff-options`` option causes bzr to run the external diff program,
274passing options. For example::
275
276 % bzr diff --diff-options --side-by-side foo
277
278Some projects prefer patches to show a prefix at the start of the path
279for old and new files. The ``--prefix`` option can be used to provide
280such a prefix.
281As a shortcut, ``bzr diff -p1`` produces a form that works with the
282command ``patch -p1``.
283
284
285Committing changes
286==================
287
288When the working tree state is satisfactory, it can be **committed** to
289the branch, creating a new revision holding a snapshot of that state.
290
291bzr commit
292----------
293
294The **commit** command takes a message describing the changes in the
295revision. It also records your userid, the current time and timezone, and
296the inventory and contents of the tree. The commit message is specified
297by the ``-m`` or ``--message`` option. You can enter a multi-line commit
298message; in most shells you can enter this just by leaving the quotes open
299at the end of the line.
300
301::
302
303 % bzr commit -m "added my first file"
304
305You can also use the ``-F`` option to take the message from a file. Some
306people like to make notes for a commit message while they work, then
307review the diff to make sure they did what they said they did. (This file
308can also be useful when you pick up your work after a break.)
309
310Message from an editor
311----------------------
312
313If you use neither the ``-m`` nor the ``-F`` option then bzr will open an
314editor for you to enter a message. The editor to run is controlled by
315your ``$VISUAL`` or ``$EDITOR`` environment variable, which can be overridden
316by the ``editor`` setting in ``~/.bazaar/bazaar.conf``; ``$BZR_EDITOR`` will
317override either of the above mentioned editor options. If you quit the
318editor without making any changes, the commit will be cancelled.
319
320The file that is opened in the editor contains a horizontal line. The part
321of the file below this line is included for information only, and will not
322form part of the commit message. Below the separator is shown the list of
323files that are changed in the commit. You should write your message above
324the line, and then save the file and exit.
325
326If you would like to see the diff that will be committed as you edit the
327message you can use the ``--show-diff`` option to ``commit``. This will include
328the diff in the editor when it is opened, below the separator and the
329information about the files that will be committed. This means that you can
330read it as you write the message, but the diff itself wont be seen in the
331commit message when you have finished. If you would like parts to be
332included in the message you can copy and paste them above the separator.
333
334Marking bugs as fixed
335---------------------
336
337Many changes to a project are as a result of fixing bugs. Bazaar can keep
338metadata about bugs you fixed when you commit them. To do this you use the
339``--fixes`` option. This option takes an argument that looks like this::
340
341 % bzr commit --fixes <tracker>:<id>
342
343Where ``<tracker>`` is an identifier for a bug tracker and ``<id>`` is an
344identifier for a bug that is tracked in that bug tracker. ``<id>`` is usually
345a number. Bazaar already knows about a few popular bug trackers. They are
346bugs.launchpad.net, bugs.debian.org, and bugzilla.gnome.org. These trackers
347have their own identifiers: lp, deb, and gnome respectively. For example,
348if you made a change to fix the bug #1234 on bugs.launchpad.net, you would
349use the following command to commit your fix::
350
351 % bzr commit -m "fixed my first bug" --fixes lp:1234
352
353For more information on this topic or for information on how to configure
354other bug trackers please read `Bug Tracker Settings`_.
355
356.. _Bug Tracker Settings: ../user-reference/index.html#bug-tracker-settings
357
358Selective commit
359----------------
360
361If you give file or directory names on the commit command line then only
362the changes to those files will be committed. For example::
363
364 % bzr commit -m "documentation fix" commit.py
365
366By default bzr always commits all changes to the tree, even if run from a
367subdirectory. To commit from only the current directory down, use::
368
369 % bzr commit .
370
371
372Removing uncommitted changes
373============================
374
375If you've made some changes and don't want to keep them, use the
376**revert** command to go back to the previous head version. It's a good
377idea to use ``bzr diff`` first to see what will be removed. By default the
378revert command reverts the whole tree; if file or directory names are
379given then only those ones will be affected. ``bzr revert`` also clears the
380list of pending merges revisions.
381
382
383Ignoring files
384==============
385
386The .bzrignore file
387-------------------
388
389Many source trees contain some files that do not need to be versioned,
390such as editor backups, object or bytecode files, and built programs. You
391can simply not add them, but then they'll always crop up as unknown files.
392You can also tell bzr to ignore these files by adding them to a file
393called ``.bzrignore`` at the top of the tree.
394
395This file contains a list of file wildcards (or "globs"), one per line.
396Typical contents are like this::
397
398 *.o
399 *~
400 *.tmp
401 *.py[co]
402
403If a glob contains a slash, it is matched against the whole path from the
404top of the tree; otherwise it is matched against only the filename. So
405the previous example ignores files with extension ``.o`` in all
406subdirectories, but this example ignores only ``config.h`` at the top level
407and HTML files in ``doc/``::
408
409 ./config.h
410 doc/*.html
411
412To get a list of which files are ignored and what pattern they matched,
413use ``bzr ignored``::
414
415 % bzr ignored
416 config.h ./config.h
417 configure.in~ *~
418
419It is OK to have either an ignore pattern match a versioned file, or to
420add an ignored file. Ignore patterns have no effect on versioned files;
421they only determine whether unversioned files are reported as unknown or
422ignored.
423
424The ``.bzrignore`` file should normally be versioned, so that new copies
425of the branch see the same patterns::
426
427 % bzr add .bzrignore
428 % bzr commit -m "Add ignore patterns"
429
430
431bzr ignore
432----------
433
434As an alternative to editing the ``.bzrignore`` file, you can use the
435``bzr ignore`` command. The ``bzr ignore`` command takes filenames and/or
436patterns as arguments and then adds them to the ``.bzrignore`` file. If a
437``.bzrignore`` file does not exist the ``bzr ignore`` command will
438automatically create one for you, and implicitly add it to be versioned::
439
440 % bzr ignore tags
441 % bzr status
442 added:
443 .bzrignore
444
445Just like when editing the ``.bzrignore`` file on your own, you should
446commit the automatically created ``.bzrignore`` file::
447
448 % bzr commit -m "Added tags to ignore file"
449
450
451Global ignores
452--------------
453
454There are some ignored files which are not project specific, but more user
455specific. Things like editor temporary files, or personal temporary files.
456Rather than add these ignores to every project, bzr supports a global
457ignore file in ``~/.bazaar/ignore`` [1]_. It has the same syntax as the
458per-project ignore file.
459
460
461Examining history
462=================
463
464bzr log
465-------
466
467The ``bzr log`` command shows a list of previous revisions. The ``bzr log
468--forward`` command does the same in chronological order to get most
469recent revisions printed at last.
470
471As with ``bzr diff``, ``bzr log`` supports the ``-r`` argument::
472
473 % bzr log -r 1000.. # Revision 1000 and everything after it
474 % bzr log -r ..1000 # Everything up to and including r1000
475 % bzr log -r 1000..1100 # changes from 1000 to 1100
476 % bzr log -r 1000 # The changes in only revision 1000
477
478
479Branch statistics
480=================
481
482The ``bzr info`` command shows some summary information about the working
483tree and the branch history.
484
485
486Versioning directories
487======================
488
489bzr versions files and directories in a way that can keep track of renames
490and intelligently merge them::
491
492 % mkdir src
493 % echo 'int main() {}' > src/simple.c
494 % bzr add src
495 added src
496 added src/simple.c
497 % bzr status
498 added:
499 src/
500 src/simple.c
501
502
503Deleting and removing files
504===========================
505
506You can delete files or directories by just deleting them from the working
507directory. This is a bit different to CVS, which requires that you also
508do ``cvs remove``.
509
510``bzr remove`` makes the file un-versioned, but may or may not delete the
511working copy [2]_. This is useful when you add the wrong file, or decide that
512a file should actually not be versioned.
513
514::
515
516 % rm -r src
517 % bzr remove -v hello.txt
518 ? hello.txt
519 % bzr status
520 removed:
521 hello.txt
522 src/
523 src/simple.c
524 unknown:
525 hello.txt
526
527If you remove the wrong file by accident, you can use ``bzr revert`` to
528restore it.
529
530
531Branching
532=========
533
534Often rather than starting your own project, you will want to submit a
535change to an existing project. To do this, you'll need to get a copy of
536the existing branch. Because this new copy is potentially a new branch,
537the command is called **branch**::
538
539 % bzr branch lp:bzr bzr.dev
540 % cd bzr.dev
541
542This copies down the complete history of this branch, so we can do all
543operations on it locally: log, annotate, making and merging branches.
544There will be an option to get only part of the history if you wish.
545
546You can also get a copy of an existing branch by copying its directory,
547expanding a tarball, or by a remote copy using something like rsync.
548
549Following upstream changes
550==========================
551
552You can stay up-to-date with the parent branch by "pulling" in their
553changes::
554
555 % bzr pull
556
557After this change, the local directory will be a mirror of the source. This
558includes the ''revision-history'' - which is a list of the commits done in
559this branch, rather than merged from other branches.
560
561This command only works if your local (destination) branch is either an
562older copy of the parent branch with no new commits of its own, or if the
563most recent commit in your local branch has been merged into the parent
564branch.
565
566Merging from related branches
567=============================
568
569If two branches have diverged (both have unique changes) then ``bzr
570merge`` is the appropriate command to use. Merge will automatically
571calculate the changes that exist in the branch you're merging from that
572are not in your branch and attempt to apply them in your branch.
573
574::
575
576 % bzr merge URL
577
578
579If there is a conflict during a merge, 3 files with the same basename
580are created. The filename of the common base is appended with ".BASE",
581the filename of the file containing your changes is appended with
582".THIS" and the filename with the changes from the other tree is
583appended with ".OTHER". Using a program such as kdiff3, you can now
584comfortably merge them into one file. In order to commit you have to
585rename the merged file (".THIS") to the original file name. To
586complete the conflict resolution you must use the resolve command,
587which will remove the ".OTHER" and ".BASE" files. As long as there
588exist files with .BASE, .THIS or .OTHER the commit command will
589report an error.
590
591::
592
593 % kdiff3 file.BASE file.OTHER file.THIS
594 % mv file.THIS file
595 % bzr resolve file
596
597[**TODO**: explain conflict markers within files]
598
599
600Publishing your branch
601======================
602
603You don't need a special server to publish a bzr branch, just a normal web
604server. Just mirror the files to your server, including the .bzr
605directory. One can push a branch (or the changes for a branch) by one of
606the following three methods:
607
608* The best method is to use bzr itself to do it.
609
610 ::
611
612 % bzr push bzr+ssh://servername.com/path/to/directory
613
614 (The destination directory must already exist unless the
615 ``--create-prefix`` option is used.)
616
617* Another option is the ``rspush`` plugin that comes with BzrTools, which
618 uses rsync to push the changes to the revision history and the working
619 tree.
620
621* You can also copy the files around manually, by sending a tarball, or using
622 rsync, or other related file transfer methods. This is usually less safe
623 than using ``push``, but may be faster or easier in some situations.
624
625
626Moving changes between trees
627============================
628
629It happens to the best of us: sometimes you'll make changes in the wrong
630tree. Maybe because you've accidentally started work in the wrong directory,
631maybe because as you're working, the change turns out to be bigger than you
632expected, so you start a new branch for it.
633
634To move your changes from one tree to another, use
635
636::
637
638 % cd NEWDIR
639 % bzr merge --uncommitted OLDDIR
640
641This will apply all of the uncommitted changes you made in OLDDIR to NEWDIR.
642It will not apply committed changes, even if they could be applied to NEWDIR
643with a regular merge. The changes will remain in OLDDIR, but you can use ``bzr
644revert OLDDIR`` to remove them, once you're satisfied with NEWDIR.
645
646NEWDIR does not have to be a copy of OLDDIR, but they should be related.
647The more different they are, the greater the chance of conflicts.
0648
=== added file 'doc/ch/tutorials/using_bazaar_with_launchpad.txt'
--- doc/ch/tutorials/using_bazaar_with_launchpad.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/tutorials/using_bazaar_with_launchpad.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,323 @@
1===========================
2Bazaar和Launchpad结合使用
3===========================
4
5
6动机
7==========
8
9社区不同于团队
10----------------------------------
11
12创建一个软件的初始版本所需的团队人数可能会是一个到几千人的大小差异。根据这个要求,涉及技术和管理的挑战都是巨大的。正如《Bazaar用户指南》所述,选择“正确”的流程和使用像Bazaar这样的支持匹配工作流的工具可以有极大的帮助。
13
14成功的软件需要的不仅仅是一个很大的团队,更需要一个健康的、积极的社区。这个团体通常远远大于团队,因为它包含了对该软件感兴趣的每个人:团队、用户、培训合作伙伴、支持合作伙伴还有第三方开发者等等。
15
16在自由软件领域,社区是很容易接受的。但社区的适用范围不仅如此,大多数成功的商业软件提供商在通过建设和管理社区使其主流产品更加成熟。
17
18就像伟大的团队,伟大的社区不仅仅只是存在。良好的政策和指导方针对培育正确的行为和参与者之间健康的关系是必要的。为了更深入研究这个主题,请看Karl Fogel的里程碑著作:
19`Producing Open Source Software <http://www.producingoss.com/>`_.
20
21
22协同开发环境的需要
23---------------------------------------------------
24
25一套智能的工具集对跟踪和管理社区信息和工作流程是很重要的。这些工具被称为协同开发环境(CDEs)。这些工具集通常是基于Web,并管理如公告,问题/错误,问题和答案,下载,文件和源代码等东西。一些CDEs的例子包括
26`Launchpad <https://launchpad.net>`_,
27`SourceForge <http://sourceforge.net>`_,
28`java.net <http://java.net>`_ 和
29`SAP Community Network <https://www.sdn.sap.com/irj/sdn>`_.
30
31
32利用相关社区来帮助社区工作
33-------------------------------------------------
34
35很多成功的产品都有数量庞大的下游依赖。换句话说,一个新的挑战与成功的处理其他社区,成功了解您的更改是如何影响他们的是一同出现的。这是大部分明显的项目,比如:
36
37* 软件语言, 比如 Python, PHP, Ruby, Java, Perl等等。
38* 编译工具, 比如 gcc, JDK等等。
39* (程序)库, 比如 zlib, openssl等等。
40* 框架, 比如 Zope, Ruby on Rails, Spring等等。
41
42然而,它同样适用于有附件的流行应用程序, 比如 Firefox, Thunderbird, OpenOffice.org, Drupal, Wordpress, Joomla等等。
43
44帮助社区跨社区的跟踪和管理问题及修复的工具是必需的。这些工具在两端都帮助人们:
45
46* 用户可以在终端报告问题, 比如在运行于操作系统Z上的应用程序y中x类型图片的绘制是断裂的。
47
48* 开发人员可以更好地体会到下游做出更改或修复的影响, 比如修复图像库的bug让10个操作系统上运行的5种应用软件的用户受益。
49
50人们在中间扮演 *连接点* 和沟通上下线的必要角色。在多数情况下,他们也可以为终端用户修复问题,以及提交补丁和修复建议到上游开发团队。随着时间的推移,以可持续的方式保持追踪所有问题不是简单的工作。
51
52
53Launchpad: 更多的开发,更少的阻碍
54------------------------------------------
55
56除了赞助 `Ubuntu <http://www.ubuntu.com>`_ 和 `Bazaar <http://bazaar.canonical.com>`_ 的开发, Canonical
57也支持 `Launchpad <https://launchpad.net/>`_ 作为一个免费的社区服务。 Launchpad是最好的CDEs之一,几个主要的原因是:
58
59* 它跟踪的东西之间的模块关系, 比如源代码分支可以联接到bug修复。
60
61* 除了管理历史信息外,它还通过提供如道路图,里程碑和蓝图等产品来支持未来发展计划和追踪。
62
63* 它提供翻译工具和打包服务,为想要加入社区的翻译员和测试员减少和摆脱障碍。
64
65* 它为不同社区就相关问题和蓝图一起工作提供了连接点。
66
67换句话说, Launchpad被设计的目的是帮助社区发展,并减少在社区内和社区间工作流程的摩擦。最后,这意味着在机械工作上花费更少的时间而在感兴趣的开发上花费更多的时间。
68
69
70Bazaar: Launchpad的VCS客户端
71------------------------------
72
73这个指导手册着重于如何把Bazaar和Launchpad结合起来使用,以及它们是如何互补的。重要的是:
74
751. Bazaar能够在没有Launchpad情况下使用
762. Launchpad能够在没有Bazaar情况下使用
77
78虽然如此设计,但把它们结合起来使用比单独使用要强大的多。
79
80
81使用Launchpad查找和浏览分支
82=============================================
83
84查找可用分支
85--------------------------
86
87尽管采纳分布式的版本控制有很多优势,但其中一个已消失的东西是包含所有可用分支的全能中心服务器。事实上,在分布式环境中,令人感兴趣的分支可以通过互联网上的位置长久的存在(或在内部网做那些事)。
88
89Launchpad通过提供分支的注册来填补这个空白。
90
91
92注册分支
93--------------------
94
95分支可以被上传到Launchpad,或简单的注册为在外部位置可用。分支也被赋予状态,比如 *New*, *Development*, *Mature* 或 *Abandoned*.
96
97注意:外部分支甚至可以被托管到传统的版本控制工具,如CVS 和 Subversion.这些系统中的代码会定期被审查和转换到Bazaar分支。为了最大限度的准确,把外部分支托管到Bazaar更加可取。
98
99
100浏览分支
101-----------------
102
103分支可以依照很多属性列出、过滤、分类出来。这些属性包括名字,注册人,作者,状态,年龄和最近更新时间。浏览分支功能的支持让查看东西变得很容易,比如这些东西:
104
105* 在哪里可以下载分支
106* 怎样上传更改
107* 每个分支最近的提交和更改
108* 给定版本的单个文件源代码
109
110
111在Lauchpad中使用Bazaar访问代码
112========================================
113
114获取项目代码
115------------------------------
116
117像Launchpad跟踪的数以千计的项目及其最新的代码,不管其是否由Bazaar,CVS 或Subversion管理,Bazaar用户都可以像这样简单的获取代码::
118
119 bzr branch lp:project-name
120
121`project-name` 是Launchpad项目ID。这里是几个例子::
122
123 bzr branch lp:inkscape
124 bzr branch lp:amarok
125 bzr branch lp:python
126 bzr branch lp:rails
127 bzr branch lp:java-gnome
128
129稍后您可以在本地用您最常用的编辑器或IDE浏览代码,并根据需要更改代码。
130
131如果一个项目已被注册了多个系列(比如开发系列和维护系列),获取给定系列的最新代码,用命令::
132
133 bzr branch lp:project-name/series
134
135发布更改
136-----------------------
137
138您已经修复了bug或给软件增添了您一直想要的新功能,现在是时候共享您的代码了。如前所述,Launchpad是免费的Bazaar代码托管服务,这样您就可以提交分支到Launchpad上,其他人也可以从这里获得您的代码。比如,假定您是一个相关团队的成员,登录到Launchpad::
139
140 bzr launchpad-login userid
141
142`userid` 是Launchpad账户的ID。然后您可以提交您的更改到团队分支::
143
144 bzr push lp:~team-name/project-name/branch-name
145
146然后其他人可以下载您的代码::
147
148 bzr branch lp:~team-name/project-name/branch-name
149
150
151个人分支
152-----------------
153
154即使您不是团队中的一员,Launchpad 也可以用来发布您的修改。在这种情况下,简单创建一个个人分支::
155
156 bzr push lp:~userid/project-name/branch-name
157
158然后其他人可以下载您的代码::
159
160 bzr branch lp:~userid/project-name/branch-name
161
162注意:即使发布到个人分支,把您分支的更改情况通知上游开发者是礼貌的,这样如果您的修改普遍适合所有用户并达到了项目的质量标准,他们可以从您的分支获取您的更改。
163
164
165打包源代码分支
166-----------------------
167
168当 `用Bazaar维护ubuntu包`_ 时,您可以在Launchpad上很容易地访问包的源代码分支。在当前(默认)系列,下载包的源代码分支::
169
170 bzr branch ubuntu:package
171
172*package* 是您想读取的ubuntu包名字。为了下载ubuntu特定系列的包分支(比如 Maverick 或 Lucid), 使用命令::
173
174 bzr branch ubuntu:maverick/package
175
176Ubuntu系列名也可以被缩写为它们的首字母。例如上述命令也可写为::
177
178 bzr branch ubuntu:m/package
179
180您也可以从Launchpad下载Debian系列的包源代码分支。下载这个默认系列::
181
182 bzr branch debianlp:package
183
184下载一个特定的系列::
185
186 bzr branch debianlp:lenny/package
187
188注意 ``debianlp:`` 只为Launchpad的包计划读取Debian源分支。
189
190.. _`用Bazaar维护ubuntu包`: https://wiki.ubuntu.com/DistributedDevelopment
191
192
193用Launchpad链接分支
194================================
195
196关联分支和bug
197-------------------------------
198
199在注册分支后,您可以将其关联到一个bug,这样对该bug有兴趣人能够跟踪和下载可用的补丁。
200
201这样做的步骤是:
202
2031. 在问题中导航到该bug
204
2052. 在 `Actions` 下选择 `Add branch`.
206
2073. 选择分支
208
2094. 可选地设置关联的状态。
210 *Fix In Progress* 是默认状态,但如果该分支已经解决了这个问题,您可能想把它设置成另一种状态,比如 *Fix Available* .
211
212如果您愿意,您可以为bug和分支的关联提供一些随意的注释。
213
214
215在Bazaar中提交时改变Launchpad的状态
216----------------------------------------------------------
217
218Bazaar和Launchpad一起工作可以为您减少一些状态处理。当您使用Bazaar提交时,可以使用--fixes选项::
219
220 bzr commit --fixes lp:1234 -m "..."
221
2221234 是 bug ID. 这会改变 bug-branch 关联的状态为 *Fix Available*.如果一次提交修复了多个问题, --fixes 选项被规定可以使用多次。
223
224对于这个特色,最好的事情之一就是提交时不需要Launchpad处于连接状态。 ``--fixes`` 选项通过储存数据来工作。对于这些数据,Launchpad会在推送该分支到它时进行检测或重新在线审阅。
225
226注意:Launchpad 不会暗中地关闭一个bug,只因为修复它后分支可用。对于这个有几点原因。第一,在大部分团队考虑修复它之前,分支通常需要融合到主干(主开发分支)。第二,许多团队在开发人员说明已修复bug后都有单独的程序来检测bug是否被修复。
227
228解释说明,Launchpad中的融合控制功能目前正在开发,并且一旦自动的改变bug状态为 *Fix Committed* 的功能实现,Launchpad的融合控制功能将会更适用。
229
230
231关联分支和蓝图
232-------------------------------------
233
234在注册分支后,您可以将其关联到蓝图,这样对该蓝图感兴趣的人能够追踪和测试开发中的功能。
235
236这样做的步骤是:
237
2381. 在问题中导航到该蓝图
239
2402. 在 `Actions` 下选择 `Link branch`.
241
2423. 选择分支
243
244如果您愿意,您可以为蓝图和分支的关联提供一些随意的注释。
245
246
247用Launchpad管理发布
248=================================
249
250集成更改
251-------------------
252
253一旦一个分支被开发和发布,在那些更改被集成进核心产品以及发布给最终用户之前,社区一般会进行一次严密的审查过程。几个涉及到的步骤可能包括:
254
255* 同事审查更改
256
257* 决定哪个版本包括这些更改。比如,下一个维护版本,下一个主版本或者它们二者兼有。
258
259* 运行功能回归测试
260
261* 基准测试以确保工作性能可接受
262
263* 包装成早期的版本来给最终用户测试
264
265* 文件更新。比如:发布目标版本的说明
266
267* 将用户界面和文档翻译成多种语言
268
269这一节暂时着重于Launchpad中的一些产品特征来帮助获得优质代码投入到产品中。与Bazaar的牢固集成是使其顺利达成目的的重要核心。
270
271注意:这里说明一下,有些产品功能还在开发中。如果您对其中的一个或更多的功能感兴趣,请考虑通过这个链接加入Launchpad的beta测试小组:
272https://help.launchpad.net/JoiningLaunchpadBetaTesters. 您可以较早的获得该功能并且在更广泛的推广之前提交反馈给开发人员。
273
274
275分支融合提议
276----------------------
277
278在导航到Launchpad的一个分支后,其中一个可用的操作是 *Propose for merging*. 这可以让您指定这些代码应该被融合到哪个分支。
279
280追踪哪些分支被提议融合代码行的信息,可以帮助发布经理在规定日期之前对还有什么需要完成或可以完成保持优势。利用这些信息,他们可以保证在任何必要的审查后分支被融合。在简单的情况下,发布经理可以手动融合分支。在更先进的的情况下,当分支达到正确的状态(比如 *Review completed* )时可以由机器人(如 `PQM`_ )自动融合。
281
282.. _PQM: https://launchpad.net/pqm
283
284
285代码审查跟踪
286--------------------
287
288在Launchpad中许多功能正在被开发,用来追踪状态,对话和代码的审查结果。预期这些功能会集成到分支融合提议和分支浏览功能中。
289
290
291个人包的存档库 (PPAs)
292--------------------------------
293
294PPAs帮助开发者和开发团队自定义构建用户早期测试和反馈的机制。换句话说,PPA允许开发者建立一个对这些更改有兴趣的测试者的社区。测试社区能够安装这些包,测试期间运行包,并且以后在他们的系统上完全删除包。
295
296更多的细节请看 https://help.launchpad.net/PPAQuickStart.
297
298
299翻译
300------------
301
302Launchpad的翻译模块被精心设计,来让任何人参与翻译应用软件为他们所知的语言变得很简单。翻译者不需考虑低层次的细节。
303
304Launchpad分别对项目的每个主要版本的翻译保持追踪,当其他人开始在正在开发的新版本上工作时,仍允许翻译人员继续改进稳定版本的翻译。通过项目分享资源让翻译速度降低了。来自包含750000翻译短语的软件库和19000个注册翻译师的社区的自动建议能够从根本上缩短翻译本地项目为多种语言所需的时间。
305
306
307总结
308=======
309
310我们加入的社区,不论在线还是不在线,都说了很多关于人员分类的东西。另一方面,您为您社区所选的工具,特别是CDE和版本控制工具,对社区成员怎样更容易地做出贡献有很大的影响。
311
312凭它们自己的功能,Launchpad 和 Bazaar是非常有用的工具。将它们一起使用时可以:
313
314* 帮助您的社区追踪主要的资源,比如源代码和文档
315* 减少登陆障碍来帮助社区成长
316* 帮助社区与其相关社区相互作用
317
318特别是,Launchpad对Bazaar分支来说是一个免费的代码托管服务。分支可以被在线浏览以及链接到bug和蓝图。当提交bug到Bazaar时bug-branch关联的状态可以被自动管理。进一步集成开发的目的是让 *好主意* 到 *最终用户手中的运行代码* 的这个过程流程化。
319
320如果您对Bazaar和Launchpad进一步集成有些看法反馈,请通过Bazaar邮箱联系我们:
321bazaar@lists.canonical.com.
322
323当Launchpad被设计成支持免费软件项目的免费服务时,Canonical公司可能会根据商业软件开发者的需求让Launchpad对其可用。如果您觉得Launchpad对管理您的社区有帮助,我们将很高兴收到您的来信。
0324
=== added directory 'doc/ch/user-guide'
=== added file 'doc/ch/user-guide/adv_merging.txt'
--- doc/ch/user-guide/adv_merging.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/user-guide/adv_merging.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,78 @@
1伪融合
2======
3
4cherrypicking
5-------------
6
7有时,有选择的融合分支中的修改是十分有用的,但不是针对所有修改。这种做法通常被称为 *cherrypicking* ,下面是些例子:
8
9* 有选择性的将修正从主开发分支移动到发行分支。
10
11* 有选择性的将改进从实验分支移动到特性分支。
12
13将分支 ``foo`` 修订版X的改动融合的命令是::
14
15 bzr merge -c X foo
16
17将改动融合到分支 ``foo`` 修订版X的命令是::
18
19 bzr merge -r X foo
20
21融合改动直到分支 ``foo`` 修订版X的命令是::
22
23 bzr merge -r X.. foo
24
25融合分支 ``foo`` 从修订版X到修订版Y的所有改动的命令是::
26
27 bzr merge -r X..Y foo
28
29像普通的融合一样,您必须明确的提交一个cherrypicks。在这样提交之前,您或许希望可以使用 ``bzr diff`` 来查看改动,然后运行您的测试套件(如果您有)。
30
31与普通的融合不同,Bazaar目前无法追踪cherrypicks。特别是,改动看起来像是一个正常的提交,修订版的历史修改记录已经丢失。在许多情况下,他们都是有用的(见上文),这不是主要的问题因为一次完全的融合是无法在短时间内完成的。在其他情况下,当改动再一次融合时将会有更多的冲突需要解决。
32
33无父母融合
34----------
35
36这是一种和cherrypicks相关的技术,它使得改动和修订版无关,因为这些改动只是为了融合,并且改动在提交前忽略了它们的父母修订版。这使得所有的改动在融合时只会出现一次提交,在融合后提交前,你可以执行::
37
38 bzr revert --forget-merges
39
40来保证这些改动还是属于该工程树,但是改动的修订记录已经被移除了。下次提交将记录所有这些没有了融合修订版记录的改动。
41
42对一些用户来说,消除历史记录正符合他们的意愿,但你必须小心,损失的历史记录不能超过清除的价值,特别是要考虑到Bazaar对于逐步融合修订的能力。要注意,因为这将包括来自源分支但没有归属的分支,它可能导致在包含相同源和目标分支的融合时产生新的冲突。
43
44反向cherrypicking
45-----------------
46
47Cherrypicking可以用来反向一组 *低于* 下界的修订范围上界的变更。例如,在修订版次10撤销更改的命令::
48
49 bzr merge -r 10..9
50
51如果你从别的地方想得到大多数的改动(并非所有),你不妨在一个正常的融合之后做少量反cherrypicks。
52
53
54无提交改动融合
55--------------
56
57如果你有多个分支,而您不慎改动错了,在这里要采取这样的步骤来修正此问题。假设你开始在 ``foo`` 工作分支,但你其实是想进入 ``bar`` 工作分支::
581. 改变分支到 ``bar``.
592. 执行 ``bzr merge --uncommitted foo``
603. 检查所有的改动通过 (``bzr diff``)
614. 改变分支到 ``foo``
625. 执行 ``bzr revert``.
63
64.. TODO Selective file merging?
65
66
67Rebasing
68--------
69
70对于普通融合的另一种选择就是 *rebasing* ,即起源与当前分支但是是从另一个角度来看待一样。Rebasing是通过由 ``rebase`` 插件提供的 ``rebase`` 命令来在bazaar中使用的的。
71
72``rebase`` 命令将在当前工作目录的分支将重订基期的另一分支上的位置。如果分支没有指定,那么使用将使用父分支,而这通常是所期望的结果。
73
74首先要确定修订版在当前分支而不是在父分支。然后当前分支与目标分支要保持修订版一致,并且每个修订版要在分支最上层。在该过程结束时看起来就好像你目前的分支关闭了当前最后修订的目标。
75
76每个修订版的重置都可能会导致冲突。如果冲突发生了,命令将会停止工作,这是需要你去修复它们。就好像提交时出现冲突需要 ``merge(融合)`` ,然后运行 ``bzr resolve`` 来标记它们已经被解决。一旦你解决了所有冲突,执行bzr ``bzr rebase-continue`` 来继续rebase操作。如果遇到冲突而你不想继续下去,可以执行 ``bzr rebase-abort`` ,你也可以使用 ``rebase-todo`` 来现实仍需要被重置的提交列表。
77
78注意:一些用户来自融合较弱的中心VCS工具追踪起来像更新,因为它类似于旧工具的使用,或者因为“完全清除”的历史看上去很重要。在Bazaar更新前,想想是否一个常规融合才是更好的选择。特别是,在共享成功但更新后来的一个分支共享时有人不提倡前更新一个私有分支。
079
=== added file 'doc/ch/user-guide/annotating_changes.txt'
--- doc/ch/user-guide/annotating_changes.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/user-guide/annotating_changes.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,28 @@
1注释更改
2==================
3
4查看原始内容
5----------------------------
6
7当两个或两个以上的人处理同一文件时,看到谁创建这个文件或者谁最后一次对文件进行了修改,有时是非常有用的。
8因此,可以像这样使用注解命令::
9
10 bzr annotate readme.txt
11
12如果您是一个悲观主义者或乐观主义者,您可能更喜欢使用一个内置的别名,比如 ``annotate`` : ``blame`` 或者 ``praise`` 。
13无论哪种方式,文件的每一行连同信息一起像这样显示:
14
15 * 谁进行了最后一次修改
16 * 在什么时候进行的最后一次修改
17 * 提交信息。
18
19GUI 工具
20---------
21
22Bazaar的各种GUI插件提供图形化的工具来查看注释信息。
23例如,bzr-gtk插件提供了一个GUI工具,可以使用 ``gannotate`` 命令启动这个工具::
24
25 bzr gannotate readme.txt
26
27GUI工具通常提供了更为丰富有趣的信息显示(例如,每次提交所有的变化),所以与基于文本的命令相比,您可能更喜欢图形化工具。
28
029
=== added file 'doc/ch/user-guide/bazaar_workflows.txt'
--- doc/ch/user-guide/bazaar_workflows.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/user-guide/bazaar_workflows.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,122 @@
1工作流
2=========
3
4Bazaar只是一个工具
5---------------------
6
7Bazaar支持多种方法来组织工作,也就是说您可以以一个工作流开始,并且随着时间的推移和环境的改变而去不断改写它,永远都不会有一个万能的方法总是能够起作用。这一节概要地讲述了Bazaar支持的几种流行的工作流。
8
9记住这几种工作模式只是Bazaar使用的几个范例而已,也许您想用的工作流没有列在这里,但是以下的思想却是有用的。
10
11单机模式
12----
13
14无论是开发软件、编辑文档还是改变配置文件,一个好用的VCS总是能够帮上忙。一个单独的用户可以使用这种模式来有效地管理只由他个人维护的项目。
15
16.. image:: images/workflows_single.png
17
18这种工作流相对于不进行版本控制最大的优势包括:
19
20 * 备份老版本
21 * 回滚至上一个状态
22 * 可追踪历史
23
24而Bazaar这种工作流最关键的特征则是易用和无需管理。
25
26
27伙伴模式
28-------
29
30有时两个人需要一起工作并且共享他们所做的更改,这通常以单机模式(上一节)或者团队导向模式(下一节)为开始。在有些情况下,第二个人需要拷贝第一个人所做的一个分支(包括历史记录),继而两人可以共同工作并且在适当时候进行交互来融合他们的工作。
31
32.. image:: images/workflows_peer.png
33
34相对于单机模式的优势:
35
36 * 更容易地共享更新
37 * 每个文件的每条支线可以定义特定更新(包括作者、时间和原因)的属性
38
39实施这种工作模式时,Bazaar相对于CVS和Subversion的优势有:
40
41 * 不需要设置服务器
42 * 智能融合,多次融合变得不再费力
43
44
45中心模式
46-----------
47
48也被称为“锁定步骤”模式,本质上与CVS和Subversion所推荐和强制使用的工作模式是一样的。所有的开发者都在同一个分支上工作,他们使用bzr update命令来获得他们最新的版本,然后用bzr commit命令将他们所做的更新发布到中心服务器上去。
49
50.. image:: images/workflows_centralized.png
51
52若是实施这种工作模式,易用的CVS和Subversion也是不错的选择。Bazaar也直接支持这种模式,相较于CVS和Subversion的重大优势是:
53
54 * 更好地对分支和融合的支持
55 * 更好地重命名的支持
56
57
58带本地提交的中心模式
59------------------------------
60
61除了当开发者在做了一系列更新之后会使用commit -local命令或者解除他们的校验,这种模式本质上与中心模式是相同的。当全部更新完成之后,他们会把更新提交到共享主分支上去。
62
63.. image:: images/workflows_localcommit.png
64
65相较于中心模式的优势:
66
67 * 可以离线工作,比如旅行中
68 * 减小一个错误提交对他人工作影响的可能性
69
70CVS和Subversion都是不支持这种模式的。其他的一些分布式VCS可以支持这种工作模式,但是和bazaar相比流程要复杂一些。
71
72
73共享主分支的分布模式
74----------------------------------
75
76在这种工作流程下,每一个工作者都有他自己的分支和对主分支的提交权。他们在自己的个人分支上做工作,当完成后再将其添加到主分支之中。
77
78.. image:: images/workflows_shared.png
79
80相较于带本地提交的中心模式的优势:
81
82 * 更容易组织工作 - 每个分支可以进行独立开发
83 * 当需要时开发者可以融合另一个人的工作
84
85CVS和Subversion都是不支持这种工作模式的,而其他的分布式VCS是支持的。Bazaar的许多特性对这种模式效果良好,比如易用、共享仓库、完美融合和丰富元数据(包括目录重命名的监测)。
86
87人工审核的分布模式
88-----------------------------------
89
90在这种工作流下,每一个工作者都有他自己的分支和对主分支的只读权。特定的某个开发者(也就是审核员)有对主分支的提交权。当开发者想提交他的工作成果时,他需要审核员来进行提交。审核员对代码进行复查,在代码达到了必要条件之后将其提交到主分支上。
91
92.. image:: images/workflows_gatekeeper.png
93
94相较于共享主分支的分布模式的优势:
95
96 * 加入到主分支的代码已经复查过了
97 * 控制更新加入到主分支更加轻松
98
99Bazaar的一个伙伴工具,Bundle Buggy在追踪复查的修改以及它们的情况、复查员的意见上有十分大的帮助。
100
101
102自动审核的分布模式
103---------------------------------------
104
105在这种工作模式下,每一个工作者都有他自己的分支和对主分支的只读权。而审核软件有对主分支的提交权。当某个开发者想提交代码时,他可以找另一个人来复查。复查通过之后,原作者或者复查员(这由团队规定决定)可以寻求审核软件将其提交到主分支上。审核软件会接受提交、编译并运行监测套件。当且仅当代码通过测试后它才能被提交到主分支上。
106
107注:也可以选择不进行复查由作者直接向审核软件提交。(这仅适用于“成对编程”(Pair Programming)这种即编即查的开发过程,这种情况可以有效避免错误,而且不需要进行单独的复查)。
108
109.. image:: images/workflows_pqm.png
110
111相较于人工审核的分布模式的优势:
112
113 * 代码在提交到主分支之前已经被测试(这样主分支有更强的健全性)
114 * 使团队成长更平稳
115
116Bazaar的伙伴工具Patch Queue Manager (PQM)能够提供自动审核功能。
117
118
119执行一个模式
120-----------------------
121
122对于深入的了解和使用某种模式,请参看本手册的第3-6章。然而,首先来说,第二章讲解了一些重要的前提要素包括Bazaar的安装、常用指令和编译步骤。
0123
=== added file 'doc/ch/user-guide/branching_a_project.txt'
--- doc/ch/user-guide/branching_a_project.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/user-guide/branching_a_project.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,80 @@
1分支项目
2========
3
4分支的网址
5----------
6
7在别人能够得到一份您的工作之前,您需要同意转让技术。
8您可能会决定让您的顶层目录分支进行网络共享,这是Windows用户熟悉的方法。
9Unix用户可能更喜欢通过SSH访问,内置的SSH服务器的安全协议。
10Bazaar在支持协议方面是 *非常* 灵活的,下面给出了其中一些支持的协议。
11
12 =========== ======================================================
13 前缀 描述
14 =========== ======================================================
15 \file:// 使用标准的文件系统访问(默认)。
16 \bzr+ssh:/ 通过SSH进行访问(最佳远程选项)。
17 \sftp:// 使用SFTP访问(大多数SSH服务器提供了SFTP)。
18 \bzr:// 使用Bazaar智能服务器快速访问。
19 \ftp:// 使用被动FTP访问。
20 \http:// 访问通过web服务器输出的分支。
21 \https:// 加密访问web服务器输出的分支。
22 =========== ======================================================
23
24如上所示,通过URL前缀指定的传输协议来识别分支。
25如果没有指定前缀,指定默认文件名。
26支持协议的完整列表,请参阅 ``urlspec`` 在线帮助主题或者 `URL标识符 <http://doc.bazaar.canonical.com/bzr.dev/en/user-reference/index.html#url-identifiers>`_ bazaar用户参考部分。
27
28URL通常是相对于服务器的根目录,所以 ``ftp://example.com/repo/foo`` 是指该主机的 ``/repo/foo`` 目录。(我们说 '通常' ,因为一些像Apache这样的服务器软件,通过配置可以重新映射到任意的URL,在这种情况下,您需要查看服务器配置,以找出哪些URL对应这目录。)
29
30为了解决在服务器上相对于您家目录(home目录)的路径,使用波浪线,如: ``bzr+ssh://example.com/~/public_html`` 将映射到您家目录下的 ``public_html`` 。
31
32.. note:: 通过HTTP或HTTPS访问,默认情况下是只读的。
33 参见 `Pushing over the HTTP smart server(推动基于HTTP的智能服务器) <http_smart_server.html#pushing-over-the-http-smart-server>`_ 配置的读写访问的详细信息。
34
35关于共享存储库的提醒
36-------------------
37
38在获得一个分支的拷贝之前,首先需要考虑把它放在文件系统的哪个位置。
39最高的存储效率下降的轨道,建议分支被创建一个目录下的某个地方,并将此目录设置为共享的存储库。(参见 `分支特征 <organizing_your_workspace.html#feature-branches>`_ 在 `组织您的工作区 <organizing_your_workspace.html>`_ 中,一个常用的布局。)例如::
40
41 bzr init-repo my-repo
42 cd my-repo
43
44现在您已经准备好从别人那里抢一个分支并hack away。
45
46branch 命令
47-----------
48
49基于已经存在的分支获得一个分支, 使用 ``branch`` 命令.语法是::
50
51 bzr branch URL [目录]
52
53如果目录没有给出,基于URL的最后一部分创建一个目录。这里有一些例子分别显示一个驱动限定路径(M:/)和一个SFTP URL::
54
55 bzr branch M:/cool-trunk
56 bzr branch sftp://bill@mary-laptop/cool-repo/cool-trunk
57
58这个例子明显的展示了新分支使用目录名::
59
60 bzr branch /home/mary/cool-repo/cool-trunk cool
61
62时间和空间的考虑
63---------------
64
65根据分支转移的大小,速度和您的计算机和源分支网络之间的延迟,首次转移可能需要一些时间。由于只传输分支间的改变,后续更新应该更快。
66
67请记住,Bazaar转移分支的完整历史记录,而不仅仅是最新的快照。因此,您可以在 ``分支`` 完成后关闭网络(或从网络共享断开),但您仍然能够尽可能多的获得 ``日志`` 和 ``diff`` 的分支历史。此外,这些操作作为历史快速存储在本地。
68
69需要注意的是,bazzr使用智能压缩技术,以尽量减少所需的磁盘空间来存储版本历史。在许多情况下,一个项目的完整历史记录将比最新版本的工作副本占用较少的磁盘空间。
70
71正如在后面的章节中,Bazaar也有支持一个分支的 `lightweight checkouts(轻量级checkouts) <using_checkouts.html#getting-a-lightweight-checkout>`_ 即没有存储本地历史的工作树。当然,断开连接的用法是不可用的,但是如果本地磁盘空间很有限,这是一个折衷方案。支持有限回溯到历史 - *历史视野* - 是目前正在开发。
72
73查看分支信息
74------------
75
76如果您想看一个分支的信息,包括分支来自何处,使用 ``info`` 命令。例如::
77
78 bzr info cool
79
80如果没有分支,显示当前分支的信息。
081
=== added file 'doc/ch/user-guide/browsing_history.txt'
--- doc/ch/user-guide/browsing_history.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/user-guide/browsing_history.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,75 @@
1浏览历史记录
2================
3
4bzr log
5-------
6
7 ``bzr log`` 命令会展示一个先前版本的列表。
8
9 ``bzr diff``, ``bzr log`` 支持 ``-r`` 选项::
10
11 % bzr log -r 1000.. # Revision 1000 and everything after it
12 % bzr log -r ..1000 # Everything up to and including r1000
13 % bzr log -r 1000..1100 # changes from 1000 to 1100
14 % bzr log -r 1000 # The changes in only revision 1000
15
16查看融合版本
17------------
18
19作为分布式VCS工具例如Bazaar比集中式VCS工具更容易进行版本融合,一个分支的历史也许经常包含开发中的主线发展和以后的版本合并。技术上来说,众多修改节点之间的关系叫做DAG。
20
21在许多案例中,您当然想要先看主线然后再向下钻研。因此登录后默认直接展示主线并表明哪些修订被合并嵌套到修订里。为了审阅修订版里被合并的修订,使用如下命令::
22
23 bzr log -n0 -rX
24
25若想看所有的修订::
26
27 bzr log -n0
28
29注意:-n标志着显示等级,0代表所有。如果太乱,您可以容易的调整您所查看的数量。例如,如果您项目在团队审核员中的最高级的审核员, ``bzr log`` 展示最高级审核员做的事而 ``bzr log -n2`` 表示团队审核员做的事情。在多数案例中 ``-n0`` 即可。
30
31调整输出
32--------
33
34``log`` 命令有很多选项对输出有用。这些包括:
35
36 * ``--forward`` 表示登录按照时间排序,即:最新的修订最后显示。
37
38 * ``--limit`` 选项控制显示修订的最大数量。
39
40可以看在线帮助来了解log命令或用户参考来获得更多关于调整输出的命令。
41
42查看文件历史
43------------
44
45它对于过滤历史文件很有用,因此只能适用于一个指定的文件。为了达成目的需要我们为 ``log`` 命令像这样提供文件名::
46
47 bzr log foo.py
48
49查看老版本的文件
50---------------
51
52为了获得给定版本的文件内容可以这样使用 ``cat`` 命令::
53
54 bzr cat -r X file
55
56``X`` 是修订的标识符, ``file`` 是文件名。这些会把输出送入标准输出流所以您当然想到通过可观察的工具(像 ``less`` 或 ``more``)来输出或者像这样更改输出地址::
57
58 bzr cat -r -2 foo.py | less
59 bzr cat -r 1 foo.py > /tmp/foo-1st-version.py
60
61图形化历史记录视图
62-----------------
63
64历史浏览是GUI工具的一个便捷功能。Bazaar有很多插件提供了该功能,包括QBzr 和 bzr-gtk。如果您没有准备好安装这些插件,请看 `Using plugins(使用插件) <plugins.html>`_ 。
65
66用QBzr使用图形试图::
67
68 bzr qlog
69
70用bzr-gtk使用图形视图::
71
72 bzr viz
73
74``viz`` 事实上是 ``visualize`` 的简写,如果您喜欢长命令您也可以用 ``visualize`` 。
75
076
=== added file 'doc/ch/user-guide/bug_trackers.txt'
--- doc/ch/user-guide/bug_trackers.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/user-guide/bug_trackers.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,34 @@
1Bug跟踪器
2============
3
4Bazaar有设备,让您能在项目的bug跟踪器中把提交和bug关联起来。其他工具(或hooks)能用这些信息生成bug和提交之间的超链接,或者在包含该提交的分支中自动标记bug为结束状态。
5
6关联提交和bug
7----------------------------
8
9当您做了一个提交,您可以用 ``commit`` 命令的 ``--fixes`` 选项将它和bug关联起来。例如::
10
11 $ bzr commit --fixes lp:12345 -m "Properly close the connection"
12
13这将在Bazaar中记录连接Launchpad中的bug 12345和该提交的相关数据。如果您用不同的bug跟踪器,它可以以它自己的跟踪器代码(而不是 ``lp`` )来代替使用。至于如何为Bugzilla,Trac,Roundup和其他bug/issue跟踪器配置这个功能,请参考Bazaar用户参考资料中的 `Bug跟踪器设置`_.
14
15.. _Bug跟踪器设置: http://doc.bazaar.canonical.com/bzr.dev/en/user-reference/index.html#bug-tracker-settings
16
17数据记录和bug跟踪器更新
18------------------------------------------
19
20在提交时记录bug修复的数据只是为完善bug跟踪器集成的一个特殊需求。因为Bazaar是分布式VCS,当提交时用户可能没联网,所以在这种时候访问bug跟踪器本身是不可能的。因此,建议安装一个hook,使得当提交更改到适合项目工作流程的中央位置时能够更新bug跟踪器。
21
22
23注意:当Launchpad扫描外部或托管的分支时,这第二个处理阶段就是Launchpad提供的集成的一部分。
24
25检查更正
26------------------
27
28关联修正和bug的方法有一些局限性。第一个就是只有在提交时关联才能被启用。这意味着如果您提交时忘记做关联操作或者bug是在您修复后才被记录,在以后您通常是不能返回和添加链接了。
29
30与此相关的是该关联是不可变的。如果bug被一个提交标记为已修复,但是该补丁又没有完全解决该bug,或者有一个更迟的回归,您不能返回和删除该链接。
31
32当然, ``bzr uncommit`` 命令常常被用来取消最近的提交,以此来确保再次提交的正确。这通常是为了纠正坏的提交信息,并且这也同样适用于改正最近提交的数据记录(例如,通过 ``--fixes`` 选项)。
33
34注意: ``uncommit`` 操作最好在发布错误的补丁之前使用。
035
=== added file 'doc/ch/user-guide/bzrtools_plugin.txt'
--- doc/ch/user-guide/bzrtools_plugin.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/user-guide/bzrtools_plugin.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,31 @@
1BzrTools
2========
3
4简介
5--------
6
7BzrTools是对Bazaar有帮助的增强功能的集合。
8至于安装说明,请看BzrTools的主页:
9http://wiki.bazaar.canonical.com/BzrTools.
10这里是BzrTools提供的常用命令的一个示例。
11
12
13shell
14-----
15
16``bzr shell`` 启动命令解释器来理解Bazaar本身的命令。这样就有几个优势:
17
18 * 不需要在每个命令的前面打印 ``bzr``.
19
20 * 提供自动补全功能。
21
22 * 由于不需要每次都加载Bazaar的命令库,因此执行命令稍微快一些。
23
24
25cdiff
26-----
27
28``bzr cdiff`` 提供的是 ``bzr diff`` 命令输出的有色版本。
29在GNU/Linux, UNIX和OS X上, 这个命令经常被这样使用::
30
31 bzr cdiff | less -R
032
=== added file 'doc/ch/user-guide/central_intro.txt'
--- doc/ch/user-guide/central_intro.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/user-guide/central_intro.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,20 @@
1集中式开发
2=======================
3
4动机
5----------
6
7而不是并行工作和偶尔合并,它可以用在工作步调一致的时候,即多个人连续提交变更到一个中心位置,每次提交前根据最新内容合并他们的工作。
8
9对像Subversion和CVS等中央VCS工具的用户来说,这个工作流程是非常熟悉的。它同样适用于一个人在多个机器上工作的开发人员,例如有的开发通常在桌面计算机上工作,有可能带笔记本电脑去旅行,或者有人在工作时间外用他们的家庭计算机(连接互联网)来完成办公工作。
10
11如果集中式开发已经使您的团队工作得很好,非常棒。很多团队以这种方式使用Bazaar,然后用实验替代工作流程。
12
13集中式工作流程
14--------------------
15
16下面的图表提供了一个 *集中式工作流程* 的概述。
17
18.. image:: images/workflows_centralized.png
19
20即使您的团队计划使用更多的分布式工作流,本章中许多任务可能对您有用,尤其是如何发布分支。
021
=== added file 'doc/ch/user-guide/configuring_bazaar.txt'
--- doc/ch/user-guide/configuring_bazaar.txt 1970-01-01 00:00:00 +0000
+++ doc/ch/user-guide/configuring_bazaar.txt 2012-11-23 02:18:19 +0000
@@ -0,0 +1,147 @@
1配置Bazaar
2==========
3
4个人信息注册
5------------
6
7一个版本控制系统的最大作用就是可以追踪谁做了什么。在一个分布式系统中,这需要给每个作者一个全局唯一的身份识别信息。多部分人都有一个符合要求的东西:邮箱地址。Bazaar能够自动通过用户名和主机名来识别一个邮箱地址,如果您不喜欢Bazaar这个猜测的模式,您可以用 ``whoami`` 命令来设定您的身份识别信息::
8
9 % bzr whoami "Your Name <email@example.com>"
10
11如果 ``whoami`` 命令没有参数的话,会自动显示当前的用户信息。
12
13使用网络代理服务器
14-----------------
15
16如果您的网络要求您通过代理服务器与外界连接的话,您就必须要设置 ``http_proxy`` 变量。如果代理服务器也要求https连接的话,您还需要设置 ``http_proxy`` 变量。如果您需要这些而您又没有设置的话,您会发现您连接到Lauchpad或其他外部服务器时会失败或者超时。
17
18在Unix系服务器中您通常可以通过 ``/etc/environment`` 或者 ``~/.bash_profile`` 设置,而在Windows中这些都在用户配置文件中。
19
20::
21
22 http_proxy=http://proxy.example.com:3128/
23 https_proxy=http://proxy.example.com:3128/
24
25而 ``no_proxy`` 变量可以被设置成一系列由逗号隔开的主机名,这些主机应当是代理服务器所不能到达的。(浏览 <http://docs.python.org/library/urllib.html> 获取更多信息)
26
27多种配置方法
28------------
29
30就像上面所展示的,配置Bazaar的方法多种多样,但是它们也有共通的特性。一个选项包括:
31
32- 一个有效的Python标识符来作为名称,
33
34- 一个字符串作为值。在一些特殊的情况下,Bazaar能够将一些特殊的值,比如’True’、’False’识别为布尔型变量,但是一般来讲,作为一个用户,您应当永远指定一个字符串来作为值。
35
36为了保证某种环境中选项名是唯一的,选项名一般会按照不同的环境来分组。当需要的时候,可以通过在配置文件中记录选项以使它们能够长久的使用。
37
38
39配置文件
40--------
41
42Unix系OS中配置文件在目录 ``$HOME/.bazaar`` 下,Windows下则在 ``C:\Documents and Settings\<username>\Application Data\Bazaar\2.0`` 中。这些目录中有三个基本的配置文件:
43
44* ``bazaar.conf`` 描述了默认的配置选项,
45
46* ``locations.conf`` 描述了特定分支所在的配置信息,
47
48* ``authentication.conf`` 述了远程服务器的认证信息.
49
50每个分支还有一个设置了特定值的配置文件,即分支目录下的 ``.bzr/branch/branch.conf`` 文件,对 **这个分支下的所有用户** 都是可见的。如果您想将某个分支的值设置为您所需要的特定值,那么您可以在 ``locations.conf`` 中进行修改。
51
52以下是一个用 ``whoami`` 命令设定了某个邮箱地址后的 ``bazaar.conf`` 的示例内容::
53
54 [DEFAULT]
55 email = Your Name <email@example.com>
56
57如果您想深入地了解语法和能够支持的配置设置的话,可以参看Bazaar用户参考中的 `Configuration Settings <http://doc.bazaar.canonical.com/bzr.dev/en/user-reference/index.html#configuration-settings>`_ 。
58
59
60查看当前活动配置
61----------------
62
63要查看当前已定义的所有选项,您可以用以下命令::
64
65 bzr config
66
67``bzr`` 会执行一些规则来决定去哪里找配置选项所需的值。
68
69我们现在的策略是按以下顺序测试已存在的配置文件来找到匹配的定义。
70
71 * ``locations.conf`` 会被第一个搜索以找到名称能匹配当前地址的部分(工作树、分支或者是远程分支),
72
73 * 接下来是当前的 ``branch.conf`` ,
74
75 * 再接着是 ``bazaar.conf`` ,
76
77 * 最后,有一些值是在代码中定义的,不会出现在 ``bzr config`` 中 (具体参看 `Configuration Settings <http://doc.bazaar.canonical.com/bzr.dev/en/user-reference/index.html#configuration-settings>`_).
78
79不加参数使用 ```bzr config`` 命令可能更有利于理解, 您将会看到下面这些输出::
80
81 locations:
82 post_commit_to = commits@example.com
83 news_merge_files = NEWS
84 branch:
85 parent_location = bzr+ssh://bazaar.launchpad.net/+branch/bzr/
86 nickname = config-modify
87 push_location = bzr+ssh://bazaar.launchpad.net/~vila/bzr/config-modify/
88 bazaar:
89 debug_flags = hpss,
90
91每一个配置都与一个给定的范围联系,范围的名称会在一系列定义了的选项前给出。
92
93如果您需要更加具体的参数信息, 可以使用该命令::
94
95 bzr config <option>
96
97这样只会显示选项值,并且经常被用于脚本中。
98
99更改活动配置
100------------
101
102设置某一个选项为某值用如下命令::
103
104 bzr config opt=value
105
106一个选项值可以通过添加花括号来引用另一个选项值::
107
108 bzr config opt={other_opt}/subdir
109
110如果 ``other_opt``使用 ``'root``值, ``bzr config opt`` 将会输出以下内容::
111
112 root/subdir
113
114注意:当 ``--all`` 参数被使用时, 可以更好的反映配置文件的内容从而更容易的组织它们::
115
116 bzr config --all .*opt
117
118 bazaar:
119 [DEFAULT]
120 opt = {other_opt}/subdir
121 other_opt = root
122
123
124
125
126
127可以用以下命令来移除选项值::
128
129 bzr config --remove opt
130
131
The diff has been truncated for viewing.