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
1=== added directory 'doc/ch'
2=== added directory 'doc/ch/_static'
3=== added file 'doc/ch/_static/bzr icon 16.png'
4Binary 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
5=== added file 'doc/ch/_static/bzr.ico'
6Binary 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
7=== added directory 'doc/ch/_static/en'
8=== added file 'doc/ch/_static/en/Makefile'
9--- doc/ch/_static/en/Makefile 1970-01-01 00:00:00 +0000
10+++ doc/ch/_static/en/Makefile 2012-11-23 02:18:19 +0000
11@@ -0,0 +1,23 @@
12+# If you feel the need to duplicate this file, you'll win the right to refactor
13+# doc/*/quick-reference/Makefile and update TARGETS and OBJECTS usages in
14+# doc/Makefile
15+
16+TARGETS=bzr-en-quick-reference.png bzr-en-quick-reference.pdf
17+OBJECTS=bzr-en-quick-reference.svg Makefile
18+
19+all: $(TARGETS)
20+
21+.SUFFIXES: .svg .png .pdf
22+
23+.svg.pdf:
24+ rsvg-convert -d 300 -p 300 -f pdf -o $@ $<
25+
26+.svg.png:
27+ rsvg-convert -d 300 -p 300 -z 3.3346 -f png -o $@ $<
28+
29+bzr-en-quick-reference.png: $(OBJECTS)
30+
31+bzr-en-quick-reference.pdf: $(OBJECTS)
32+
33+clean:
34+ rm -f $(TARGETS)
35
36=== added file 'doc/ch/_static/en/bzr-en-quick-reference.pdf'
37Binary 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
38=== added file 'doc/ch/_static/en/bzr-en-quick-reference.png'
39Binary 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
40=== added file 'doc/ch/_static/en/bzr-en-quick-reference.svg'
41--- doc/ch/_static/en/bzr-en-quick-reference.svg 1970-01-01 00:00:00 +0000
42+++ doc/ch/_static/en/bzr-en-quick-reference.svg 2012-11-23 02:18:19 +0000
43@@ -0,0 +1,1598 @@
44+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
45+<!-- Created with Inkscape (http://www.inkscape.org/) -->
46+<svg
47+ xmlns:dc="http://purl.org/dc/elements/1.1/"
48+ xmlns:cc="http://creativecommons.org/ns#"
49+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
50+ xmlns:svg="http://www.w3.org/2000/svg"
51+ xmlns="http://www.w3.org/2000/svg"
52+ xmlns:xlink="http://www.w3.org/1999/xlink"
53+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
54+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
55+ width="1052.3622"
56+ height="744.09448"
57+ id="svg2766"
58+ sodipodi:version="0.32"
59+ inkscape:version="0.46"
60+ version="1.0"
61+ sodipodi:docbase="/home/ian/bzr/repo.packs/bzr.quick-start-tweaks/doc/en/quick-reference"
62+ sodipodi:docname="quick-start-summary.svg"
63+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
64+ inkscape:export-filename="/home/iacobs/work/pers/bzr-quickref.png"
65+ inkscape:export-xdpi="300"
66+ inkscape:export-ydpi="300">
67+ <defs
68+ id="defs2768">
69+ <linearGradient
70+ id="linearGradient3382">
71+ <stop
72+ style="stop-color:#2753b0;stop-opacity:1;"
73+ offset="0"
74+ id="stop3384" />
75+ <stop
76+ style="stop-color:#cecece;stop-opacity:1;"
77+ offset="1"
78+ id="stop3386" />
79+ </linearGradient>
80+ <linearGradient
81+ inkscape:collect="always"
82+ xlink:href="#linearGradient3382"
83+ id="linearGradient5465"
84+ x1="164.4165"
85+ y1="380.09448"
86+ x2="164.4165"
87+ y2="436.59479"
88+ gradientUnits="userSpaceOnUse" />
89+ <linearGradient
90+ inkscape:collect="always"
91+ xlink:href="#linearGradient3382"
92+ id="linearGradient5473"
93+ x1="164.4165"
94+ y1="380.09448"
95+ x2="164.4165"
96+ y2="436.59479"
97+ gradientUnits="userSpaceOnUse" />
98+ <linearGradient
99+ inkscape:collect="always"
100+ xlink:href="#linearGradient3382"
101+ id="linearGradient5603"
102+ gradientUnits="userSpaceOnUse"
103+ x1="150.39197"
104+ y1="104.09448"
105+ x2="151.10625"
106+ y2="155.92776"
107+ gradientTransform="translate(0,26)" />
108+ <linearGradient
109+ inkscape:collect="always"
110+ xlink:href="#linearGradient3382"
111+ id="linearGradient5605"
112+ gradientUnits="userSpaceOnUse"
113+ x1="165.19594"
114+ y1="104.09448"
115+ x2="165.19594"
116+ y2="156.84296"
117+ gradientTransform="translate(0,26)" />
118+ <linearGradient
119+ inkscape:collect="always"
120+ xlink:href="#linearGradient3382"
121+ id="linearGradient8641"
122+ x1="852.71942"
123+ y1="104.09448"
124+ x2="852.71942"
125+ y2="153.842"
126+ gradientUnits="userSpaceOnUse" />
127+ <linearGradient
128+ inkscape:collect="always"
129+ xlink:href="#linearGradient3382"
130+ id="linearGradient8649"
131+ x1="852.71942"
132+ y1="104.09448"
133+ x2="852.71942"
134+ y2="153.842"
135+ gradientUnits="userSpaceOnUse" />
136+ <linearGradient
137+ inkscape:collect="always"
138+ xlink:href="#linearGradient3382"
139+ id="linearGradient8696"
140+ x1="814.96497"
141+ y1="364.08444"
142+ x2="814.96497"
143+ y2="412.09879"
144+ gradientUnits="userSpaceOnUse" />
145+ <linearGradient
146+ inkscape:collect="always"
147+ xlink:href="#linearGradient3382"
148+ id="linearGradient8704"
149+ x1="814.96497"
150+ y1="364.08444"
151+ x2="814.96497"
152+ y2="412.09879"
153+ gradientUnits="userSpaceOnUse" />
154+ <linearGradient
155+ inkscape:collect="always"
156+ xlink:href="#linearGradient3382"
157+ id="linearGradient13456"
158+ gradientUnits="userSpaceOnUse"
159+ x1="401.62418"
160+ y1="104.09448"
161+ x2="402.0069"
162+ y2="152.69125" />
163+ <linearGradient
164+ inkscape:collect="always"
165+ xlink:href="#linearGradient3382"
166+ id="linearGradient13458"
167+ gradientUnits="userSpaceOnUse"
168+ x1="401.62418"
169+ y1="104.09448"
170+ x2="402.0069"
171+ y2="152.69125" />
172+ <linearGradient
173+ gradientTransform="matrix(1.027169,0,0,1,118.6039,77.1455)"
174+ gradientUnits="userSpaceOnUse"
175+ y2="0"
176+ x2="372.24512"
177+ y1="69.037941"
178+ x1="372.24512"
179+ id="linearGradient2200"
180+ xlink:href="#linearGradient5444"
181+ inkscape:collect="always" />
182+ <linearGradient
183+ id="linearGradient5444">
184+ <stop
185+ style="stop-color:#729fcf;stop-opacity:1;"
186+ offset="0"
187+ id="stop5446" />
188+ <stop
189+ id="stop4547"
190+ offset="0.5"
191+ style="stop-color:#3465a4;stop-opacity:1;" />
192+ <stop
193+ style="stop-color:#204ab7;stop-opacity:1;"
194+ offset="1"
195+ id="stop5448" />
196+ </linearGradient>
197+ <linearGradient
198+ inkscape:collect="always"
199+ xlink:href="#linearGradient5444"
200+ id="linearGradient3338"
201+ gradientUnits="userSpaceOnUse"
202+ gradientTransform="matrix(1.027169,0,0,1,417.31189,-41.4259)"
203+ x1="372.24512"
204+ y1="69.037941"
205+ x2="372.24512"
206+ y2="0" />
207+ <linearGradient
208+ inkscape:collect="always"
209+ xlink:href="#linearGradient3382"
210+ id="linearGradient2645"
211+ gradientUnits="userSpaceOnUse"
212+ x1="625.15149"
213+ y1="104.09448"
214+ x2="625.15149"
215+ y2="154.2104" />
216+ <linearGradient
217+ inkscape:collect="always"
218+ xlink:href="#linearGradient3382"
219+ id="linearGradient2647"
220+ gradientUnits="userSpaceOnUse"
221+ x1="625.15149"
222+ y1="104.09448"
223+ x2="625.15149"
224+ y2="154.2104" />
225+ </defs>
226+ <sodipodi:namedview
227+ id="base"
228+ pagecolor="#ffffff"
229+ bordercolor="#666666"
230+ borderopacity="1.0"
231+ gridtolerance="10000"
232+ guidetolerance="10"
233+ objecttolerance="10"
234+ inkscape:pageopacity="0.0"
235+ inkscape:pageshadow="2"
236+ inkscape:zoom="0.70710678"
237+ inkscape:cx="800.64614"
238+ inkscape:cy="357.97261"
239+ inkscape:document-units="px"
240+ inkscape:current-layer="g3488"
241+ width="1052.3622px"
242+ height="744.09449px"
243+ inkscape:showpageshadow="false"
244+ showgrid="false"
245+ inkscape:window-width="1280"
246+ inkscape:window-height="752"
247+ inkscape:window-x="0"
248+ inkscape:window-y="25" />
249+ <metadata
250+ id="metadata2771">
251+ <rdf:RDF>
252+ <cc:Work
253+ rdf:about="">
254+ <dc:format>image/svg+xml</dc:format>
255+ <dc:type
256+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
257+ <cc:license
258+ rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
259+ <dc:title>Bazaar-NG quick reference</dc:title>
260+ <dc:date>2007-07-23</dc:date>
261+ <dc:creator>
262+ <cc:Agent>
263+ <dc:title>Sabin Iacob</dc:title>
264+ </cc:Agent>
265+ </dc:creator>
266+ <dc:language>en</dc:language>
267+ <dc:subject>
268+ <rdf:Bag>
269+ <rdf:li>bzr</rdf:li>
270+ <rdf:li>bazaar</rdf:li>
271+ <rdf:li>reference</rdf:li>
272+ </rdf:Bag>
273+ </dc:subject>
274+ </cc:Work>
275+ <cc:License
276+ rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
277+ <cc:permits
278+ rdf:resource="http://web.resource.org/cc/Reproduction" />
279+ <cc:permits
280+ rdf:resource="http://web.resource.org/cc/Distribution" />
281+ <cc:requires
282+ rdf:resource="http://web.resource.org/cc/Notice" />
283+ <cc:permits
284+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
285+ <cc:requires
286+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
287+ <cc:requires
288+ rdf:resource="http://web.resource.org/cc/SourceCode" />
289+ </cc:License>
290+ </rdf:RDF>
291+ </metadata>
292+ <g
293+ inkscape:label="Layer 1"
294+ inkscape:groupmode="layer"
295+ id="layer1">
296+ <rect
297+ 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"
298+ id="rect2983"
299+ width="1052.1749"
300+ height="744"
301+ x="0"
302+ y="0.094482422"
303+ ry="0" />
304+ <g
305+ id="g3762">
306+ <g
307+ id="g8706">
308+ <rect
309+ 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"
310+ id="rect2190"
311+ width="228.60797"
312+ height="216.41451"
313+ x="50.891964"
314+ y="144.31995"
315+ ry="8.1168776" />
316+ <path
317+ 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"
318+ 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 "
319+ id="rect3430" />
320+ <text
321+ xml:space="preserve"
322+ 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"
323+ x="108.32876"
324+ y="150.97269"
325+ id="text3164"
326+ sodipodi:linespacing="100%"><tspan
327+ sodipodi:role="line"
328+ id="tspan3166"
329+ x="108.32876"
330+ y="150.97269">Initialization</tspan></text>
331+ </g>
332+ <g
333+ transform="translate(1e-4,-2.2095387)"
334+ id="g3209">
335+ <text
336+ xml:space="preserve"
337+ 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"
338+ x="63.794312"
339+ y="193.07361"
340+ id="text2167"
341+ sodipodi:linespacing="110%"><tspan
342+ sodipodi:role="line"
343+ x="63.794312"
344+ y="193.07361"
345+ id="tspan2171">bzr init myproject</tspan></text>
346+ <text
347+ xml:space="preserve"
348+ 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"
349+ x="58.209351"
350+ y="179.83536"
351+ id="text3168"
352+ sodipodi:linespacing="100%"><tspan
353+ sodipodi:role="line"
354+ id="tspan3170"
355+ x="58.209351"
356+ y="179.83536">New project</tspan></text>
357+ </g>
358+ <g
359+ transform="translate(1e-4,-1.1449276)"
360+ id="g3215">
361+ <text
362+ xml:space="preserve"
363+ 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"
364+ x="64.448624"
365+ y="226.45848"
366+ id="text2175"
367+ sodipodi:linespacing="110%"><tspan
368+ sodipodi:role="line"
369+ id="tspan2177"
370+ x="64.448624"
371+ y="226.45848">cd myproject</tspan><tspan
372+ sodipodi:role="line"
373+ x="64.448624"
374+ y="237.53181"
375+ id="tspan2179">bzr init</tspan><tspan
376+ sodipodi:role="line"
377+ x="64.448624"
378+ y="248.60515"
379+ id="tspan2181">bzr add .</tspan><tspan
380+ sodipodi:role="line"
381+ x="64.448624"
382+ y="259.67848"
383+ id="tspan2183" /></text>
384+ <text
385+ xml:space="preserve"
386+ 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"
387+ x="58.174194"
388+ y="213.22023"
389+ id="text3172"
390+ sodipodi:linespacing="100%"><tspan
391+ sodipodi:role="line"
392+ id="tspan3174"
393+ x="58.174194"
394+ y="213.22023">Existing project</tspan></text>
395+ </g>
396+ <g
397+ transform="translate(1e-4,5.3457864e-2)"
398+ id="g3224">
399+ <text
400+ xml:space="preserve"
401+ 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"
402+ x="64.448624"
403+ y="277.48495"
404+ id="text2185"
405+ sodipodi:linespacing="110%"><tspan
406+ sodipodi:role="line"
407+ id="tspan2187"
408+ x="64.448624"
409+ y="277.48495">bzr branch myproject newproject</tspan></text>
410+ <text
411+ xml:space="preserve"
412+ 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"
413+ x="58.209351"
414+ y="266.6666"
415+ id="text3176"
416+ sodipodi:linespacing="100%"><tspan
417+ sodipodi:role="line"
418+ id="tspan3178"
419+ x="58.209351"
420+ y="266.6666">New branch</tspan></text>
421+ </g>
422+ <g
423+ transform="translate(1e-4,1.1181147)"
424+ id="g3230">
425+ <text
426+ xml:space="preserve"
427+ 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"
428+ x="64.448624"
429+ y="308.44989"
430+ id="text3404"
431+ sodipodi:linespacing="110%"><tspan
432+ sodipodi:role="line"
433+ id="tspan3406"
434+ x="64.448624"
435+ y="308.44989">bzr checkout srcproject myproject</tspan></text>
436+ <text
437+ xml:space="preserve"
438+ 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"
439+ x="58.209351"
440+ y="297.63153"
441+ id="text3408"
442+ sodipodi:linespacing="100%"><tspan
443+ sodipodi:role="line"
444+ id="tspan3410"
445+ x="58.209351"
446+ y="297.63153">New checkout</tspan></text>
447+ </g>
448+ <g
449+ transform="translate(1e-4,2.1828937)"
450+ id="g3236">
451+ <text
452+ xml:space="preserve"
453+ 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"
454+ x="64.448624"
455+ y="341.88864"
456+ id="text3414"
457+ sodipodi:linespacing="110%"><tspan
458+ id="tspan3424"
459+ sodipodi:role="line"
460+ x="64.448624"
461+ y="341.88864">bzr checkout --lightweight \</tspan><tspan
462+ sodipodi:role="line"
463+ x="64.448624"
464+ y="352.96197"
465+ id="tspan2780"> srcproject myproject</tspan></text>
466+ <text
467+ xml:space="preserve"
468+ 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"
469+ x="58.209351"
470+ y="328.59634"
471+ id="text3418"
472+ sodipodi:linespacing="100%"><tspan
473+ id="tspan3422"
474+ sodipodi:role="line"
475+ x="58.209351"
476+ y="328.59634">New &quot;lightweight&quot; checkout</tspan></text>
477+ </g>
478+ </g>
479+ <g
480+ id="g3798">
481+ <g
482+ transform="translate(0,26)"
483+ id="g10801">
484+ <rect
485+ 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"
486+ id="rect3658"
487+ width="188.26918"
488+ height="135.69968"
489+ x="317.78247"
490+ y="119.55301"
491+ ry="9.6352606" />
492+ <path
493+ 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"
494+ 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 "
495+ id="rect3648" />
496+ <text
497+ xml:space="preserve"
498+ 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"
499+ x="333.44049"
500+ y="124.94995"
501+ id="text3563"
502+ sodipodi:linespacing="100%"><tspan
503+ sodipodi:role="line"
504+ id="tspan3565"
505+ x="333.44049"
506+ y="124.94995">File Manipulation</tspan></text>
507+ </g>
508+ <g
509+ transform="translate(1e-4,-1.9729054)"
510+ id="g3243">
511+ <text
512+ xml:space="preserve"
513+ 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"
514+ x="332.47345"
515+ y="191.36041"
516+ id="text3610"
517+ sodipodi:linespacing="110%"><tspan
518+ sodipodi:role="line"
519+ x="332.47345"
520+ y="191.36041"
521+ id="tspan3612">bzr add foo.py</tspan><tspan
522+ id="tspan3618"
523+ sodipodi:role="line"
524+ x="332.47345"
525+ y="202.43375">bzr add bar/</tspan></text>
526+ <text
527+ xml:space="preserve"
528+ 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"
529+ x="326.88849"
530+ y="179.59872"
531+ id="text3614"
532+ sodipodi:linespacing="110%"><tspan
533+ sodipodi:role="line"
534+ id="tspan3616"
535+ x="326.88849"
536+ y="179.59872">Add/&quot;version&quot; files</tspan></text>
537+ </g>
538+ <g
539+ transform="translate(1e-4,-0.9323495)"
540+ id="g3250">
541+ <text
542+ xml:space="preserve"
543+ 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"
544+ x="331.78732"
545+ y="233.11641"
546+ id="text3622"
547+ sodipodi:linespacing="110%"><tspan
548+ sodipodi:role="line"
549+ x="331.78732"
550+ y="233.11641"
551+ id="tspan3624">bzr remove --keep foo.py</tspan></text>
552+ <text
553+ xml:space="preserve"
554+ 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"
555+ x="326.20236"
556+ y="221.35472"
557+ id="text3626"
558+ sodipodi:linespacing="100%"><tspan
559+ sodipodi:role="line"
560+ id="tspan3628"
561+ x="326.20236"
562+ y="221.35472">Remove/&quot;unversion&quot; files</tspan></text>
563+ </g>
564+ <g
565+ transform="translate(1e-4,0.1322158)"
566+ id="g3256">
567+ <text
568+ xml:space="preserve"
569+ 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"
570+ x="331.81714"
571+ y="264.08142"
572+ id="text3632"
573+ sodipodi:linespacing="110%"><tspan
574+ sodipodi:role="line"
575+ x="331.81714"
576+ y="264.08142"
577+ id="tspan3634">bzr remove --no-backup foo.py</tspan></text>
578+ <text
579+ xml:space="preserve"
580+ 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"
581+ x="326.23218"
582+ y="253.26308"
583+ id="text3636"
584+ sodipodi:linespacing="100%"><tspan
585+ sodipodi:role="line"
586+ id="tspan3638"
587+ x="326.23218"
588+ y="253.26308">Remove and delete files</tspan></text>
589+ </g>
590+ </g>
591+ <g
592+ id="g3524">
593+ <g
594+ id="g8747">
595+ <rect
596+ 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"
597+ id="rect3780"
598+ width="229.94412"
599+ height="319.25848"
600+ x="49.444439"
601+ y="394.427"
602+ ry="9.9539938" />
603+ <path
604+ 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"
605+ 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 "
606+ id="path3784" />
607+ <text
608+ xml:space="preserve"
609+ 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"
610+ x="111.15869"
611+ y="400.96985"
612+ id="text3786"
613+ sodipodi:linespacing="100%"><tspan
614+ sodipodi:role="line"
615+ id="tspan3788"
616+ x="111.15869"
617+ y="400.96985">Information</tspan></text>
618+ </g>
619+ <g
620+ transform="translate(1e-4,0.4441055)"
621+ id="g3281">
622+ <text
623+ xml:space="preserve"
624+ 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"
625+ x="62.69976"
626+ y="441.34354"
627+ id="text3234"
628+ sodipodi:linespacing="110%"><tspan
629+ sodipodi:role="line"
630+ x="62.69976"
631+ y="441.34354"
632+ id="tspan3236">bzr status</tspan></text>
633+ <text
634+ xml:space="preserve"
635+ 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"
636+ x="57.114799"
637+ y="428.10529"
638+ id="text3238"
639+ sodipodi:linespacing="100%"><tspan
640+ sodipodi:role="line"
641+ id="tspan3240"
642+ x="57.114799"
643+ y="428.10529">Working tree status</tspan></text>
644+ </g>
645+ <g
646+ transform="translate(1e-4,1.4958392)"
647+ id="g3287">
648+ <text
649+ xml:space="preserve"
650+ 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"
651+ x="62.721241"
652+ y="472.84393"
653+ id="text3244"
654+ sodipodi:linespacing="110%"><tspan
655+ sodipodi:role="line"
656+ x="62.721241"
657+ y="472.84393"
658+ id="tspan3250">bzr log</tspan><tspan
659+ id="tspan3294"
660+ sodipodi:role="line"
661+ x="62.721241"
662+ y="483.91727">bzr log foo.py</tspan><tspan
663+ sodipodi:role="line"
664+ x="62.721241"
665+ y="494.9906"
666+ id="tspan3252" /></text>
667+ <text
668+ xml:space="preserve"
669+ 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"
670+ x="56.446827"
671+ y="459.55164"
672+ id="text3254"
673+ sodipodi:linespacing="100%"><tspan
674+ sodipodi:role="line"
675+ id="tspan3256"
676+ x="56.446827"
677+ y="459.55164">Revision log</tspan></text>
678+ </g>
679+ <g
680+ transform="translate(1e-4,2.6343158)"
681+ id="g3295">
682+ <text
683+ xml:space="preserve"
684+ 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"
685+ x="63.354061"
686+ y="517.29712"
687+ id="text3260"
688+ sodipodi:linespacing="110%"><tspan
689+ sodipodi:role="line"
690+ id="tspan3262"
691+ x="63.354061"
692+ y="517.29712">bzr diff</tspan></text>
693+ <text
694+ xml:space="preserve"
695+ 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"
696+ x="57.114803"
697+ y="504.05884"
698+ id="text3264"
699+ sodipodi:linespacing="100%"><tspan
700+ sodipodi:role="line"
701+ id="tspan3266"
702+ x="57.114803"
703+ y="504.05884">Working tree changes</tspan></text>
704+ </g>
705+ <g
706+ transform="translate(1e-4,5.8149666)"
707+ id="g3314">
708+ <text
709+ xml:space="preserve"
710+ 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"
711+ x="62.744678"
712+ y="625.09357"
713+ id="text3298"
714+ sodipodi:linespacing="110%"><tspan
715+ sodipodi:role="line"
716+ id="tspan3300"
717+ x="62.744678"
718+ y="625.09357">bzr missing</tspan></text>
719+ <text
720+ xml:space="preserve"
721+ 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"
722+ x="56.505421"
723+ y="611.85535"
724+ id="text3302"
725+ sodipodi:linespacing="100%"><tspan
726+ sodipodi:role="line"
727+ id="tspan3304"
728+ x="56.505421"
729+ y="611.85535">Missing revisions</tspan></text>
730+ </g>
731+ <g
732+ transform="translate(1e-4,7.9315687)"
733+ id="g3326">
734+ <text
735+ xml:space="preserve"
736+ 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"
737+ x="62.756401"
738+ y="687.57349"
739+ id="text3308"
740+ sodipodi:linespacing="110%"><tspan
741+ sodipodi:role="line"
742+ id="tspan3310"
743+ x="62.756401"
744+ y="687.57349">bzr cat -r3 foo.py</tspan></text>
745+ <text
746+ xml:space="preserve"
747+ 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"
748+ x="56.517143"
749+ y="674.33521"
750+ id="text3312"
751+ sodipodi:linespacing="100%"><tspan
752+ id="tspan3326"
753+ sodipodi:role="line"
754+ x="56.517143"
755+ y="674.33521">Contents of foo.py at revision 3</tspan></text>
756+ </g>
757+ <g
758+ transform="translate(1e-4,6.8799266)"
759+ id="g3320">
760+ <text
761+ xml:space="preserve"
762+ 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"
763+ x="62.686089"
764+ y="656.12701"
765+ id="text3318"
766+ sodipodi:linespacing="110%"><tspan
767+ sodipodi:role="line"
768+ id="tspan3320"
769+ x="62.686089"
770+ y="656.12701">bzr info</tspan></text>
771+ <text
772+ xml:space="preserve"
773+ 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"
774+ x="56.446831"
775+ y="645.30865"
776+ id="text3322"
777+ sodipodi:linespacing="100%"><tspan
778+ sodipodi:role="line"
779+ id="tspan3324"
780+ x="56.446831"
781+ y="645.30865">Branch information:</tspan></text>
782+ </g>
783+ <g
784+ transform="translate(1e-4,3.685897)"
785+ id="g3301">
786+ <text
787+ xml:space="preserve"
788+ 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"
789+ x="62.879452"
790+ y="548.74365"
791+ id="text3330"
792+ sodipodi:linespacing="110%"><tspan
793+ sodipodi:role="line"
794+ id="tspan3332"
795+ x="62.879452"
796+ y="548.74365">bzr diff foo.py</tspan></text>
797+ <text
798+ xml:space="preserve"
799+ 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"
800+ x="56.640194"
801+ y="535.50537"
802+ id="text3334"
803+ sodipodi:linespacing="100%"><tspan
804+ sodipodi:role="line"
805+ id="tspan3336"
806+ x="56.640194"
807+ y="535.50537">foo.py changes</tspan></text>
808+ </g>
809+ <g
810+ transform="translate(1e-4,4.7504623)"
811+ id="g3307">
812+ <text
813+ xml:space="preserve"
814+ 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"
815+ x="62.000679"
816+ y="591.70862"
817+ id="text3699"
818+ sodipodi:linespacing="110%"><tspan
819+ sodipodi:role="line"
820+ id="tspan3701"
821+ x="62.000679"
822+ y="591.70862">bzr diff -r1..3 foo.py</tspan></text>
823+ <text
824+ xml:space="preserve"
825+ 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"
826+ x="55.761421"
827+ y="568.89032"
828+ id="text3703"
829+ sodipodi:linespacing="100%"><tspan
830+ sodipodi:role="line"
831+ id="tspan3705"
832+ x="55.761421"
833+ y="568.89032">foo.py changes between </tspan><tspan
834+ id="tspan3707"
835+ sodipodi:role="line"
836+ x="55.761421"
837+ y="580.89032">revisions 1 and 3</tspan></text>
838+ </g>
839+ </g>
840+ <g
841+ id="g3821">
842+ <g
843+ transform="translate(0,26)"
844+ id="g10830">
845+ <rect
846+ 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"
847+ id="rect4132"
848+ width="188.26918"
849+ height="135.69968"
850+ x="544.34027"
851+ y="119.55301"
852+ ry="9.6352606" />
853+ <path
854+ 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"
855+ 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 "
856+ id="path4130" />
857+ <text
858+ xml:space="preserve"
859+ 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"
860+ x="569.3811"
861+ y="124.94995"
862+ id="text4134"
863+ sodipodi:linespacing="100%"><tspan
864+ sodipodi:role="line"
865+ id="tspan4136"
866+ x="569.3811"
867+ y="124.94995">Version Control</tspan></text>
868+ </g>
869+ <g
870+ transform="translate(1e-4,-2.4445851)"
871+ id="g3262">
872+ <text
873+ xml:space="preserve"
874+ 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"
875+ x="559.03162"
876+ y="190.88873"
877+ id="text4140"
878+ sodipodi:linespacing="110%"><tspan
879+ sodipodi:role="line"
880+ x="559.03162"
881+ y="190.88873"
882+ id="tspan4142">bzr commit foo.py -m &quot;foo&quot;</tspan><tspan
883+ id="tspan4144"
884+ sodipodi:role="line"
885+ x="559.03162"
886+ y="201.96207">bzr commit -m &quot;the rest&quot;</tspan></text>
887+ <text
888+ xml:space="preserve"
889+ 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"
890+ x="553.44666"
891+ y="180.0704"
892+ id="text4146"
893+ sodipodi:linespacing="100%"><tspan
894+ sodipodi:role="line"
895+ id="tspan4148"
896+ x="553.44666"
897+ y="180.0704">Commit</tspan></text>
898+ </g>
899+ <g
900+ transform="translate(1e-4,-2.6967609)"
901+ id="g3269">
902+ <text
903+ xml:space="preserve"
904+ 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"
905+ x="558.37482"
906+ y="232.2924"
907+ id="text4152"
908+ sodipodi:linespacing="110%"><tspan
909+ sodipodi:role="line"
910+ x="558.37482"
911+ y="232.2924"
912+ id="tspan4154">bzr uncommit</tspan></text>
913+ <text
914+ xml:space="preserve"
915+ 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"
916+ x="552.78986"
917+ y="221.47408"
918+ id="text4156"
919+ sodipodi:linespacing="100%"><tspan
920+ sodipodi:role="line"
921+ id="tspan4158"
922+ x="552.78986"
923+ y="221.47408">Undo last commit</tspan></text>
924+ </g>
925+ <g
926+ transform="translate(1e-4,-1.6451646)"
927+ id="g3275">
928+ <text
929+ xml:space="preserve"
930+ 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"
931+ x="558.37488"
932+ y="263.73889"
933+ id="text4162"
934+ sodipodi:linespacing="110%"><tspan
935+ sodipodi:role="line"
936+ x="558.37488"
937+ y="263.73889"
938+ id="tspan4164">bzr revert</tspan></text>
939+ <text
940+ xml:space="preserve"
941+ 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"
942+ x="552.78992"
943+ y="250.50064"
944+ id="text4166"
945+ sodipodi:linespacing="100%"><tspan
946+ sodipodi:role="line"
947+ id="tspan4168"
948+ x="552.78992"
949+ y="250.50064">Revert changes</tspan></text>
950+ </g>
951+ </g>
952+ <g
953+ id="g3844">
954+ <g
955+ transform="translate(0,26)"
956+ id="g10882">
957+ <rect
958+ 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"
959+ id="rect4232"
960+ width="228.60797"
961+ height="216.41451"
962+ x="770.89197"
963+ y="118.31993"
964+ ry="8.1168776" />
965+ <path
966+ 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"
967+ 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 "
968+ id="path4234" />
969+ <text
970+ xml:space="preserve"
971+ 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"
972+ x="847.87567"
973+ y="124.97269"
974+ id="text4236"
975+ sodipodi:linespacing="100%"><tspan
976+ sodipodi:role="line"
977+ id="tspan4238"
978+ x="847.87567"
979+ y="124.97269">Merging</tspan></text>
980+ </g>
981+ <g
982+ transform="translate(1e-4,-1.0888417)"
983+ id="g3392">
984+ <text
985+ xml:space="preserve"
986+ 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"
987+ x="783.75751"
988+ y="191.95291"
989+ id="text4242"
990+ sodipodi:linespacing="110%"><tspan
991+ sodipodi:role="line"
992+ x="783.75751"
993+ y="191.95291"
994+ id="tspan4244">cd myproject</tspan><tspan
995+ sodipodi:role="line"
996+ x="783.75751"
997+ y="203.02624"
998+ id="tspan4296">bzr merge ../myproject-foo</tspan><tspan
999+ sodipodi:role="line"
1000+ x="783.75751"
1001+ y="214.09958"
1002+ id="tspan4298">bzr commit</tspan></text>
1003+ <text
1004+ xml:space="preserve"
1005+ 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"
1006+ x="778.17255"
1007+ y="178.71466"
1008+ id="text4246"
1009+ sodipodi:linespacing="100%"><tspan
1010+ sodipodi:role="line"
1011+ id="tspan4248"
1012+ x="778.17255"
1013+ y="178.71466">Merge two branches</tspan></text>
1014+ </g>
1015+ <g
1016+ transform="translate(1e-4,0.1095133)"
1017+ id="g3384">
1018+ <text
1019+ xml:space="preserve"
1020+ 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"
1021+ x="784.44696"
1022+ y="245.39931"
1023+ id="text4252"
1024+ sodipodi:linespacing="110%"><tspan
1025+ sodipodi:role="line"
1026+ id="tspan4254"
1027+ x="784.44696"
1028+ y="245.39931">cd myproject-foo</tspan><tspan
1029+ sodipodi:role="line"
1030+ x="784.44696"
1031+ y="256.47264"
1032+ id="tspan4258">bzr pull ../myproject</tspan><tspan
1033+ sodipodi:role="line"
1034+ x="784.44696"
1035+ y="267.54597"
1036+ id="tspan4260" /></text>
1037+ <text
1038+ xml:space="preserve"
1039+ 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"
1040+ x="778.17255"
1041+ y="232.16106"
1042+ id="text4262"
1043+ sodipodi:linespacing="100%"><tspan
1044+ sodipodi:role="line"
1045+ id="tspan4264"
1046+ x="778.17255"
1047+ y="232.16106">Pull changes from myproject</tspan></text>
1048+ </g>
1049+ <g
1050+ transform="translate(1e-4,1.2474884)"
1051+ id="g3378">
1052+ <text
1053+ xml:space="preserve"
1054+ 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"
1055+ x="784.4118"
1056+ y="289.69043"
1057+ id="text4268"
1058+ sodipodi:linespacing="110%"><tspan
1059+ sodipodi:role="line"
1060+ id="tspan4270"
1061+ x="784.4118"
1062+ y="289.69043">bzr update</tspan></text>
1063+ <text
1064+ xml:space="preserve"
1065+ 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"
1066+ x="778.17255"
1067+ y="276.5459"
1068+ id="text4272"
1069+ sodipodi:linespacing="100%"><tspan
1070+ sodipodi:role="line"
1071+ id="tspan4274"
1072+ x="778.17255"
1073+ y="276.5459">Update a checkout</tspan></text>
1074+ </g>
1075+ <g
1076+ transform="translate(1e-4,2.3122978)"
1077+ id="g3372">
1078+ <text
1079+ xml:space="preserve"
1080+ 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"
1081+ x="785.45477"
1082+ y="320.70923"
1083+ id="text4278"
1084+ sodipodi:linespacing="110%"><tspan
1085+ sodipodi:role="line"
1086+ id="tspan4280"
1087+ x="785.45477"
1088+ y="320.70923">bzr resolve</tspan></text>
1089+ <text
1090+ xml:space="preserve"
1091+ 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"
1092+ x="779.21552"
1093+ y="309.83685"
1094+ id="text4282"
1095+ sodipodi:linespacing="100%"><tspan
1096+ sodipodi:role="line"
1097+ id="tspan4284"
1098+ x="779.21552"
1099+ y="309.83685">Auto-detect resolved conflicts</tspan></text>
1100+ </g>
1101+ <g
1102+ transform="translate(1e-4,3.3643062)"
1103+ id="g3366">
1104+ <text
1105+ xml:space="preserve"
1106+ 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"
1107+ x="784.65204"
1108+ y="352.20935"
1109+ id="text4288"
1110+ sodipodi:linespacing="110%"><tspan
1111+ id="tspan4290"
1112+ sodipodi:role="line"
1113+ x="784.65204"
1114+ y="352.20935">bzr resolve foo.py</tspan></text>
1115+ <text
1116+ xml:space="preserve"
1117+ 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"
1118+ x="778.41278"
1119+ y="338.91705"
1120+ id="text4292"
1121+ sodipodi:linespacing="100%"><tspan
1122+ id="tspan4294"
1123+ sodipodi:role="line"
1124+ x="778.41278"
1125+ y="338.91705">Specify resolved conflict</tspan></text>
1126+ </g>
1127+ </g>
1128+ <g
1129+ id="g3488">
1130+ <g
1131+ transform="translate(0,16.01004)"
1132+ id="g10924">
1133+ <rect
1134+ 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"
1135+ id="rect4531"
1136+ width="229.94412"
1137+ height="319.25848"
1138+ x="771.12964"
1139+ y="378.41696"
1140+ ry="9.9539938" />
1141+ <path
1142+ 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"
1143+ 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 "
1144+ id="path4533" />
1145+ <text
1146+ xml:space="preserve"
1147+ 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"
1148+ x="838.59387"
1149+ y="384.95981"
1150+ id="text4535"
1151+ sodipodi:linespacing="100%"><tspan
1152+ sodipodi:role="line"
1153+ id="tspan4537"
1154+ x="838.59387"
1155+ y="384.95981">Publishing</tspan></text>
1156+ </g>
1157+ <g
1158+ transform="translate(1e-4,-1.7634544)"
1159+ id="g3354">
1160+ <text
1161+ xml:space="preserve"
1162+ 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"
1163+ x="781.75745"
1164+ y="475.58072"
1165+ id="text4616"
1166+ sodipodi:linespacing="110%"><tspan
1167+ sodipodi:role="line"
1168+ x="781.75745"
1169+ y="475.58072"
1170+ id="tspan4618">bzr push sftp://host/myproject-fo1</tspan></text>
1171+ <text
1172+ xml:space="preserve"
1173+ 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"
1174+ x="776.17249"
1175+ y="462.34244"
1176+ id="text4620"
1177+ sodipodi:linespacing="100%"><tspan
1178+ sodipodi:role="line"
1179+ id="tspan4622"
1180+ x="776.17249"
1181+ y="462.34244">Push revisions remotely</tspan></text>
1182+ </g>
1183+ <g
1184+ transform="translate(1e-4,-1.1779953)"
1185+ id="g3360">
1186+ <text
1187+ xml:space="preserve"
1188+ 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"
1189+ x="782.38519"
1190+ y="440.54575"
1191+ id="text4457"
1192+ sodipodi:linespacing="110%"><tspan
1193+ sodipodi:role="line"
1194+ x="782.38519"
1195+ y="440.54575"
1196+ id="tspan4459">bzr push ../myproject-fo1</tspan></text>
1197+ <text
1198+ xml:space="preserve"
1199+ 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"
1200+ x="776.80023"
1201+ y="429.72739"
1202+ id="text4461"
1203+ sodipodi:linespacing="100%"><tspan
1204+ sodipodi:role="line"
1205+ id="tspan4463"
1206+ x="776.80023"
1207+ y="429.72739">Push revisions</tspan></text>
1208+ </g>
1209+ <g
1210+ transform="translate(1e-4,0.3362061)"
1211+ id="g3346">
1212+ <text
1213+ xml:space="preserve"
1214+ 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"
1215+ x="782.40674"
1216+ y="505.56467"
1217+ id="text4467"
1218+ sodipodi:linespacing="110%"><tspan
1219+ id="tspan8805"
1220+ sodipodi:role="line"
1221+ x="782.40674"
1222+ y="505.56467">bzr send</tspan><tspan
1223+ sodipodi:role="line"
1224+ x="782.40674"
1225+ y="516.638"
1226+ id="tspan4473" /></text>
1227+ <text
1228+ xml:space="preserve"
1229+ 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"
1230+ x="776.13232"
1231+ y="494.69229"
1232+ id="text4475"
1233+ sodipodi:linespacing="100%"><tspan
1234+ id="tspan4608"
1235+ sodipodi:role="line"
1236+ x="776.13232"
1237+ y="494.69229">Email a merge directive</tspan></text>
1238+ </g>
1239+ <g
1240+ transform="translate(1e-4,31.004958)"
1241+ id="g3339">
1242+ <text
1243+ xml:space="preserve"
1244+ 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"
1245+ x="783.03955"
1246+ y="562.4187"
1247+ id="text4481"
1248+ sodipodi:linespacing="110%"><tspan
1249+ sodipodi:role="line"
1250+ id="tspan4483"
1251+ x="783.03955"
1252+ y="562.4187">bzr export ../myproject-dist/</tspan></text>
1253+ <text
1254+ xml:space="preserve"
1255+ 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"
1256+ x="776.80029"
1257+ y="537.18048"
1258+ id="text4485"
1259+ sodipodi:linespacing="100%"><tspan
1260+ sodipodi:role="line"
1261+ id="tspan4487"
1262+ x="776.80029"
1263+ y="537.18048">Export current revision as a </tspan><tspan
1264+ id="tspan4610"
1265+ sodipodi:role="line"
1266+ x="776.80029"
1267+ y="549.18048">directory</tspan></text>
1268+ </g>
1269+ <g
1270+ transform="translate(1e-4,33.600285)"
1271+ id="g3332">
1272+ <text
1273+ xml:space="preserve"
1274+ 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"
1275+ x="782.565"
1276+ y="605.85291"
1277+ id="text4521"
1278+ sodipodi:linespacing="110%"><tspan
1279+ sodipodi:role="line"
1280+ id="tspan4523"
1281+ x="782.565"
1282+ y="605.85291">bzr export ../myproject-dist.zip</tspan></text>
1283+ <text
1284+ xml:space="preserve"
1285+ 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"
1286+ x="776.32574"
1287+ y="583.03461"
1288+ id="text4525"
1289+ sodipodi:linespacing="100%"><tspan
1290+ sodipodi:role="line"
1291+ id="tspan4527"
1292+ x="776.32574"
1293+ y="583.03461">Export current revision as an</tspan><tspan
1294+ id="tspan4612"
1295+ sodipodi:role="line"
1296+ x="776.32574"
1297+ y="595.03461">archive</tspan></text>
1298+ </g>
1299+ <g
1300+ transform="translate(-1.4135726,38.47762)"
1301+ id="g2446">
1302+ <text
1303+ xml:space="preserve"
1304+ 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"
1305+ x="782.40674"
1306+ y="505.56467"
1307+ id="text2448"
1308+ sodipodi:linespacing="110%"><tspan
1309+ id="tspan2450"
1310+ sodipodi:role="line"
1311+ x="782.40674"
1312+ y="505.56467">bzr send -o ../base.patch</tspan><tspan
1313+ sodipodi:role="line"
1314+ x="782.40674"
1315+ y="516.638"
1316+ id="tspan2452" /></text>
1317+ <text
1318+ xml:space="preserve"
1319+ 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"
1320+ x="776.13232"
1321+ y="494.69229"
1322+ id="text2454"
1323+ sodipodi:linespacing="100%"><tspan
1324+ id="tspan2456"
1325+ sodipodi:role="line"
1326+ x="776.13232"
1327+ y="494.69229">Create a merge directive</tspan></text>
1328+ </g>
1329+ </g>
1330+ <text
1331+ xml:space="preserve"
1332+ 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"
1333+ x="144.32812"
1334+ y="64.254639"
1335+ id="text2774"
1336+ sodipodi:linespacing="100%"><tspan
1337+ sodipodi:role="line"
1338+ id="tspan2776"
1339+ x="144.32812"
1340+ y="64.254639">Bazaar </tspan></text>
1341+ <g
1342+ style="display:inline"
1343+ id="g3653"
1344+ transform="matrix(0.6461515,0,0,0.6526216,160.93614,144.01237)"
1345+ inkscape:export-filename="/home/matt/Projects/Ubuntu/Bazaar Website/bzr icon 64.png"
1346+ inkscape:export-xdpi="45.012665"
1347+ inkscape:export-ydpi="45.012665">
1348+ <path
1349+ id="path2749"
1350+ 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 "
1351+ style="opacity:1;fill:#fce94f;fill-opacity:1;stroke:#fce94f;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
1352+ <path
1353+ id="path2721"
1354+ 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 "
1355+ style="opacity:1;fill:#c4a000;fill-opacity:1;stroke:#c4a000;display:inline" />
1356+ <path
1357+ id="path2727"
1358+ 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 "
1359+ style="opacity:1;fill:#555753;fill-opacity:1;stroke:#2e3436;stroke-opacity:1;display:inline" />
1360+ <path
1361+ 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 "
1362+ style="opacity:1;fill:#555753;fill-opacity:1;stroke:#2e3436;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
1363+ id="path2736" />
1364+ </g>
1365+ <text
1366+ xml:space="preserve"
1367+ 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"
1368+ x="146.57143"
1369+ y="97.808769"
1370+ id="text3409"
1371+ sodipodi:linespacing="100%"><tspan
1372+ sodipodi:role="line"
1373+ id="tspan3411"
1374+ x="146.57143"
1375+ y="97.808769">Quick Reference Card</tspan></text>
1376+ <g
1377+ id="g12314"
1378+ transform="translate(17.946423,1.7472534)"
1379+ style="fill:#333333;fill-opacity:1">
1380+ <text
1381+ sodipodi:linespacing="100%"
1382+ id="text8833"
1383+ y="527.43823"
1384+ x="297.99408"
1385+ 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"
1386+ xml:space="preserve"><tspan
1387+ 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"
1388+ y="527.43823"
1389+ x="297.99408"
1390+ id="tspan8835"
1391+ sodipodi:role="line">Supported URL Prefixes</tspan></text>
1392+ <g
1393+ id="g12288"
1394+ style="fill:#333333;fill-opacity:1">
1395+ <text
1396+ xml:space="preserve"
1397+ 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"
1398+ x="299.33002"
1399+ y="547.94214"
1400+ id="text8837"
1401+ sodipodi:linespacing="150%"><tspan
1402+ sodipodi:role="line"
1403+ id="tspan8841"
1404+ x="299.33002"
1405+ y="547.94214">aftp://</tspan><tspan
1406+ sodipodi:role="line"
1407+ id="tspan8843"
1408+ x="299.33002"
1409+ y="565.94214">bzr://</tspan><tspan
1410+ sodipodi:role="line"
1411+ x="299.33002"
1412+ y="583.94214"
1413+ id="tspan10799">bzr+ssh://</tspan><tspan
1414+ sodipodi:role="line"
1415+ id="tspan8847"
1416+ x="299.33002"
1417+ y="601.94214">file:// </tspan><tspan
1418+ sodipodi:role="line"
1419+ id="tspan8849"
1420+ x="299.33002"
1421+ y="619.94214">ftp:// </tspan><tspan
1422+ sodipodi:role="line"
1423+ id="tspan8851"
1424+ x="299.33002"
1425+ y="637.94214">http://</tspan><tspan
1426+ sodipodi:role="line"
1427+ id="tspan8853"
1428+ x="299.33002"
1429+ y="655.94214">https://</tspan><tspan
1430+ sodipodi:role="line"
1431+ x="299.33002"
1432+ y="673.94214"
1433+ id="tspan10797" /><tspan
1434+ sodipodi:role="line"
1435+ id="tspan8855"
1436+ x="299.33002"
1437+ y="691.94214">sftp://</tspan><tspan
1438+ sodipodi:role="line"
1439+ id="tspan8857"
1440+ x="299.33002"
1441+ y="709.94214" /></text>
1442+ <text
1443+ xml:space="preserve"
1444+ 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"
1445+ x="379.22845"
1446+ y="547.94214"
1447+ id="text12260"
1448+ sodipodi:linespacing="150%"><tspan
1449+ sodipodi:role="line"
1450+ id="tspan12262"
1451+ x="379.22845"
1452+ y="547.94214">Access using active FTP.</tspan><tspan
1453+ sodipodi:role="line"
1454+ x="379.22845"
1455+ y="565.94214"
1456+ id="tspan12264">Fast access using the Bazaar smart server.</tspan><tspan
1457+ sodipodi:role="line"
1458+ x="379.22845"
1459+ y="583.94214"
1460+ id="tspan12270">Fast access using the Bazaar smart server over SSH.</tspan><tspan
1461+ sodipodi:role="line"
1462+ x="379.22845"
1463+ y="601.94214"
1464+ id="tspan12286">Access using the standard filesystem (default)</tspan><tspan
1465+ sodipodi:role="line"
1466+ x="379.22845"
1467+ y="619.94214"
1468+ id="tspan12272">Access using passive FTP.</tspan><tspan
1469+ sodipodi:role="line"
1470+ x="379.22845"
1471+ y="637.94214"
1472+ id="tspan12274">Read-only access of branches exported on the web.</tspan><tspan
1473+ sodipodi:role="line"
1474+ x="379.22845"
1475+ y="655.94214"
1476+ id="tspan12276">Read-only access of branches exported on the web </tspan><tspan
1477+ sodipodi:role="line"
1478+ x="379.22845"
1479+ y="673.94214"
1480+ id="tspan12278">using SSL.</tspan><tspan
1481+ sodipodi:role="line"
1482+ x="379.22845"
1483+ y="691.94214"
1484+ id="tspan12280">Access using SFTP (most SSH servers provide SFTP).</tspan><tspan
1485+ sodipodi:role="line"
1486+ x="379.22845"
1487+ y="709.94214"
1488+ id="tspan12282" /></text>
1489+ </g>
1490+ </g>
1491+ <g
1492+ id="g13619"
1493+ style="fill:#333333;fill-opacity:1">
1494+ <text
1495+ sodipodi:linespacing="100%"
1496+ id="text4624"
1497+ y="320.09448"
1498+ x="316.78033"
1499+ 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"
1500+ xml:space="preserve"><tspan
1501+ 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"
1502+ y="320.09448"
1503+ x="316.78033"
1504+ id="tspan4626"
1505+ sodipodi:role="line">Concepts</tspan></text>
1506+ <text
1507+ sodipodi:linespacing="150%"
1508+ id="text12146"
1509+ y="341.21167"
1510+ x="447.92319"
1511+ 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"
1512+ xml:space="preserve"><tspan
1513+ y="341.21167"
1514+ x="447.92319"
1515+ id="tspan12148"
1516+ sodipodi:role="line">line of development for a project</tspan><tspan
1517+ id="tspan12150"
1518+ y="359.21167"
1519+ x="447.92319"
1520+ sodipodi:role="line">version controlled directory </tspan><tspan
1521+ id="tspan12152"
1522+ y="377.21167"
1523+ x="447.92319"
1524+ sodipodi:role="line">store for Bazaar revisions</tspan><tspan
1525+ id="tspan12154"
1526+ y="395.21167"
1527+ x="447.92319"
1528+ sodipodi:role="line">version of the source code committed to the </tspan><tspan
1529+ id="tspan12156"
1530+ y="413.21167"
1531+ x="447.92319"
1532+ sodipodi:role="line">repository</tspan><tspan
1533+ id="tspan12158"
1534+ y="431.21167"
1535+ x="447.92319"
1536+ sodipodi:role="line">named revision</tspan><tspan
1537+ id="tspan12160"
1538+ y="449.21167"
1539+ x="447.92319"
1540+ sodipodi:role="line">branches having a common ancestor</tspan><tspan
1541+ id="tspan12164"
1542+ y="467.21167"
1543+ x="447.92319"
1544+ sodipodi:role="line">the operation of applying to a branch all the </tspan><tspan
1545+ y="485.21167"
1546+ x="447.92319"
1547+ sodipodi:role="line"
1548+ id="tspan3886">changes introduced by another one</tspan></text>
1549+ <text
1550+ sodipodi:linespacing="150%"
1551+ id="text12400"
1552+ y="341.21167"
1553+ x="317.27643"
1554+ 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"
1555+ xml:space="preserve"><tspan
1556+ y="341.21167"
1557+ x="317.27643"
1558+ id="tspan12402"
1559+ sodipodi:role="line">Branch:</tspan><tspan
1560+ id="tspan12404"
1561+ y="359.21167"
1562+ x="317.27643"
1563+ sodipodi:role="line">Working tree:</tspan><tspan
1564+ id="tspan12406"
1565+ y="377.21167"
1566+ x="317.27643"
1567+ sodipodi:role="line">Repository:</tspan><tspan
1568+ id="tspan12408"
1569+ y="395.21167"
1570+ x="317.27643"
1571+ sodipodi:role="line">Revision:</tspan><tspan
1572+ id="tspan12410"
1573+ y="413.21167"
1574+ x="317.27643"
1575+ sodipodi:role="line" /><tspan
1576+ id="tspan12412"
1577+ y="431.21167"
1578+ x="317.27643"
1579+ sodipodi:role="line">Tag:</tspan><tspan
1580+ id="tspan12414"
1581+ y="449.21167"
1582+ x="317.27643"
1583+ sodipodi:role="line">Related branches:</tspan><tspan
1584+ id="tspan12416"
1585+ y="467.21167"
1586+ x="317.27643"
1587+ sodipodi:role="line">Merge:</tspan><tspan
1588+ id="tspan12418"
1589+ y="485.21167"
1590+ x="317.27643"
1591+ sodipodi:role="line"> </tspan></text>
1592+ </g>
1593+ <g
1594+ id="g6327"
1595+ transform="translate(6.5601196,0)"
1596+ style="fill:#333333;fill-opacity:1">
1597+ <text
1598+ sodipodi:linespacing="100%"
1599+ id="text6294"
1600+ y="50.289795"
1601+ x="775.77582"
1602+ 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"
1603+ xml:space="preserve"><tspan
1604+ y="50.289795"
1605+ x="775.77582"
1606+ id="tspan6296"
1607+ sodipodi:role="line">More Information</tspan></text>
1608+ <g
1609+ id="g6320"
1610+ style="fill:#333333;fill-opacity:1">
1611+ <text
1612+ xml:space="preserve"
1613+ 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"
1614+ x="787.72699"
1615+ y="76.095581"
1616+ id="text6298"
1617+ sodipodi:linespacing="100%"><tspan
1618+ sodipodi:role="line"
1619+ id="tspan6300"
1620+ x="787.72699"
1621+ y="76.095581">bzr help</tspan></text>
1622+ <a
1623+ id="a6316"
1624+ style="fill:#333333;fill-opacity:1"
1625+ xlink:href="http://bazaar.canonical.com">
1626+ <text
1627+ sodipodi:linespacing="100%"
1628+ id="text6302"
1629+ y="97.901367"
1630+ x="787.79535"
1631+ 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"
1632+ xml:space="preserve"><tspan
1633+ y="97.901367"
1634+ x="787.79535"
1635+ id="tspan6304"
1636+ sodipodi:role="line">http://bazaar.canonical.com</tspan></text>
1637+ </a>
1638+ </g>
1639+ </g>
1640+ </g>
1641+</svg>
1642
1643=== added directory 'doc/ch/_templates'
1644=== added file 'doc/ch/_templates/index.html'
1645--- doc/ch/_templates/index.html 1970-01-01 00:00:00 +0000
1646+++ doc/ch/_templates/index.html 2012-11-23 02:18:19 +0000
1647@@ -0,0 +1,84 @@
1648+{% extends "layout.html" %}
1649+
1650+{% set title = 'Table of Contents' %}
1651+{% block body %}
1652+
1653+ <h2>核心文档</h2>
1654+
1655+ <table class="contentstable" align="center" style="margin-left: 30px"><tr>
1656+ <td width="50%">
1657+<!-- <p class="biglink"><a class="biglink" href="{{ pathto("whats-new/whats-new-in-2.6") }}">What's New in Bazaar 2.6?</a><br/>
1658+ <span class="linkdescr">what's new in this release</span>
1659+ </p> -->
1660+ <p class="biglink"><a class="biglink" href="{{ pathto("user-guide/index") }}">用户手册</a><br/>
1661+ <span class="linkdescr">如何使用命令行客户端</span>
1662+ </p>
1663+ <p class="biglink"><a class="biglink" href="{{ pathto("tutorials/using_bazaar_with_launchpad") }}">Bazaar和Launchpad结合使用</a><br/>
1664+ <span class="linkdescr">如何结合使用Bazaar和Launchpad</span>
1665+ </p>
1666+ <p class="biglink"><a class="biglink" href="{{ pathto("mini-tutorial/index") }}">五分钟快速学习Bazaar</a><br/>
1667+ <span class="linkdescr">快速学习Bazaar的基本操作和使用</span>
1668+ </p>
1669+ <p class="biglink"><a class="biglink" href="{{ pathto("admin-guide/index") }}">系统管理员手册</a><br/>
1670+ <span class="linkdescr">安全,备份等等。</span>
1671+ </p>
1672+<!-- <p class="biglink"><a class="biglink" href="{{ pathto("quick-reference/index") }}">Quick Reference</a><br/>
1673+ <span class="linkdescr">for your wall</span>
1674+ </p> -->
1675+ </td>
1676+<!-- <td width="50%">
1677+ <p class="biglink"><a class="biglink" href="{{ pathto("release-notes/index") }}">Release Notes</a><br/>
1678+ <span class="linkdescr">a detailed log of changes</span>
1679+ </p>
1680+ <p class="biglink"><a class="biglink" href="{{ pathto("upgrade-guide/index") }}">Upgrade Guide</a><br/>
1681+ <span class="linkdescr">moving to Bazaar 2.x</span>
1682+ </p>
1683+ <p class="biglink"><a class="biglink" href="{{ pathto("user-reference/index") }}">User Reference</a><br/>
1684+ <span class="linkdescr">all the gory details</span>
1685+ </p>
1686+ <p class="biglink"><a class="biglink" href="{{ pathto("admin-guide/index") }}">System Admin Guide</a><br/>
1687+ <span class="linkdescr">security, backups, etc.</span>
1688+ </p>
1689+ </td> -->
1690+ </tr>
1691+ </table>
1692+
1693+<!-- <h2>Related links</h2>
1694+
1695+ <table class="contentstable" align="center" style="margin-left: 30px"><tr>
1696+ <td width="50%">
1697+ <p class="biglink"><a class="biglink" href="http://doc.bazaar.canonical.com/explorer/en/guide/">Desktop Guide</a><br/>
1698+ <span class="linkdescr">how to use our GUI applications</span>
1699+ </p>
1700+ <p class="biglink"><a class="biglink" href="https://answers.launchpad.net/bzr/+faqs">FAQ</a><br/>
1701+ <span class="linkdescr">frequently asked questions</span>
1702+ </p>
1703+ <p class="biglink"><a class="biglink" href="http://wiki.bazaar.canonical.com/BzrGlossary/">Glossary</a><br/>
1704+ <span class="linkdescr">help with terminology</span>
1705+ </p>
1706+ </td>
1707+ <td width="50%">
1708+ <p class="biglink"><a class="biglink" href="../developers/">Developer Docs</a><br/>
1709+ <span class="linkdescr">improving and extending bzr</span>
1710+ </p>
1711+ <p class="biglink"><a class="biglink" href="http://doc.bazaar.canonical.com/migration/en/">Migration Docs</a><br/>
1712+ <span class="linkdescr">for refugees of other tools</span>
1713+ </p>
1714+ <p class="biglink"><a class="biglink" href="http://doc.bazaar.canonical.com/plugins/en/">Plugins Guide</a><br/>
1715+ <span class="linkdescr">help on popular plugins</span>
1716+ </p>
1717+ </td></tr>
1718+
1719+ <tr><td colspan="2">
1720+ These documents are also available in <a href="../es/index.html">Spanish</a>,
1721+ <a href="../ja/index.html">Japanese</a>,
1722+ and <a href="../ru/index.html">Russian</a>.
1723+ </td></tr>
1724+ </table> -->
1725+
1726+
1727+ <h2>团队说明</h2>
1728+
1729+ <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。
1730+主要贡献者:abel, Huan Peng, Jack Yu, jiaowen520li, shijing, testpi, wangyan.</p>
1731+{% endblock %}
1732
1733=== added file 'doc/ch/_templates/layout.html'
1734--- doc/ch/_templates/layout.html 1970-01-01 00:00:00 +0000
1735+++ doc/ch/_templates/layout.html 2012-11-23 02:18:19 +0000
1736@@ -0,0 +1,8 @@
1737+{% extends "!layout.html" %}
1738+
1739+{% block rootrellink %}
1740+<li><a href="http://bazaar.canonical.com/">
1741+ <img src="{{ pathto("_static/bzr icon 16.png", 1) }}" /> Home</a>&nbsp;|&nbsp;</li>
1742+<a href="http://doc.bazaar.canonical.com/en/">Documentation</a>&nbsp;|&nbsp;</li>
1743+{{ super() }}
1744+{% endblock %}
1745
1746=== added directory 'doc/ch/admin-guide'
1747=== added file 'doc/ch/admin-guide/advanced.txt'
1748--- doc/ch/admin-guide/advanced.txt 1970-01-01 00:00:00 +0000
1749+++ doc/ch/admin-guide/advanced.txt 2012-11-23 02:18:19 +0000
1750@@ -0,0 +1,107 @@
1751+前沿话题
1752+========
1753+
1754+系统监测
1755+--------
1756+
1757+容量规划技巧
1758+------------
1759+
1760+集群
1761+-----
1762+
1763+多站点设置
1764+----------
1765+
1766+分布式控制系统的“分配”应该表明Bazaar很适合多站点开发环境。这个优势来源于清晰简单的利用不同的历史来合并分支。需要注意的是,有很多不同的方式使用Bazaar 和它的分支和合并的性能来管理广泛的开发方案。这些可以作为政策在生效前被发现被检验。我们会在那里建立一个可行的方案。
1767+
1768+公司总部在美国德克萨斯州的奥斯汀市,考虑到公司的扩张,ProjectX在澳大利亚达尔文市拓展了一个新的分支办公室。覆盖面较大的多站点开发环境比如连接澳大利亚到德克萨斯州的网络既慢又不可靠。所以每个子办公室会像主分支一样把他们本地化。(在网络条件良好的状况下,只要支持多站点开发那么一个本地的分支会反过来远程操纵主分支。)
1769+
1770+当然,在两个主分支下,总会发生哪个更有权威性的争论。在管理多分支上Bazaar很流畅,我们不把Texas 或Australia私有化而是把他们放在两个主分支中统一管理。明显的我们会在德克萨斯的站点把主分支本地化。所以,我们会有三个分支分别存储在两个服务器上:主干和德克萨斯的整体在德克萨斯州站点,澳大利亚的整体在达尔文的站点上。这些分支因开发地点而得名,但是在很多案例中关于命名问题团队的名字要比地理因素被考虑的更多。由于我们尝试阐明多站点开发问题,所以我们坚持这种命名原则。
1771+
1772+
1773+配置
1774+~~~~~
1775+
1776+ 使用我们在德克萨斯州预先的配置,我们会简单的对老的主干重命名然后作为新的主干然后分支一个复制作为德州的整体。
1777+
1778+::
1779+
1780+ $ cd /srv/bzr/projectx
1781+ $ mv trunk trunk # 可以很简单的在文件系统上重命名
1782+ $ bzr branch trunk texas-integration # 在一个共享库中非常快
1783+
1784+在澳大利亚,我们需要建立/srv/bzr/projectx目录然后对目前澳洲整体进行复制::
1785+
1786+ $ mkdir -p /srv/bzr
1787+ $ cd /srv/bzr
1788+ $ bzr init-repo --no-trees projectx
1789+ $ cd projectx
1790+ $ bzr branch bzr+ssh://server.example.com/srv/bzr/trunk
1791+ $ bzr branch trunk australia-integration
1792+
1793+融合到主分支
1794+~~~~~~~~~~~~
1795+
1796+每个办公工作在本地都会有主干的拷贝。整体速度的快慢来自于两个本地开发的速度,这两个本地的主干需要被合并。(实际上,自从多重合并没有障碍以后合并会快一点)在这个例子中,德州办公室的爱丽丝在他本地机器上对服务器上的分支进行合并::
1797+
1798+ # 在德克萨斯获取一份澳大利亚分支的拷贝。运行完分支的初始化命令之后,使用pull命令更新分支到最新状态。随着一个较慢网速,下面这个是唯一一个较慢的部分
1799+ $ bzr branch bzr+ssh://autralia.example.com/srv/bzr/projectx/australia-integration \
1800+ bzr+ssh://server.example.com/srv/bzr/projectx/australia-integration
1801+
1802+ # 从本地获取主分支来进行融合操作
1803+ $ cd ~/projectx
1804+ $ bzr checkout bzr+ssh://server.example.com/srv/bzr/projectx/trunk
1805+ $ cd trunk
1806+ $ bzr merge bzr+ssh://server.example.com/srv/bzr/projectx/texas-integration
1807+
1808+ # 运行测试套件并解决任何冲突
1809+ $ bzr commit -m "Merge Texas branch to master"
1810+
1811+ # 现在,融合澳大利亚和本地分支的备份
1812+ $ bzr merge bzr+ssh://server.example.com/srv/bzr/projectx/australia-integration
1813+
1814+ # 运行测试套件并解决他们之间的冲突
1815+ $ bzr commit -m "Merge Australia branch to master"
1816+
1817+注意:即使是很实用的合并Bazaar 也不会默认提交。这是因为尽管合并很清晰但是合并状态需要在提交前被检查(这是因为没有文件冲突并不意味着在合并之后一切都会正常工作)。一个替代的方案是,在可以pull的情况下通过 ``bzr merge --pull`` 来进行融合。
1818+
1819+合并回本地主干
1820+~~~~~~~~~~~~~~
1821+
1822+现在主分支是最新的版本而且所有的本地主干需要再融合并改变。如果没有德州整体新的提交,可以使用 ``bzr pull``::
1823+
1824+ $ cd ~/projectx
1825+ $ bzr checkout bzr+ssh://server.example.com/srv/bzr/projectx/texas-integration
1826+ $ cd texas-integration
1827+ $ bzr pull ../trunk # Use trunk from the local disk
1828+ # 不需要提交
1829+
1830+如果因为合并主干在德州整体发生了新的改变,会产生一个错误来使用融合::
1831+
1832+ $ bzr merge ../trunk
1833+ # Run test suite, resolve conflicts
1834+ $ bzr commit -m "Merging Australian changes"
1835+
1836+在澳大利亚,他们会更新本地复制::
1837+
1838+ $ cd /srv/bzr/projectx/trunk
1839+ $ bzr pull # 默认会使用本地的副本
1840+
1841+然后,他们需要从本地主干找出和合并改变。这件事应该由澳洲整体的开发者检查后来做,这样他们可以这样运行这些测试套件::
1842+
1843+ $ cd ~/projectx
1844+ $ bzr co bzr+ssh://australia.example.com/srv/bzr/projectx/australia-integration
1845+ $ cd australia-integration
1846+ $ bzr merge bzr+ssh://australia.example.com/srv/bzr/projectx/trunk
1847+ # 运行测试套件,整合德克萨斯州最近的变化
1848+ # 开发
1849+ $ bzr commit -m "Integrate work from Texas"
1850+
1851+其他的考虑
1852+~~~~~~~~~~
1853+
1854+多站点部署会很复杂,由于快速的发展所以会有许多可能的变化,分开劳动,网络链接,资源共享等等。之前的描述意味着有一种可能可以支持多站点开发(德州和澳洲都独享他们的结构)。在有一个主站点和其他小站点的情况,一个本地主分支可以被消除然后主干可以被用来发展主站点。
1855+
1856+本地的主干被频繁的整合到最高级主干。给整体一些特定的资源,一个开发者也许在两个团队中来回改变。这两个站点可以有一个良好的分工,当他们各个特性都被完成他们才会开始合并最高级主干。解决一个大合并中的冲突是很困难的但是在Bazaar里合并是很简单的,我们建议多多融合。
1857+
1858
1859=== added file 'doc/ch/admin-guide/backup.txt'
1860--- doc/ch/admin-guide/backup.txt 1970-01-01 00:00:00 +0000
1861+++ doc/ch/admin-guide/backup.txt 2012-11-23 02:18:19 +0000
1862@@ -0,0 +1,119 @@
1863+备份与还原
1864+==========
1865+
1866+备份bazaar分支可以以两种不同的方式实现。如果现存的文件系统备份模式已经存在,那它可以很容易的用于bazaar分支的备份。可选的是,bazaar自身可以将想要的分支镜像到另外的位置或者是从另外的地方来做镜像来达到备份的目的。
1867+
1868+文件系统备份
1869+------------
1870+
1871+从磁盘的形式来说,bazaar的事务是十分细微的以至于它在任何情况在都是十分活跃的。然而,备份是需要在有限的时间内完成的,在备份活动的分支或是库的时候,不同的磁盘磁盘结构可能会产生矛盾(bazaar自身通过一种定义良好的次序 *读取* 那些结构来管理现有的问题)。像LVM这样的工具,允许对磁盘上的内容进行瞬间的快照来备份bazaar分支和库上的文件系统。
1872+
1873+对于其他备份的方法,需要在备份时分支和库处于离线状态,以此保证不同的文件之间连续性而构成bazaar分支的历史记录。这样的要求可以通过将bazaar作为自己的备份客户端来缓和,因为这遵循一个读的顺序,这一顺序是为管理同时发生的接入事件而设计的(查看下一个章节了解更多)。依赖在分支上使用的不同的接入技术,存在很多使分支“离线”的方法。对于 ``bzr+ssh://`` 接入,暂时改变文件系统的接入许可来防止任何用户的写权限是有可能的。对于 ``http://`` 接入,改变接入许可,关闭HTTP服务器或者将服务器转向一个不允许接入的单独配置都是可行的使分支离线而备份的方法。最后,对于直接的文件系统接入,有必要使分支目录不可写入。
1874+
1875+由于这种停工期的操作是十分有破坏性的,我们强烈建议将bazaar作为自身的一个备份客户端,这样可以直接使用bazaar来对分支进行拷贝和更新。
1876+
1877+Bazaar的自身备份
1878+----------------
1879+
1880+使得bazaar成为一个优秀的分布式版本控制系统的那些特点也成为了备份自己的一个很好的选择。特别的,任何分支的完整的,一致性的副本可以由 ``branch`` 和
1881+``pull`` 两个命令轻易的获取。尤其是一个备份的过程可以通过简单的在副本的主分支上运行 ``bzr pull`` 来完全更新这个副本。如果这个过程周期性的运行,那这个备份就如同是最近一次运行 ``pull`` 那样的新(这更加证实了bazaar中修订版不可改变的事实,所以当修订版的id获知,那么一个分支的旧版的修订版是可以重新获取的)。
1882+
1883+举个例子,考虑到一个独立的备份服务器将备份储存在 ``/var/backup`` 目录下。在这个服务器上,最初我们可以运行
1884+
1885+::
1886+
1887+ $ cd /var/backup
1888+ $ bzr branch bzr+ssh://server.example.com/srv/bzr/trunk
1889+ $ bzr branch bzr+ssh://server.example.com/srv/bzr/feature-gui
1890+
1891+在备份服务器上创建分支。然后,我们可以经常的这样做(例子中来源于 ``cron`` )
1892+
1893+::
1894+
1895+ $ cd /var/backup/trunk
1896+ $ bzr pull # the location to pull from is remembered
1897+ $ cd ../var/backup/feature-gui
1898+ $ bzr pull # again, the parent location is remembered
1899+
1900+在某些目录中,父分支中拉取子分支是非常常见的,而且这可以由一个插件来完成。 `bzrtools`_ 插件包括 ``multi-pull`` 命令,可以在特定的目录下对所有的分支做 ``pull`` 操作。
1901+
1902+.. _bzrtools: http://launchpad.net/bzrtools
1903+
1904+在这一插件安装的前提下,以上经常性的命令操作可以是这样的
1905+
1906+::
1907+
1908+ $ cd /var/backup
1909+ $ bzr multi-pull
1910+
1911+要注意的是 ``multi-pull`` 是在特定的目录(默认是当前的目录)下对所有的分支进行pull操作,而且要注意这是我们想要的效果。一个简单的脚本也可以替代multi-pull命令,而且也提供了良好的灵活性。
1912+
1913+边界分支的备份
1914+~~~~~~~~~~~~~~
1915+
1916+当 ``bzr pull`` 经常性的运行来确保备份最新的时候,有可能原先分支的一些新的修订版没有被放到备份分支中来。为了解决这一问题,我们可以建立这样的分支,新的修订版总是 *pushed(被加入)* 备份而不是周期性的加入。一种方法是使用bazaar的边界分支,一个分支上的提交事件仅在这个分支中相同的提交成功时 `必然` 发生。像push-type技术一样,它设置在自身的服务器上而不是备份服务器上。对于每一个分支都要备份,你只需要使用 ``bind`` 命令为每个备份分支设置URL。在我们的例子中,首先我们需要在备份服务器上创建分支(我们使用 ``bzr push`` ,但是我们一样可以在备份服务器上轻易的使用 ``bzr branch`` )
1917+
1918+::
1919+
1920+ $ cd /srv/bzr/projectx/trunk
1921+ $ bzr push bzr+ssh://backup.example.com/var/backup/trunk
1922+ $ cd ../feature-gui
1923+ $ bzr push bzr+ssh://backup.example.com/var/backup/feature-gui
1924+
1925+然后我们需要将主分支与他们的备份分支捆绑
1926+
1927+::
1928+
1929+ $ cd ../trunk
1930+ $ bzr bind bzr+ssh://backup.example.com/var/backup/trunk
1931+ $ cd ../feature-gui
1932+ $ bzr bind bzr+ssh://backup.example.com/var/backup/feature-gui
1933+
1934+一个分支只能被捆绑到一个单一的位置,所以多个分支不能用这种方法创建.
1935+
1936+使用 `Hooks(钩子函数)和Plugins(插件) <hooks-plugins.html>`_ 章节中提到的 `automirror`_ 插件,它也可以制作一个push-type的备份系统来更加自然的处理多备份问题。为多个URLs设置 ``post_commit_mirror`` 选项,用逗号隔开。为了备份到备份服务器或是远程地址上,可以这样做
1937+
1938+::
1939+
1940+ $ cd /srv/bzr/trunk
1941+ $ echo "post_commit_mirror=bzr+ssh://backup.example.com/var/backup/trunk,\
1942+ bzr+ssh://offsite.example.org/projectx-corp/backup/trunk" >> .bzr/branch/branch.conf
1943+ $ cd ../feature-gui
1944+ $ echo "post_commit_mirror=bzr+ssh://backup.example.com/var/backup/feature-gui,\
1945+ bzr+ssh://offsite.example.org/projectx-corp/backup/feature-gui" >> .bzr/branch/branch.conf
1946+
1947+.. _automirror: http://launchpad.net/bzr-automirror
1948+
1949+对于任何push-type备份策略保持一致性这方面,这种方法的缺点是所有的备份都必须在初始的commit命令成功执行前先成功执行。如果有很多的镜像分支或是边界分支有一个很弱的网络连接,那延迟最初的commit操作将会是不可接受的时间长。既然如此,pull-type备份,或者他们的混合系统更为适合。
1950+
1951+从备份中恢复
1952+------------
1953+
1954+检查备份的一致性
1955+~~~~~~~~~~~~~~~
1956+
1957+很多的系统管理员都被备份过程所打败了,但是当要从备份中恢复数据的时候才发现很多的备份自身都是有缺陷的。因此,周期性的检查备份的质量是很重要的。在bazaar中有两种方法实现这种一致性的检查:使用 ``bzr check`` 和在备份中创建一个新的分支。 ``bzr check`` 命令检查一个分支中所有的修订版,通过bazaar内部的不变性来检查他们的有效性。由于它要检查每一个修订版,那对于庞大的分支来说可能十分的慢。另一个保证备份可用来恢复的方法是进行一次测试性的恢复。这意味这在一个临时的目录下进行测试恢复过程。在恢复过程之后, ``bzr check`` 将再次起检查恢复分支有效性的作用。下面的两章节将展示两种恢复的方法。
1958+
1959+恢复文件系统备份
1960+~~~~~~~~~~~~~~~
1961+
1962+有很多的不同的备份工具有访问备份数据的方法,所以在这里我们不再赘述。我们要说的是恢复 ``/srv/bzr`` 目录下的内容将完全恢复该目录下的分支到他们备份时的状态(查看 `文件系统备份`_ 了解关于活动分支的备份)。例如,如果备份挂载在 ``/mnt/backup/bzr`` 目录下,那我们可以这样简单的恢复::
1963+
1964+ $ cd /srv
1965+ $ mv bzr bzr.old
1966+ $ cp -r /mnt/backup/bzr bzr
1967+
1968+当然,要是只从备份中恢复一个单个的分支,拷贝那个分支就足够了。现在从备份中恢复已经成功的实践了,我们建议保持原来的目录。
1969+
1970+恢复以bazaar为基础的备份
1971+~~~~~~~~~~~~~~~~~~~~~~~
1972+
1973+为了从备份分支中恢复,我们可以将这些分支放到适当的位置::
1974+
1975+ $ cd /srv
1976+ $ mv bzr bzr.old
1977+ $ cd bzr
1978+ $ bzr branch bzr+ssh://backup.example.com/var/backup/trunk
1979+ $ bzr branch bzr+ssh://backup.example.com/var/backup/feature-gui
1980+
1981+如果有多个备份,可以改变上面的URL来从其他备份中恢复。
1982
1983=== added file 'doc/ch/admin-guide/code-browsing.txt'
1984--- doc/ch/admin-guide/code-browsing.txt 1970-01-01 00:00:00 +0000
1985+++ doc/ch/admin-guide/code-browsing.txt 2012-11-23 02:18:19 +0000
1986@@ -0,0 +1,82 @@
1987+基于网页的代码浏览
1988+=================
1989+
1990+在线浏览工程的历史记录是版本控制的一个重要部分,因为这允许人们轻松的看到分支上发生了什么,而不需要分支的一个本地的,最新的副本。在网页上浏览bazaar的分支有很多的选择,但是我们将详细介绍其中一个,并简明的涉及到与其他选择的区别。
1991+
1992+Loggerhead
1993+----------
1994+
1995+Loggerhead是为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/`` 上。下面我们将讨论这两种配置。
1996+
1997+.. _Loggerhead: http://launchpad.net/loggerhead
1998+
1999+依赖
2000+~~~~
2001+
2002+loggerhead依赖很多其他的Python包,这些Python包使用来构建各种网络技术的。其中的一些必须安装以保证loggerhead的使用,虽然有些是可选的。从loggerhead的 `README` 文件中得知这些包有:
2003+
2004+1) SimpleTAL(模板使用)。
2005+ 在ubuntu上, 执行命令 `sudo apt-get install python-simpletal`
2006+ 或者从 http://www.owlfish.com/software/simpleTAL/download.html 上下载。
2007+2) Simplejson(产生JSON数据)。
2008+ 在ubuntu上, 执行命令 `sudo apt-get install python-simplejson`
2009+ 或者使用 `easy_install simplejson` 。
2010+3) Paste(服务器使用,你需要1.2或是更高的版本)。
2011+ 在ubuntu上, 执行命令 `sudo apt-get install python-paste`
2012+ 或者使用 `easy_install Paste` 。
2013+4) Paste Deploy(可选,当通过Apache代理服务时需要)。
2014+ 在ubuntu上, 执行命令 `sudo apt-get install python-pastedeploy`
2015+ 或者使用 `easy_install PasteDeploy` 。
2016+5) flup(可选,当使用FastCGI,SCGI或是AJP时需要)。
2017+ 在ubuntu上, 执行命令 `sudo apt-get install python-flup`
2018+ 或者使用 `easy_install flup` 。
2019+
2020+虽然在ubuntu上安装这些包的指南已经给出了,大多数其他类型的GUN/Linux需要捆绑这些依赖,使得安装十分的方便。对于Windows和Mac OS X,他们应该能够通过 ``easy_install``- 来安装,最差情况下也要能够通过Python源来安装。
2021+
2022+内建的网络服务器
2023+~~~~~~~~~~~~~~~~
2024+
2025+Loggerhead有一个内置的网络服务器,而且当使用 ``serve-branches`` 命令时,该网络服务器运行在一个默认端口上来监听本地主机。如果默认端口是8080,可访问 ``www.example.com`` ,然后运行
2026+
2027+::
2028+
2029+ $ serve-branches --host=www.example.com --port=8080 /srv/bzr
2030+
2031+这将会列出在 ``http://www.example.com:8080/`` 上所有目录下可到达的分支,因此ProjectX主干可以通过 ``http://www.example.com:8080/projectx/trunk`` 来访问。要注意的是loggerhead提供了可访问潜在bazaar分支的HTTP(类似于在 `基于HTTP(S)智能服务器
2032+<other-setups.html#smart-server-over-http-s>`_ 中描述的),因此该命令应该由一个在 ``/srv/bzr`` 目录下没有写权限的用户运行。默认情况下,Loggerhead只在本地主机上监听,而不是所有的拓展端口,除非具体的指出了。
2033+
2034+基于代理服务器
2035+~~~~~~~~~~~~~~
2036+
2037+一个运行loggerhead更为常用、更为安全的方法是把它放在另一台网络服务器之后,这台网络服务器将会代理处理本地主机到loggerhead的请求。要做到此,你需要安装PasteDeploy(参考 `依赖`_ )。假设你的服务器已经运行了Apache,你需要添加如下的设置来搭建代理服务器
2038+
2039+::
2040+
2041+ <Location "/loggerhead/">
2042+ ProxyPass http://127.0.0.1:8080/
2043+ ProxyPassReverse http://127.0.0.1:8080/
2044+ </Location>
2045+
2046+如果你的代理服务器运行在这一服务器的某些路径上,那么 ``serve-branches`` 命令和 ``--prefix`` 选项都必须运行。例如,我们可以通过下面的命令来运行loggerhead
2047+
2048+::
2049+
2050+ $ serve-branches --prefix=/loggerhead /srv/bzr
2051+
2052+这将允许ProjectX的主分支通过 ``http://www.example.com/loggerhead/projectx/trunk`` 来访问。
2053+
2054+Loggerhead由一个脚本发展而来,这一脚本允许在Unix系列的系统上作为 ``init.d`` 的一项服务运行。如果想要在windows的服务器上做同样的事,欢迎访问 http://launchpad.net/loggerhead 。
2055+
2056+其他网络接口
2057+------------
2058+
2059+有很多关于bazaar分支的其他的网络接口(在 http://wiki.bazaar.canonical.com/WebInterfaces 上查看列表),在这里我们只涉及到其中的一组,具体讨论他们在特殊情况下的优点。
2060+
2061+trac+bzr (http://launchpad.net/trac-bzr)
2062+ trac是一个十分流行的网络应用,它为分支整合了一个浏览器,一个问题跟踪器和一个wiki。trac+bzr是trac的一个拓展,允许在bazaar中使用。
2063+
2064+webbzr ( http://thoughts.enseed.com/webbzr )
2065+ 这是一个著名的方案,因为它是用纯PHP语言为网络主机所写的,它不提供运行随意的python应用的方法,比如说,Trac和Loggerhead。
2066+
2067+Redmine ( http://redmine.org/ )
2068+ 像tarc一样,Redmine是一个在Rails框架中使用Ruby的完整的工程管理应用。它包括对bazaar分支的支持。
2069
2070=== added file 'doc/ch/admin-guide/hooks-plugins.txt'
2071--- doc/ch/admin-guide/hooks-plugins.txt 1970-01-01 00:00:00 +0000
2072+++ doc/ch/admin-guide/hooks-plugins.txt 2012-11-23 02:18:19 +0000
2073@@ -0,0 +1,199 @@
2074+用svn钩子函数和插件来拓展bazaar
2075+==========================
2076+
2077+Bazaar提供了一套强有力的拓展机制来增加功能。除了提供了面向所有结构的API接口库,bazaar还可以加载 *插件* 来完成特殊的任务,这些特殊的任务是由 *hooks(钩子函数)* 指出的,运行在版本控制过程中的特定的步骤,这对于想要与bazaar分支进行交互的外部程序是十分有利的。
2078+
2079+想查看文档中全部可用的钩子函数,可以通过命令 ``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` 更为通用的一种形式,用于分支的顶端被改变的时候。也可以被用作通知的目的,备份或是做镜像。
2080+
2081+Bazaar的所有插件的信息都在 http://doc.bazaar.canonical.com/plugins/en/ 上。为了便于安装,插件都是简单的python包。他们可以用各自插件中的 ``setup.py`` 和bazaar中的 ``bzrlib.plugins`` 包一同安装。他们也可以安装在插件的路径上,该路径可以是用户的 ``~/.bazaar/plugins`` 目录或是 ``BZR_PLUGIN_PATH`` 环境变量具体定义的。查看 ``bzr help configuration`` 了解更多指明插件位置的信息.
2082+
2083+
2084+邮件通知
2085+--------
2086+
2087+一般的需求是分支上的每一个改变都需要发送一个邮件信息到一些地址上,通常是一个邮件列表。这些插件以很多方式提供了这一项功能。
2088+
2089+`email` 这一插件从每一个单个的开发者计算机上发送邮件。这对于追踪每个单个的开发者在从事什么是很有益的。不好的方面是,这要求每个开发者的分支单独的配置相同的插件。
2090+
2091+下面的两个插件 `hookless-email` 和 `email-notifier` 通过运行一个中央服务器来专注于集中存储分支上发生的变化。
2092+
2093+email插件
2094+~~~~~~~~~
2095+
2096+为了配置这一插件,需要简单的安装这一插件,再在每一个分支上配置 ``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 。接下来的例子给出两个可能的配置。
2097+
2098+一个最简单的例子(使用 ``/usr/bin/mail``)
2099+
2100+::
2101+
2102+ [DEFAULT]
2103+ post_commit_to = projectx-commits@example.com
2104+
2105+一个复杂点的例子(使用所以操作)
2106+
2107+::
2108+
2109+ [DEFAULT]
2110+ post_commit_url = http://www.example.com/code/projectx/trunk
2111+ post_commit_to = projectx-commits@example.com
2112+ post_commit_sender = donotreply@example.com
2113+ post_commit_mailer = smtplib
2114+ smtp_server = mail.example.com:587
2115+ smtp_username = bob
2116+ # smtp_password = 'not specified, will prompt'
2117+
2118+hookless-mail插件
2119+~~~~~~~~~~~~~~~~~
2120+
2121+该插件基本上是 `email` 插件的服务器端版本。它是可通过命令行运行的程序或是作为一个守护程序管理在命令行中具体指出变化了的分支。当任何被控制的分支发生变化时,它将会向特定的地址发送邮件。用一个简单的例子来说明, ``/srv/bzr`` 目录下的任何一个分支最后一次运行这一命令时,该命令将会向 ``projectx-commits@example.com`` 发送邮件。(该命令可以设置成周期运行,例如 ``cron`` 。)
2122+
2123+::
2124+
2125+ $ bzr_hookless_email.py --email=projectx-commits@example.com \
2126+ --recurse /srv/bzr
2127+
2128+email-notifier插件
2129+~~~~~~~~~~~~~~~~~~
2130+
2131+这是 `hookless-email` 插件更为精巧的一个版本,它可发送模板HTML邮件。在提交的信息中提出wiki风格的标记,在服务器上更新运行的备份文件 (类似 `push_and_update`_)。也可以发送邮件来报告新的分支的建立或者是具体目录下分支的移除(这里指 ``/srv/bzr/projectx`` 目录)。由于它的功能更复杂了,配置也变得更加复杂了,这里我们就不重复这一部分的文档了。关于发送提交,创建或是删除分支的邮件的一个简单的配置是这样的
2132+
2133+::
2134+
2135+ [smtp]
2136+
2137+ server=smtp.example.com
2138+ # If user is not provided then no authentication will be performed.
2139+ user=bob
2140+ password=pAssW0rd
2141+
2142+ [commits]
2143+
2144+ # The address to send commit emails to.
2145+ to=projctx-commits@example.com
2146+ from=$revision.committer
2147+
2148+ # A Cheetah template used to construct the subject of the email message.
2149+ subject=$relative_path: $revision_number $summary
2150+
2151+ [new-branches]
2152+ to=projectx-commits@example.com
2153+ from=donotreply@example.com
2154+ subject=$relative_path: New branch created
2155+
2156+ [removed-branches]
2157+ to=projectx-commits@example.com
2158+ from=donotreply@example.com
2159+ subject=$relative_path: Branch removed
2160+
2161+如果该文件保存为 ``/srv/bzr/email-notifier.conf`` ,命令如下
2162+
2163+::
2164+
2165+ $ bzr-email-notifier.py --config=/srv/bzr/email-notifier.conf /srv/bzr/projectx
2166+
2167+这样可以在给定的目录下查看分支的提交,创建和删除状态。
2168+
2169+
2170+Feed接口时代
2171+-------------
2172+
2173+发送电子邮件时,分支的变化就是新一代的新闻源的相关概念从每个分支上的变化。感兴趣的人就可以追随这些新闻源来了解每个分支上发生的变化。选择那些信息接口而不是群体来了解在一个分支上发生了什么。
2174+
2175+branchfeed
2176+~~~~~~~~~~
2177+
2178+这一插件为每一个分支创建了一个分支变化(比如commit等)的ATOM接口。保存为 ``.bzr/branch/branch.atom`` ,它将这些文件存放在每个分支的内部。目前,在每一个feed接口上它包含最多20条最近的变化。要使用它,只要很简单的安装这一插件,然后设置你的源读者参照 ``branch.atom`` 文件即可。
2179+
2180+另外的,还有一些非插件工具能够创建Bazaar分支的新闻源。您可以查看 http://wiki.bazaar.canonical.com/FeedGenerators 了解更多关于这些工具的信息。
2181+
2182+
2183+镜像
2184+-----
2185+
2186+有时候确保一个分支作为另一分支的副本存在是很有好处的。这可以被用来提供简单的备份设备或是冗余(更多详细信息参考 `Back-up and restore <backup.html>`_)。实现的一种方法是使用bazaar的工作流程,也就是让发生变化的分支变为镜像分支的一个相近的分支。然后,当commits发生在工作分支上时,那也会发生在镜像分支上。要注意的是发生在相近分支上的commits不会更新镜像分支的工作文档。所以,如果镜像分支不只是分支历史的一个完全的备份,比如说,可以用作网页服务,那么就需要附加的插件。
2187+
2188+push_and_update
2189+~~~~~~~~~~~~~~~
2190+
2191+这一插件可以得到bazaar的 ``push`` 命令的更新,也可以更新远程的工作文档。这只能通过连接来工作,表明文件系统或是SSH可连接远程的工作文档(``bzr+ssh://``, ``sftp://`` 和
2192+``file://``)。当然只有远程的分支由明确的 ``push`` 命令更新了它才能有作用。
2193+
2194+automirror
2195+~~~~~~~~~~
2196+
2197+这一插件和 `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``),然后我们可以包含
2198+
2199+::
2200+
2201+ [DEFAULT]
2202+ post_commit_mirror = sftp://www.example.com/var/www/branches/trunk
2203+
2204+在 ``/srv/bzr/projectx/trunk/.bzr/branch/branch.conf`` 文件中。
2205+
2206+其他有用的插件
2207+--------------
2208+
2209+pqm(插件)
2210+~~~~~~~~~
2211+
2212+为了促进与 `PQM
2213+<integration.html#patch-queue-manager-pqm>`_ 的交互,该插件提供了向远程补丁队列管理提交融合请求的支持。PQM提供了在融合主分支的变化之前自动运行测试套件的方法。
2214+
2215+testrunner
2216+~~~~~~~~~~
2217+
2218+有时在PQM方面的新手,这个插件只需在一个更新的修改版上(在一个临时目录)运行一个简单的命令,如果这一命令返回0,那这个修改版可以被提交到那个分支上。例如,如果测试套件和 ``nosetests`` 命令一起运行在分支的根目录下(如果通过了返回0,没通过返回1),那么可以这样设置
2219+
2220+::
2221+
2222+ [DEFAULT]
2223+ pre_change_branch_tip_test_command = nosetests
2224+
2225+在 ``.bzr/branch/branch.conf``文件中。
2226+
2227+checkeol
2228+~~~~~~~~
2229+
2230+这一插件是 `pre_commit` 钩子函数检查被提交的修改版是否达到相关标准的例子。既然这样,它将检查所有有特殊截至符的文件。它在工作树的根目录使用一个名为 ``.bzreol`` 的配置文件(类似于 ``.bzrignore`` 文件)。该配置文件有关于关于LF,CRLF,CR结束符的章节,对于一个不一样的例子,不同的文件有特定的截至符,这样的文件看起来像这样子
2231+
2232+::
2233+
2234+ [LF]
2235+ *.py
2236+ *.[ch]
2237+
2238+ [CRLF]
2239+ *.txt
2240+ *.ini
2241+
2242+ [CR]
2243+ foo.mac
2244+
2245+或者你想要在分支上强制使用单个截至符标准,可以这样用
2246+
2247+::
2248+
2249+ [LF]
2250+ *
2251+
2252+这个插件需要安装在分支可能会改变的服务器上,而且每一个强制使用规定截至符的分支都必须要有 ``.bzreol`` 文件(通过命令 ``bzr add .bzreol`` 把它加入到分支中是件很容易的事,虽然这意味着运行在服务器上的分支必须有工作树)。
2253+
2254+text_checker
2255+~~~~~~~~~~~~
2256+
2257+这一插件是 `checkeol` 更加先进的一个版本,它可以检查这样风格的代码,像结尾是空白字符的、长串的和不以新的一行结尾的文件。它可以用在 ``BZR_HOME/rules`` 中的bazaar内置的规则说明书来配置(查看 ``bzr help rules`` 获得更多信息)。对于不同类型的意料之外的改变,你可以采取不同的措施。例如
2258+
2259+::
2260+
2261+ [name NEWS README]
2262+ trailing_whitespace=fail
2263+ long_lines=warn
2264+ newline_at_eof=ignore
2265+
2266+ [name *.py]
2267+ tabs=fail
2268+ long_line_length=78
2269+ long_lines=fail
2270+ trailing_whitespace=fail
2271+
2272+可以防止因为增加新的结尾空白字符而带来的特定的文件的改变,同时保持python源文件免于tabs和lines超过78个字符。防止提交时违反这些规则,可以通过 ``--text-check-warn-only`` 选项来提交。
2273
2274=== added file 'doc/ch/admin-guide/index-plain.txt'
2275--- doc/ch/admin-guide/index-plain.txt 1970-01-01 00:00:00 +0000
2276+++ doc/ch/admin-guide/index-plain.txt 2012-11-23 02:18:19 +0000
2277@@ -0,0 +1,24 @@
2278+###################################
2279+Bazaar System Administrator's Guide
2280+###################################
2281+
2282+.. Please mark sections in included files as following:
2283+.. level 1 ========
2284+.. level 2 --------
2285+.. level 3 ~~~~~~~~
2286+.. level 4 ^^^^^^^^ (it is better not to use nesting deeper than 3 levels)
2287+
2288+.. contents:: :depth: 3
2289+
2290+.. include:: introduction.txt
2291+.. include:: simple-setups.txt
2292+.. include:: other-setups.txt
2293+.. include:: migration.txt
2294+.. include:: hooks-plugins.txt
2295+.. include:: code-browsing.txt
2296+.. include:: integration.txt
2297+.. include:: security.txt
2298+.. include:: backup.txt
2299+.. include:: upgrade.txt
2300+.. include:: advanced.txt
2301+.. include:: licence.txt
2302
2303=== added file 'doc/ch/admin-guide/index.txt'
2304--- doc/ch/admin-guide/index.txt 1970-01-01 00:00:00 +0000
2305+++ doc/ch/admin-guide/index.txt 2012-11-23 02:18:19 +0000
2306@@ -0,0 +1,26 @@
2307+###################################
2308+Bazaar 系统管理员手册
2309+###################################
2310+
2311+.. 请将章节包含的文件按如下方式标记:
2312+.. level 1 ========
2313+.. level 2 --------
2314+.. level 3 ~~~~~~~~
2315+.. level 4 ^^^^^^^^ (嵌套深度最好不要超过3层)
2316+
2317+
2318+.. toctree::
2319+ :maxdepth: 2
2320+
2321+ introduction
2322+ simple-setups
2323+ other-setups
2324+ migration
2325+ hooks-plugins
2326+ code-browsing
2327+ integration
2328+ security
2329+ backup
2330+ upgrade
2331+ advanced
2332+ licence
2333
2334=== added file 'doc/ch/admin-guide/integration.txt'
2335--- doc/ch/admin-guide/integration.txt 1970-01-01 00:00:00 +0000
2336+++ doc/ch/admin-guide/integration.txt 2012-11-23 02:18:19 +0000
2337@@ -0,0 +1,14 @@
2338+与其他工具的整合
2339+================
2340+
2341+补丁队列管理 (PQM)
2342+------------------
2343+
2344+BUG追踪器
2345+----------
2346+
2347+持续集成工具
2348+------------
2349+
2350+Bundle Buggy
2351+------------
2352
2353=== added file 'doc/ch/admin-guide/introduction.txt'
2354--- doc/ch/admin-guide/introduction.txt 1970-01-01 00:00:00 +0000
2355+++ doc/ch/admin-guide/introduction.txt 2012-11-23 02:18:19 +0000
2356@@ -0,0 +1,30 @@
2357+介绍
2358+====
2359+
2360+欢迎使用Bazaar版本控制系统的管理员使用手册。Bazaar是一个灵活的系统,提供了许多可能选择服务项目的方式来满足您的需求。如果您有些需求Bazaar现在的系统状态不能满足您, 请通过邮件 bazaar@lists.canonical.com 或者在Launchpad https://launchpad.net/bzr 中告知我们。
2361+
2362+该手册适用的范围
2363+----------------
2364+
2365+在这个手册中, 我们将讨论各种技术包括获取Bazaar项目,从其他版本控制系统迁移,通过网页浏览代码以及Bazaar与其他工具的结合。在这些类别中,存在多个选项,我们会尽量解释的各种选项的代价和好处。
2366+
2367+本指南的目标读者是服务于计算机管理的个人。大部分的配置在我们讨论时都需要管理员权限,但不是每个点都需要。这就是说,对于那些想要充分利用Bazaar并且有兴趣和系统管理员进行交流的人而言,阅读这个手册是非常有帮助的。
2368+
2369+运行Bazaar服务器您需要的
2370+------------------------
2371+
2372+在可能的情况下,我们将讨论在Unix(包括GNU/Linux)和Windows服务器环境。鉴于本文档的目的,我们会把Mac OS X考虑为一种类型的Unix。
2373+
2374+通常,Bazaar需要Python_ 2.6或以上的版本。
2375+如果您想要 *可选*
2376+例如想要通过SFTP访问分支,那么您需要 `paramiko and pycrypto`_ 。
2377+
2378+.. _Python: http://www.python.org/
2379+.. _paramiko and pycrypto: http://www.lag.net/paramiko/
2380+
2381+为了获得最佳性能,Bazaar可以使用编译版本中的一些的重要组件的代码。纯Python的替代品存在于这些组件中,但是它们可能是相当慢的。为了编译这些扩展,您需要一个C编译器和包含相关头文件的Python包。在GNU/Linux,这些可能在一个单独的包中。其他的操作系统需要默认安装这些头文件。
2382+
2383+如果您安装的是开发版的Bazaar,而不是一个稳定发行版,那么您需要Pyrex 来创建C扩展。发行版的源码包中已经帮您创建了这些扩展。
2384+
2385+.. _Pyrex: http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/
2386+
2387
2388=== added file 'doc/ch/admin-guide/licence.txt'
2389--- doc/ch/admin-guide/licence.txt 1970-01-01 00:00:00 +0000
2390+++ doc/ch/admin-guide/licence.txt 2012-11-23 02:18:19 +0000
2391@@ -0,0 +1,4 @@
2392+证书
2393+====
2394+
2395+版权2008-2011Canonical Ltd。Bazaar是免费的软件,你可以在GNU General Public License版本2或是更后的版本下使用,修改或是再发布Bazaar和这篇文档。更多请查看<http://www.gnu.org/licenses/>。
2396
2397=== added file 'doc/ch/admin-guide/migration.txt'
2398--- doc/ch/admin-guide/migration.txt 1970-01-01 00:00:00 +0000
2399+++ doc/ch/admin-guide/migration.txt 2012-11-23 02:18:19 +0000
2400@@ -0,0 +1,41 @@
2401+迁移
2402+====
2403+
2404+版本控制系统之间的移植是一个十分复杂的过程,在 http://doc.bazaar.canonical.com/migration/en 上bazaar有关于这一过程的附加文档,在此就不在赘述了。我们将尽量给出一些生动的关于Mercurial和Subversion迁移的例子。
2405+
2406+快速导入
2407+--------
2408+
2409+很多的工程都希望能使用bazaar,需要考虑的是存在一个先前的代码库。bazaar支持着一个交互式的版式,起初是为Git开发的,叫做 `fast-import` ,向其他的许多版本控制系统提供移植的策略。为了支持fast-import文件,bazaar需要 `fastimport`_ 插件。这些插件可以像bazaar的所有插件一样一起安装。
2410+
2411+.. _fastimport: http://launchpad.net/bzr-fastimport
2412+
2413+Fast-import可以用来移植在于它将已经存在的历史记录输出到了一个fast-import文档中,然后使用 ``bzr fast-import`` 命令。 `fastimport` 的插件包括exporters for CVS,Git,Subversion,Git,Mercurial和darcs,像 ``fast-export-from-XXX`` 命令一样易于使用。值得注意的是如果在一个分支中已经有存在的历史记录那 ``fast-import`` 就不能再使用了。
2414+
2415+假设PeojectX在Mercurical在转变为bazaar之前第一次被开发,而Mercurical库在 ``/srv/hg/projectx`` 目录下,下面的命令将把历史记录引进到新创建的 ``trunk(主分支)`` 中(之前我们在 `进一步的配置 <simple-setups.html#further-configuration>`_ 中将 ``/srv/bzr/projectx`` 目录创建成为一个共享的库)。
2416+
2417+::
2418+
2419+ $ cd /srv/bzr/projectx
2420+ $ bzr fast-export-from-hg ../../hg/projectx projectx.fi
2421+ $ bzr init trunk
2422+ $ bzr fast-import projectx.fi trunk
2423+
2424+Subversion转换
2425+--------------
2426+
2427+像大多数集中式的版本控制系统一样,对于任何的一个新的版本控制系统,从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/`` 下。
2428+
2429+这一指令有很灵活的方法来指明Subversion库中哪些路径包含分支,哪些路径包含标记。例如,在Subversion工程(svn插件称为 ``trunk``)中被推荐的布局可以这样在 ``~/.bazaar/subversion.conf`` 中指出
2430+
2431+::
2432+
2433+ [203ae883-c723-44c9-aabd-cb56e4f81c9a]
2434+ branches = branches/*
2435+ tags = tags/*
2436+
2437+这允许将大量复杂的Subversion库转变为一系列独立的bazaar分支。安装svn插件后,查看 ``bzr help svn-import`` 和 ``bzr help svn-layout`` 。
2438+
2439+.. _svn: http://launchpad.net/bzr-svn
2440+
2441+.. TODO: Legacy VCS to bzr sync. Tailor? Incremental conversions?
2442
2443=== added file 'doc/ch/admin-guide/other-setups.txt'
2444--- doc/ch/admin-guide/other-setups.txt 1970-01-01 00:00:00 +0000
2445+++ doc/ch/admin-guide/other-setups.txt 2012-11-23 02:18:19 +0000
2446@@ -0,0 +1,32 @@
2447+其他配置
2448+========
2449+
2450+傻瓜服务器
2451+----------
2452+
2453+Bazaar同样可以通过协议来提供分支服务,而这些协议可以完全不知道bazaar的具体需求。这种方式被叫做“傻瓜服务器”以此来和bazaar本地的协议区分,目前的HTTP,HTTPS,FTP,SFTP和HTTP+WebDAV可以用来对分支进行远程的读作。FTP,SFTP和HTTP+WebDAV也可以用来进行写操作。要使用这些协议,只需要在 ``/srv/bzr`` 目录下提供服务器文件系统的通道。
2454+
2455+例如,Apache在 ``/srv/bzr`` 目录下提供分支的只读服务的配置可以是这样的::
2456+
2457+ Alias /code /srv/bzr
2458+ <Directory /srv/bzr>
2459+ Options Indexes
2460+ # ...
2461+ </Directory>
2462+
2463+用户也可以用URL ``http://server.example.com/code/projectx/trunk`` 来访问主分支。
2464+
2465+需要注意的是,只要SSH服务存在,SFTP通道通常是可行的。而且当bazaar安装服务器上不能提供 ``bzr+ssh://`` 接口的时候这是一个很好的选择。傻瓜服务器相对于本地的协议来是要慢一点的,因为他们是纯粹的服务器,但是当软件和协议在服务器或是网络上使用受限时,他们是一个很好的选择。
2466+
2467+
2468+基于HTTP(S)的智能服务器
2469+-----------------------
2470+
2471+Bazaar可以使用本地的协议来进行HTTP或是HTTPS请求。由于HTTP是一个在很多网络上都使用的网络协议,如果SSH接口不能实现的话这可以是一个很好的选择。这一设置的另外一个好处是,所有对HTTP服务器(basic, LDAP, ActiveDirectory等)适用的身份验证和接入控制的方法同样适用于bazaar分支。更多的关于用Apache和FastCGI或是mod_python,WSGI来建立这种接口的信息在 `用户指南的智能服务器章节 <../user-guide/http_smart_server.html>`_ 中。
2472+
2473+
2474+直接的智能服务器通道
2475+--------------------
2476+
2477+被 ``bzr+ssh://`` 使用的内置服务器在一个专用的端口同样可以用作长久的服器。bazaar的官方端口是4155,但端口可以配置。更多关于通过端口监视程序或直接从shell运行bazaar的智能服务器信息在 `用户指南 <../user-guide/server.html#inetd>`_ 中。专用的bazaar服务器目前还没有身份验证,所以该服务器默认只提供只读权限。他可以进行 ``--allow-writes`` 选项,但智能服务器不提供任何附加的接入控制,所以可能会让一些无意的人改变了分支(当然也可以恢复)。如果用户在服务器的文件系统上有写的权限,那任何接入服务器4155端口的人都能对存放在那的分支进行修改。
2478+
2479
2480=== added file 'doc/ch/admin-guide/security.txt'
2481--- doc/ch/admin-guide/security.txt 1970-01-01 00:00:00 +0000
2482+++ doc/ch/admin-guide/security.txt 2012-11-23 02:18:19 +0000
2483@@ -0,0 +1,57 @@
2484+安全
2485+====
2486+
2487+身份认证
2488+--------
2489+
2490+Bazaar的身份认证思想是最好使用已存在的身份验证技术,而不是尝试重新创造可能的方法来进行安全的用户验证。这样的话,我们描述使用两个已经存在的软件的使用方法来达到身份验证的目的。
2491+
2492+使用SSH
2493+~~~~~~~~
2494+
2495+对于身份验证的用户来说SSH是一种经过很好测试的,很有特色的技术。对于所有开发者在服务器上都有本地账户的情况,提供安全的 ``bzr+ssh://`` 身份认证接口是十分寻常的。这种方法需要关心的一点是,它让开发者不满意的地方是不能在服务器机子上使用shell接入。既然如此,bazaar提供了 ``bzr_ssh_path_limiter`` 脚本,这一脚本能够以特定的路径在服务器机子上运行bazaar的智能服务器,而不允许任何其他的接入。
2496+
2497+要设置它,需要::
2498+
2499+ command="/path/to/bzr_ssh_path_limiter <path>" <typical key line>
2500+
2501+在服务器上每一个用户的 ``~/.ssh/authorized_keys`` 文件中指出,其中 `<path>` 就是接入受限的路径(以及它的主目录)。关于 ``authorized_keys`` 文件中句法的文档,请查看SSH服务器上的文档。这将只允许bazaar接入指定的路径,而不为用户提供其他的SSH接入。
2502+
2503+如果在服务器上不需要给每一个用户一个帐号,那么只需要用 ``~sshuser/.ssh/authorized_keys`` 文件下的一个单个的SSH帐号来包含多个公/私密钥对。而且每一个开发者可以授予他们自己的私钥。然后他们可以使用 ``bzr+ssh://sshuser@server.example.com/`` URLs来访问服务器。
2504+
2505+使用HTTP身份验证的方法
2506+~~~~~~~~~~~~~~~~~~~~~~
2507+
2508+接入控制
2509+---------
2510+
2511+很多工程都需要对对分支有读写权限的人有很好的接入控制。包括操作系统层的组用户和文件系统权限的控制,这都是十分困难的,在某些情况下甚至是不允许的。bazaar提供了一个名为 ``bzr_access`` 的脚本用来进行接入控制,这一脚本是基于用户名进行的,而且通过SSH来进行身份验证。要达到这样的目的,我们需要在SSH上建立私钥验证。这可以通过使用服务器上单个的SSH账户或是一个用户一个帐号的方法来实现。核心思想是用SSH的 ``authorized_keys`` 文件来指明 ``bzr_access`` 脚本,只有被特定的密钥对验证了的用户才能够运行这一命令。
2512+
2513+首先,您需要为所有有可能接入到库的用户产生一个公/私密钥对。私钥需要传送给用户,而公钥需要在服务器上来验证该用户。在服务器上,在SSH用户的 ``~/.ssh/authorized_keys`` 文件中,每一个库使用者和相一致的公钥要使用下面这一行代码::
2514+
2515+ command="/path/to/bzr_access /path/to/bzr /path/to/repository <username>",no- port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-<type> <key>
2516+
2517+其中 `<key>` (可能很长)就是公钥, `<type>` 就是SSH密钥的类型, `<username>` 就是和那公钥相关联的用户名。
2518+
2519+从 ``/path/to/repository/bzr_access.conf`` 文件中我们可以看到 ``bzr_access`` 包含它的配置信息。该文件不应该放在位于 ``/path/to/repository`` 的版本控制分支上,因为那样将允许所有能够接入库的人来改变接入控制的规则。 ``bzr_access.conf`` 文件是一个简单INI-style的形式,有些章节是由 ``[groups]`` 和 ``[/]`` 来定义的。 ``[groups]`` 章节的选项是组的名称,那些选项的值应该是组中用户的名称。在 ``[/]`` 章节中,选项应该是用户名或是组的名称(以 ``@`` 为前缀,值是 ``rw``, ``r`` 或者为空,表示可读写、只读和不可访)。 ``bzr_access.conf`` 的一个简单的例子是这样的::
2520+
2521+ [groups]
2522+ admins = alpha
2523+ devels = beta, gamma, delta
2524+
2525+ [/]
2526+ @admins = rw
2527+ @devels = r
2528+ upsilon =
2529+
2530+其中,用户的值是 `alpha` ,那他有读写的权限,是 `beta`, `gamma` 和 `delta` 的话,有只读的权限,是 `upsilon` 的话,那他将不能够访问 ``/path/to/repository`` 目录下的分支。
2531+
2532+关于bzr_access的额外考虑
2533+~~~~~~~~~~~~~~~~~~~~~~~~
2534+
2535+如刚刚所写, ``bzr_access`` 只允每个公钥关联到一个单个的库地址。这意味着如果开发者需要访问两个或者更多不同的库时,那么他们需要两个或是更多SSH私钥而且能够选择其中的两个(查看 ``man ssh`` 了解更多关于配置多密钥的信息)。
2536+
2537+而且,每一个库只能有一个单一的配置文件,有分支中所有库的接入配置,这意味着如果不同的项目需要不同的接入准则,那么那些项目必须在不同的库中。那就像刚刚描述的那样,多个私钥是十分有必要的。
2538+
2539+最后,像以上讲述的那样,在 `使用SSH`_ 的前提下,所有的公钥都应该包含在服务器上单个用户的 ``authorized_keys`` 文件中。所有的开发者使用一个单个的公/私密钥对也是有可能的,但只允许一个单一的用户名控制接入库(因为用户名关联到 ``authorized_keys`` 中的私钥)。但是这似乎很有可能违背接入控制的目的,虽然像之前所说的它提供了受限的SSH接入。
2540+
2541
2542=== added file 'doc/ch/admin-guide/simple-setups.txt'
2543--- doc/ch/admin-guide/simple-setups.txt 1970-01-01 00:00:00 +0000
2544+++ doc/ch/admin-guide/simple-setups.txt 2012-11-23 02:18:19 +0000
2545@@ -0,0 +1,90 @@
2546+简单配置
2547+========
2548+
2549+考虑到下面这个简单场景,我们将把Bazaar分支放在一个单个的服务器上。这些分支在 ``/srv/bzr`` (或者 ``C:\bzr``) 的子目录上并且他们将被关联到一个叫做"ProjectX"的单个工程中。ProjectX将会有一个主分支和至少一个特征分支。当我们逐步深入的时候,我们将考虑其他的方案,但这将是一个十分生动的例子。
2550+
2551+智能服务器
2552+----------
2553+
2554+为外部提供途径来访问服务器上的分支的最简单可行的办法是使用bazaar内置的,提供SSH通道的智能服务器。这样,通过SSH能访问你的服务器的人对你服务器上的分支就有读写的权限。这一配置使用了SSH的身份验证机制包括私钥和服务器系统的接入控制机制。特别的,在服务器上使用了“组”的概念,这样使得为不同的开发者提供不同的接入权限变成了可能。
2555+
2556+.. _SSH: http://www.openssh.org/
2557+
2558+配置
2559+~~~~
2560+
2561+在服务器上除了安装好bazaar以及为你的开发者提供的可行的SSH接入,不再需要其他的配置。通过SSH的配置可以限制开发者使用 *除* bazaar以外的其他任何东西,以此可以限制他们访问文件系统的特定部分。
2562+
2563+客户端
2564+~~~~~~
2565+
2566+客户可以使用以 ``bzr+ssh://`` 为前缀的URLs来访问分支。例如:要得到ProjectX主干的一个本地副本,开发者可以这样做::
2567+
2568+ $ bzr branch bzr+ssh://server.example.com/srv/bzr/projectx/trunk projectx
2569+
2570+如果开发者对 ``/srv/bzr/projectx`` 目录有写的权限,他们可以创建他们自己使用的新的分支::
2571+
2572+ $ bzr branch bzr+ssh://server.example.com/srv/bzr/projectx/trunk \
2573+ bzr+ssh://server.example.com/srv/bzr/projectx/feature-gui
2574+
2575+当然,如果没有这些需求,开发者对 ``/srv/bzr/projectx`` 目录将不会有写的权限。
2576+
2577+进一步的配置
2578+~~~~~~~~~~~~
2579+
2580+对于一个有多个相关分支的工程,最好的方式是使用一个共享的库来存放这些分支。可以这样做::
2581+
2582+ $ cd /srv/bzr
2583+ $ bzr init-repo --no-trees projectx
2584+
2585+``--no-trees`` 选项通过不备份服务器上文件系统的工作文档来节约空间。而且,所有创建在 ``/srv/bzr/projectx`` (参考 `Migration <migration.html>`_ 寻求一些方法)目录下的分支都共享存储空间,这样对于那些有很多共同修改部分的分支来说是很有好处的,比如说一个工程的主分支与特征分支。
2586+
2587+如果bazaar没有安装为用户的路径或是在SSH配置中没有指出,客户可以使用 ``BZR_REMOTE_PATH`` 环境变量来具体的指出它的路径。例如:如果bazaar是安装在 ``/usr/local/bzr-2.0/bin/bzr`` 目录下的,那开发者可以这样做::
2588+
2589+ $ BZR_REMOTE_PATH=/usr/local/bzr-2.0/bin/bzr bzr info \
2590+ bzr+ssh://server.example.com/srv/bzr/proectx/trunk
2591+
2592+以此来获得该主分支的信息.远程的路径同样能够在bazaar配置文档的特定位置中指出。阅读 ``bzr help configuration`` 获得更多信息。
2593+
2594+如果开发者在服务器上有家目录,他们可以在URLs中使用 ``/~/`` 来访问他们的家目录。他们同样可以使用 ``/~username/`` 来访问他们家目录中的用户username。例如:如果有两个开发者 ``alice`` 和 ``bob`` ,bob可以使用::
2595+
2596+ $ bzr log bzr+ssh://server.example.com/~/fix-1023
2597+
2598+来访问他的一个错误修复分支,且::
2599+
2600+ $ bzr log bzr+ssh://server.example.com/~alice/fix-2047
2601+
2602+来访问alice的分支。 [#]_
2603+
2604+.. [#] 服务器上安装的bazaar必须是2.1.0b1版本或是更高的版本才能支持在bzr+ssh URLs中使用 ``/~/`` 。
2605+
2606+
2607+用一个受限的SSH账户来组织多用户和库
2608+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2609+
2610+一旦用一个bzr+ssh的配置来使用一个可共享的库,你也许想要在一个开发者小组中共享这个库。使用共享的SSH接入可以完成这项任务,而不需要任何复杂的配置或是不间断的管理。
2611+
2612+为了允许多用户通过ssh来访问bazaar,我们可以允许ssh有权接入一个共用的账户,这个帐户只允许运行一个特定的命令。用一个单一的账户简化了调度,因为对于文件系统来说权限管理问题不存在了。在服务器的层次上,所有的用户都是一样的了。bazaar将不同用户的请求作上标签,这样就不需要将服务器上的账户分开了。
2613+
2614+为了保证这一配置,我们更新 ``~/.ssh/authorized_keys`` 目录来为那些相关的用户提供受限的命令。
2615+
2616+在这些例子中,用户被称为 ``bzruser`` 。
2617+
2618+下面的例子展示了一个单一的线路是怎样配置的::
2619+
2620+ 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
2621+
2622+这一条命令使得用户只允许访问bzr而废除了SSH的其他用途。对于 ``/srv/bzr`` 目录下每一个库的写权限已经通过--allow-writes授予了,同时对于那些只要求读权限的个别用户,写权限也可以被禁用。对于每一个用户,目录结构的根也能够被改变而让他们只看到库的主干。下面的例子假设alice和bob有两个分开的库。这种方法将不允许你限制访问库的一部分,你也许只被限制访问目录结构的一个单一部分::
2623+
2624+ 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
2625+ 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
2626+ 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
2627+
2628+Ailce和bob都能够访问他们各自的库,repo管理员能够访问他们两个中的任何一个人的库。用户不被允许访问系统的任何一部分除非在目录中特别指出了。提供的 ``bzr serve`` 和 ``--directory`` 选项简化了bzr+ssh URLs。如果alice登录了,她的fix-1023分支可以使用以下命令::
2629+
2630+ $ bzr log bzr+ssh://bzruser@server.example.com/fix-1023
2631+
2632+如果repo管理员登录了,他可以使用以下的命令来访问alice的fix-1023分支::
2633+
2634+ $ bzr log bzr+ssh://bzruser@server.example.com/alice/fix-1023
2635+
2636
2637=== added file 'doc/ch/admin-guide/upgrade.txt'
2638--- doc/ch/admin-guide/upgrade.txt 1970-01-01 00:00:00 +0000
2639+++ doc/ch/admin-guide/upgrade.txt 2012-11-23 02:18:19 +0000
2640@@ -0,0 +1,29 @@
2641+升级
2642+====
2643+
2644+Bazaar致力于内部版本的通用性,无论在磁盘上还是网络上。在服务器上新的客户端应该能够和旧的版本交互(也许速度不是很理想),而且在服务器上旧的客户端也应该能和bazaar的新版本交流。这一原则的分歧是考虑错误和在之后的版本中解决这些错误。
2645+
2646+也就是说,bazaar是不断改善的,而且很多当前的版本都是最有特色,有很好的表现的。特别的,bazaar 2.0和之后的版本较之前的版本有很重要的优点,包括更紧密的磁盘格式,更快的网络运行和整体工作性能的提升。伴随着2.0版本的发放,bazaar开始变为了稳定版/开发版的模式,而且2.x系列维持了bug修复版本的发放长达六个月。同时2.(x+1)系列发展成了每月发放的beta版本,适合于每天的使用。bazaar的发展有一个稳定的主线和一个拓展的测试套件,所以不需要担心开发版系列的日常使用,它改变的要比稳定版频繁。很多的用户运行的是开发版的bazaar而且经常的升级,包括很多bazaar开发者自身。
2647+
2648+
2649+软件升级
2650+--------
2651+
2652+更新bazaar的软件包就像用windows或是Mac OS X下最新的二进制包重新安装python包一样的简单,二进制包由你的GUN/Linux分布提供,或者从发布的源中安装。查看 http://wiki.bazaar.canonical.com/Downloads 了解最新发布的所有支持的平台。
2653+
2654+Bazaar之后的版本支持所有早期版本的磁盘格式,所以在更新软件时不需要对磁盘上的分支进行更新。为了更好的使用新的功能,可能需要在服务器和开发者的机子上都更新版本,这不要求客户端或是服务器上已经先升级了。
2655+
2656+
2657+磁盘格式的升级
2658+--------------
2659+
2660+在发展演变中,bazaar使用过顺序的磁盘格式来提高储存的效率和速度。随着2.0版本新的磁盘格式的发放,保持了这种磁盘格式直到3.0版本的发布,目前还没有计划出新的版本(bazaar2.0大致是bazaar1.0发布两年后发布的)。其结果,磁盘格式的升级几乎是极其罕见的。
2661+
2662+如果在旧版本的格式中存在分支,而且你想要将它升级到最新的版本,你可以查看2.0升级指南来了解更多的信息。从系统管理员的观点来看,在这一过程中协调各种升级的时机是很重要的。接下来,开发者的任何本地的镜像都需要被升级。最后,开发者的本地分支需要被升级。这些升级当他们运行时需要一个合适的版本(通过网络来对分支进行远程升级是有可能的,但是这可能很慢)。
2663+
2664+
2665+插件升级
2666+---------
2667+
2668+当bazaar的版本升级的时候,bazaar API使用的插件也需要被升级来反映API的变化。有些插件对于bazaar API的版本有很严格的版本依赖。如果是这种情况,你需要确保你依赖的插件在你的bazaar版本升级之前已经升级了,避免出现你的插件在新安装的bazaar版本中不能使用的情况。如果真的发生了,解决的方法是安装你的插件之前确实能够工作的bazaar版本。对于安装,依赖很多的插件,这种版本升级应该在安全的沙盒中进行过测试来保证bazaar的完整的采集和插件能够一起工作。
2669+
2670
2671=== added file 'doc/ch/conf.py'
2672--- doc/ch/conf.py 1970-01-01 00:00:00 +0000
2673+++ doc/ch/conf.py 2012-11-23 02:18:19 +0000
2674@@ -0,0 +1,106 @@
2675+# -*- coding: utf-8 -*-
2676+#
2677+# Bazaar documentation build configuration file, created by
2678+# sphinx-quickstart on Tue Jul 21 17:04:52 2009.
2679+#
2680+# This file is execfile()d with the current directory set to its containing dir.
2681+
2682+import sys, os
2683+
2684+# If extensions (or modules to document with autodoc) are in another directory,
2685+# add these directories to sys.path here. If the directory is relative to the
2686+# documentation root, use os.path.abspath to make it absolute, like shown here.
2687+sys.path = [os.path.abspath('../..')] + sys.path
2688+
2689+# Most of the configuration for Bazaar docs is defined here ...
2690+from bzrlib.doc_generate.conf import *
2691+
2692+## Configuration specific to this site ##
2693+
2694+# The locale code for this documentation set
2695+bzr_locale = 'ch'
2696+
2697+# Translations & supporting helper function
2698+bzr_titles = {
2699+ u'Table of Contents (%s)': u'目录(%s)',
2700+ u'Bazaar User Guide': u'Bazaar用户手册',
2701+ u'Bazaar User Reference': u'Bazaar用户索引',
2702+ u'Bazaar Release Notes': u'Bazaar发布日志',
2703+ u'Bazaar Upgrade Guide': None,
2704+ u"Bazaar System Administrator's Guide": u'Bazaar系统管理员手册',
2705+ u'Bazaar in five minutes': u'五分钟学会Bazaar',
2706+ u'Bazaar Tutorial': None,
2707+ u'Using Bazaar With Launchpad': u'将Bazaar与Launchpad结合使用',
2708+ u'Centralized Workflow Tutorial': None,
2709+ u"What's New in Bazaar 2.1?": None,
2710+ }
2711+def bzr_title(s):
2712+ return bzr_titles.get(s) or s
2713+
2714+# A shorter title for the navigation bar. Default is the same as html_title.
2715+html_short_title = bzr_title(u"Table of Contents (%s)") % (release,)
2716+
2717+# Additional templates that should be rendered to pages, maps page names to
2718+# template names.
2719+html_additional_pages = {'index': 'index.html'}
2720+
2721+# Output file base name for HTML help builder.
2722+htmlhelp_basename = 'bzr-%s' % (bzr_locale,)
2723+
2724+# Grouping the document tree into files. List of tuples
2725+# (source start file, target name, title, author, documentclass [howto/manual]).
2726+bzr_documents = [
2727+ # Manuals
2728+ ('user-guide/index', 'bzr-%s-user-guide' % (bzr_locale,),
2729+ bzr_title(u'Bazaar User Guide'), bzr_team, 'manual'),
2730+ ('user-reference/index', 'bzr-%s-user-reference' % (bzr_locale,),
2731+ bzr_title(u'Bazaar User Reference'), bzr_team, 'manual'),
2732+ ('release-notes/index', 'bzr-%s-release-notes' % (bzr_locale,),
2733+ bzr_title(u'Bazaar Release Notes'), bzr_team, 'manual'),
2734+ ('upgrade-guide/index', 'bzr-%s-upgrade-guide' % (bzr_locale,),
2735+ bzr_title(u'Bazaar Upgrade Guide'), bzr_team, 'manual'),
2736+ ('admin-guide/index', 'bzr-%s-admin-guide' % (bzr_locale,),
2737+ bzr_title(u"Bazaar System Administrator's Guide"), bzr_team, 'manual'),
2738+ # Tutorials
2739+ ('mini-tutorial/index', 'bzr-%s-tutorial-mini' % (bzr_locale,),
2740+ bzr_title(u'Bazaar in five minutes'), bzr_team, 'howto'),
2741+ ('tutorials/tutorial', 'bzr-%s-tutorial' % (bzr_locale,),
2742+ bzr_title(u'Bazaar Tutorial'), bzr_team, 'howto'),
2743+ ('tutorials/using_bazaar_with_launchpad',
2744+ 'bzr-%s-tutorial-with-launchpad' % (bzr_locale,),
2745+ bzr_title(u'Using Bazaar With Launchpad'), bzr_team, 'howto'),
2746+ ('tutorials/centralized_workflow',
2747+ 'bzr-%s-tutorial-centralized' % (bzr_locale,),
2748+ bzr_title(u'Centralized Workflow Tutorial'), bzr_team, 'howto'),
2749+ ('whats-new/whats-new-in-2.1', 'bzr-%s-whats-new' % (bzr_locale,),
2750+ bzr_title(u"What's New in Bazaar 2.1?"), bzr_team, 'howto'),
2751+]
2752+
2753+latex_documents = [
2754+ (start, target+'.tex', title, author, doc_class)
2755+ for start, target, title, author, doc_class in bzr_documents
2756+ ]
2757+
2758+texinfo_documents = [
2759+ (start, target, title, author, doc_class)
2760+ for start, target, title, author, doc_class in bzr_documents
2761+ ]
2762+
2763+# List of documents that shouldn't be included in the build.
2764+unused_docs = [
2765+ # Subtopics that get included
2766+ 'upgrade-guide/overview',
2767+ 'upgrade-guide/data_migration',
2768+ 'upgrade-guide/tips_and_tricks',
2769+ # Plain-style documentation generation stuff
2770+ 'release-notes/NEWS',
2771+ 'user-reference/bzr_man',
2772+ 'user-guide/index-plain',
2773+ 'admin-guide/index-plain',
2774+ # Templates
2775+ 'release-notes/release-template',
2776+ 'release-notes/series-template',
2777+ # Miscellaneous
2778+ 'user-reference/readme',
2779+]
2780+
2781
2782=== added file 'doc/ch/index.txt'
2783--- doc/ch/index.txt 1970-01-01 00:00:00 +0000
2784+++ doc/ch/index.txt 2012-11-23 02:18:19 +0000
2785@@ -0,0 +1,20 @@
2786+.. Bazaar documentation master file, created by
2787+ sphinx-quickstart on Tue Jul 21 17:04:52 2009.
2788+ You can adapt this file completely to your liking, but it should at least
2789+ contain the root `toctree` directive.
2790+
2791+
2792+Table of Contents
2793+=================
2794+
2795+.. toctree::
2796+ :maxdepth: 1
2797+
2798+ whats-new/whats-new-in-2.6
2799+ user-guide/index
2800+ tutorials/index
2801+ quick-reference/index
2802+ release-notes/index
2803+ upgrade-guide/index
2804+ user-reference/index
2805+ admin-guide/index
2806
2807=== added directory 'doc/ch/mini-tutorial'
2808=== added file 'doc/ch/mini-tutorial/index.txt'
2809--- doc/ch/mini-tutorial/index.txt 1970-01-01 00:00:00 +0000
2810+++ doc/ch/mini-tutorial/index.txt 2012-11-23 02:18:19 +0000
2811@@ -0,0 +1,212 @@
2812+======================
2813+五分钟快速学习Bazaar
2814+======================
2815+
2816+介绍
2817+============
2818+
2819+Bazaar是一个分布式的版本控制系统,它让人们更容易在软件项目中协同工作。
2820+
2821+在接下来的五分钟,您将学习如何在版本控制下放您的文件,如何记录它们的更改,检查您的工作,发布它并发送您的工作融合到项目的主干中。
2822+
2823+
2824+安装
2825+============
2826+
2827+本指南不介绍如何安装Bazaar,但它通常非常容易。您可以找到安装说明:
2828+
2829+- **GNU/Linux:** Bazaar可能已经在您的GNU/Linux发行版中。
2830+- **Windows:** `Windows安装说明`_.
2831+- **Mac OS X:** `Mac OS X安装说明`_.
2832+
2833+对于其他平台并从源代码安装,请看 Download_ 页和 Installation_ 页。
2834+
2835+.. _Windows安装说明: http://wiki.bazaar.canonical.com/WindowsDownloads
2836+.. _Mac OS X安装说明: http://wiki.bazaar.canonical.com/MacOSXBundle
2837+.. _Download: http://wiki.bazaar.canonical.com/Download
2838+.. _Installation: http://wiki.bazaar.canonical.com/InstallationFaq
2839+
2840+
2841+自我介绍
2842+====================
2843+
2844+Bazaar记录源代码的更改,并记录谁做了更改。这个人是通过他的名字和电子邮件地址来识别的。(如果您担心垃圾邮件,您不需要使用一个实际上您会读的真邮件地址。但约定是,它看起来像一个电子邮件地址。)
2845+
2846+在您开始工作之前,需要先告诉Bazaar您是谁。用您的名字和邮件地址替代John Doe的名字和邮件地址。范例为::
2847+
2848+ $ bzr whoami "John Doe <john.doe@gmail.com>"
2849+
2850+您可以核对什么身份被写进了Bazaar的配置文件中::
2851+
2852+ $ bzr whoami
2853+ John Doe <john.doe@gmail.com>
2854+
2855+
2856+启动新的项目
2857+======================
2858+
2859+假设我们要在Bazaar下存储一个新的项目。首先,我们要创建一个 *库目录* 来保存与此项目有关的所有工作。在库目录下开发人员可以创建分支来进行特定功能的测试开发或者,更一般的,进行工作文件设置的修改。
2860+
2861+创建库之后,切换到该目录,并创建项目的主干分支。
2862+
2863+::
2864+
2865+ $ bzr init-repo sample
2866+ Shared repository with trees (format: 2a)
2867+ Location:
2868+ shared repository: sample
2869+ $ bzr init sample/trunk
2870+ $ cd sample/trunk
2871+ Created a repository tree (format: 2a)                                         
2872+ Using shared repository: /home/john/sample/
2873+
2874+
2875+添加文件
2876+============
2877+
2878+现在我们有主干,我们需要移动到该目录,并为该项目的第一个版本创建一些示例文件。用文本编辑器(如emacs,nano或notepad)创建一个文件 ``test1.txt`` ,并保存。然后我们将"添加"文件,以此来告诉Bazaar我们想要它跟踪更改::
2879+
2880+ bzr add test1.txt
2881+
2882+然后提交,从而节省了所有版本文件的快照::
2883+
2884+ bzr commit -m "Added first line of text"
2885+
2886+
2887+更改文件
2888+============================
2889+
2890+
2891+我们更改一个文件,并提交更改到您的分支。
2892+
2893+在您最常用的编辑器中编辑文件 ``test1.txt`` ,然后用 ``bzr add`` 来告诉Bazaar跟踪这个文件的更改::
2894+
2895+ $ echo test test test > test1.txt
2896+ $ bzr add test1.txt
2897+ adding test1.txt
2898+
2899+`bzr diff` 显示这个分支和当前树(或者加上 ``-r`` 选项,显示任意的两树)中上个版本的更改。::
2900+
2901+ $ bzr diff
2902+ === modified file 'test1.txt'
2903+ --- test1.txt 2007-10-08 17:56:14 +0000
2904+ +++ test1.txt 2007-10-08 17:46:22 +0000
2905+ @@ -0,0 +1,1 @@
2906+ +test test test
2907+
2908+提交您的工作到Bazaar分支::
2909+
2910+ $ bzr commit -m "Added first line of text"
2911+ Committing to: /home/john/sample/trunk/                             
2912+ added test1.txt
2913+ Committed revision 1.
2914+
2915+查看修改日志
2916+========================
2917+
2918+您能通过浏览分支日志来查看分支的历史::
2919+
2920+ $ bzr log
2921+ revno: 1
2922+ committer: John Doe <john.doe@gmail.com>
2923+ branch nick: trunk
2924+ timestamp: Mon 2006-10-08 17:46:22 +0000
2925+ message:
2926+ Initial import
2927+
2928+
2929+在Launchpad上发布您的分支
2930+===================================
2931+
2932+Launchpad是软件项目的一套开发和托管工具。您能用它来发布您的分支。(您也可以发布分支到您自己的服务器或其它的托管服务。)
2933+
2934+在Launchpad上发布分支的步骤是:
2935+
2936+1. 创建一个Launchpad账户:访问 `Launchpad注册页面`_ 并选择创建一个新账户。
2937+
2938+.. _Launchpad注册页面: https://launchpad.net/+login
2939+
2940+2. Bazaar用SSH加解密和认证协议来连接到Launchpad。首先您需要在您自己的电脑上 `创建SSH密钥`_ ,运行命令::
2941+
2942+ $ ssh-keygen
2943+
2944+.. _创建SSH密钥: https://help.launchpad.net/YourAccount/CreatingAnSSHKeyPair
2945+
2946+3. `上传您的SSH公钥到Launchpad`_.
2947+
2948+.. _上传您的SSH公钥到Launchpad: https://launchpad.net/~/+editsshkeys
2949+
2950+4. `为您的项目创建团队`_. 即使开始时只有您一个人作为这个项目的开发人员,现在创建一个新的团队也会让您在以后加入其他人时更容易。
2951+
2952+.. _为您的项目创建团队: https://help.launchpad.net/Teams/CreatingAndRunning
2953+
2954+5. `创建项目`_.
2955+
2956+.. _创建项目: https://help.launchpad.net/Projects/Registering
2957+
2958+6. 告诉Bazaar您的Launchpad账户名。如果您的账户是john.doe,格式为 ::
2959+
2960+ $ bzr launchpad-login john.doe
2961+
2962+7. `推送您项目的分支`_ 。一旦您在本地提交了您的更改,您可以将它们作为新项目的主干发布,命令如下:
2963+
2964+ $ bzr push lp:~sample-developers/sample/trunk
2965+
2966+ (当然,使用团队和项目的名字就是您来选择了。)
2967+
2968+.. _推送您项目的分支: https://help.launchpad.net/Code/UploadingABranch
2969+
2970+制作您自己的其他分支副本
2971+========================================
2972+
2973+使用别人的代码来工作,您可以制作您自己的他们分支的副本。我们举一个真实的例子,Bazaar的GTK接口::
2974+
2975+ $ bzr init-repo ~/bzr-gtk
2976+ $ bzr branch lp:~bzr/bzr-gtk/trunk ~/bzr-gtk/john
2977+ Branched 292 revision(s).
2978+
2979+Bazaar将从bzr-gtk项目的主干分支下载所有的文件和完整的修订历史记录,并创建一个叫 ``john`` 的副本。
2980+
2981+现在,您有自己的分支副本,并且您可以在联网或不联网下提交更改。您可以在任何时候发布分支来分享您的分支,如果bzr-gtk团队要用到您的工作时,Bazaar让他们融合您的分支回到他们的主分支很容易。
2982+
2983+
2984+从主分支更新您的分支
2985+=========================================
2986+
2987+您提交更改到您的分支时,有可能其他人也继续提交代码到父分支。
2988+
2989+为了确保您的分支保持最新,您应该融合父分支上的更改到您的个人分支中::
2990+
2991+ $ bzr merge
2992+ Merging from saved parent location: http://bazaar.launchpad.net/~bzr/bzr-gtk/trunk
2993+ All changes applied successfully.
2994+
2995+核对什么东西被更改过::
2996+
2997+ $ bzr diff
2998+
2999+如果不同分支进行了相同文件的相同地方的修改,融合它们时可能会产生冲突。当这种情况发生时,Bazaar会放置像 ``<<<<<<<`` 的文本标记到文件中,并将它们记录到一个冲突文件列表。您应该编辑文件以反映您所希望的方式来解决冲突,用 ``bzr diff`` 命令来核对更改,然后用 ``bzr resolve`` 命令将它们标记为解决。
3000+
3001+如果您对更改满意,您可以提交它们到您的个人分支::
3002+
3003+ $ bzr commit -m "Merge from main branch"
3004+ Committed revision 295.
3005+
3006+
3007+学习更多
3008+=============
3009+
3010+在 `Bazaar User Guide <../user-guide/index.html>`_ 里,您能找到关于Bazaar更多的东西。
3011+
3012+在命令行上学习Bazaar::
3013+
3014+ $ bzr help
3015+
3016+学习''foo''规则或命令::
3017+
3018+ $ bzr help foo
3019+
3020+许可证
3021+=======
3022+
3023+版权所有2007-2011 Canonical有限公司。Bazaar是免费软件。在GNU通用公共许可证版本2或更高版本的条款下,您可以使用,修改和重新发布Bazaar和这个文档。请看<http://www.gnu.org/licenses/>.
3024
3025=== added directory 'doc/ch/tutorials'
3026=== added file 'doc/ch/tutorials/centralized_workflow.txt'
3027--- doc/ch/tutorials/centralized_workflow.txt 1970-01-01 00:00:00 +0000
3028+++ doc/ch/tutorials/centralized_workflow.txt 2012-11-23 02:18:19 +0000
3029@@ -0,0 +1,318 @@
3030+=============================
3031+Centralized Workflow Tutorial
3032+=============================
3033+
3034+
3035+Overview
3036+========
3037+
3038+This document describes a possible workflow for using Bazaar_. That of
3039+using Bazaar_, the distributed version control system, in a centralized
3040+manner. Bazaar_ is designed to be very flexible and allows several
3041+different workflows, from fully decentralized to mostly centralized. The
3042+workflow used here is meant to ease a new user into more advanced usage of
3043+Bazaar_, and allow them to work in a mix of centralized and decentralized
3044+operations.
3045+
3046+In general, this document is meant for users coming from a background of
3047+centralized version control systems such as CVS or subversion. It is
3048+common in work settings to have a single central server hosting the
3049+codebase, with several people working on this codebase, keeping their work
3050+in sync. This workflow is also applicable to a single developer working
3051+on several different machines.
3052+
3053+.. _Bazaar: http://bazaar.canonical.com
3054+
3055+
3056+Initial Setup
3057+=============
3058+
3059+These are some reasonably simple steps to setup Bazaar_ so that it works
3060+well for you.
3061+
3062+
3063+Setting User Email
3064+------------------
3065+
3066+Your user identity is stored with each commit. While this doesn't have to
3067+be accurate or unique, it will be used in log messages and
3068+annotations, so it is better to have something real.
3069+
3070+::
3071+
3072+ % bzr whoami "John Doe <jdoe@organization.com>"
3073+
3074+
3075+Setting up a local Repository
3076+-----------------------------
3077+
3078+Bazaar_ branches generally copy the history information around with them,
3079+which is part of how you can work in a fully decentralized manner. As an
3080+optimization, it is possible for related branches to combine their storage
3081+needs so that you do not need to copy around all of this history
3082+information whenever you create a new branch.
3083+
3084+The best way to do this is to create a `Shared Repository`_. In
3085+general, branches will share their storage if they exist in a
3086+subdirectory of a `Shared Repository`_. So let's set up a `Shared
3087+Repository`_ in our home directory, thus all branches we create
3088+underneath will share their history storage.
3089+
3090+::
3091+
3092+ % bzr init-repo --trees ~
3093+
3094+
3095+Setting up a remote Repository
3096+---------------------------------
3097+
3098+Many times you want a location where data is stored separately from where
3099+you do your work. This workflow is required by centralized systems
3100+(CVS/SVN). Usually they are on separate machines, but not always. This is
3101+actually a pretty good setup, especially in a work environment. Since it
3102+ensures a central location where data can be backed up, and means that if
3103+something happens to a developer's machine, no committed work has to be
3104+lost.
3105+
3106+So let's set up a shared location for our project on a remote machine
3107+called ``centralhost``. Again, we will use a
3108+`Shared Repository`_ to optimize disk usage.
3109+
3110+::
3111+
3112+ % bzr init-repo --no-trees bzr+ssh://centralhost/srv/bzr/
3113+
3114+You can think of this step as similar to setting up a new cvsroot, or
3115+subversion repository. The ``--no-trees`` option tells bzr to not
3116+populate the directory with a working tree. This is appropriate,
3117+since no one will be making changes directly in the branches within
3118+the central repository.
3119+
3120+Here we're using a ``bzr+ssh`` URL, which means to use Bazaar's own
3121+protocol on top of the SSH secure shell. See the Administrator Guide for
3122+information about setting up a bzr+ssh server.
3123+
3124+
3125+Migrating an existing project to Bazaar
3126+=======================================
3127+
3128+Now that we have a repository, let's create a versioned project. Most of
3129+the time, you will already have some code that you are working with,
3130+that you now want to version using Bazaar_. If the code was originally
3131+in source control, there are many ways to convert the project to Bazaar_
3132+without losing any history. However, this is outside the scope of this
3133+document. See `Tracking Upstream`_ for some possibilities (section
3134+"Converting and keeping history").
3135+
3136+.. _Tracking Upstream: http://wiki.bazaar.canonical.com/TrackingUpstream
3137+
3138+..
3139+ XXX: We really need a different document for discussing conversion of a
3140+ project. Right now TrackingUpstream is the best we have, though.
3141+
3142+
3143+Developer 1: Creating the first revision
3144+----------------------------------------
3145+
3146+So first, we want to create a branch in our remote Repository, where we
3147+want to host the project. Let's assume we have a project named
3148+"sigil" that we want to put under version control.
3149+
3150+::
3151+
3152+ % bzr init bzr+ssh://centralhost/srv/bzr/sigil
3153+
3154+This can be thought of as the "HEAD" branch in CVS terms, or as the "trunk"
3155+in Subversion terms. We will call this the ``dev`` branch.
3156+
3157+I prefer working in a subdirectory of my home directory to avoid collisions with all
3158+the other files that end up there. Also, we will want a project
3159+directory where we can hold all of the different branches we end up
3160+working on.
3161+
3162+::
3163+
3164+ % cd ~
3165+ % mkdir work
3166+ % cd work
3167+ % mkdir sigil
3168+ % cd sigil
3169+ % bzr checkout bzr+ssh://centralhost/srv/bzr/sigil dev
3170+ % cd dev
3171+ % cp -ar ~/sigil/* .
3172+ % bzr add
3173+ % bzr commit -m "Initial import of Sigil"
3174+
3175+
3176+In the previous section, we created an empty branch (the ``/sigil``
3177+branch) on ``centralhost``, and then checkout out this empty branch
3178+onto our workstation to add files from our existing project. There
3179+are many ways to set up your working directory, but the steps above
3180+make it easy to handle working with feature/bugfix branches. And one
3181+of the strong points of Bazaar_ is how well it works with branches.
3182+
3183+At this point, because you have a 'checkout' of the remote branch, any
3184+commits you make in ``~/work/sigil/dev/`` will automatically be saved
3185+both locally, and on ``centralhost``.
3186+
3187+
3188+Developer N: Getting a working copy of the project
3189+--------------------------------------------------
3190+
3191+Since the first developer did all of the work of creating the project,
3192+all other developers would just checkout that branch. **They should
3193+still follow** `Setting User Email`_ and `Setting up a local Repository`_.
3194+
3195+To get a copy of the current development tree::
3196+
3197+ % cd ~/work/sigil
3198+ % bzr checkout bzr+ssh://centralhost/srv/bzr/sigil dev
3199+
3200+Now that two people both have a checkout of
3201+``bzr+ssh://centralhost/srv/bzr/sigil``, there will be times when one of
3202+the checkouts will be out of date with the current version.
3203+At commit time, Bazaar_ will inform the user of this and prevent them from
3204+committing. To get up to date, use ``bzr update`` to update the
3205+tree with the remote changes. This may require resolving conflicts if the
3206+same files have been modified.
3207+
3208+
3209+Developing on separate branches
3210+===============================
3211+
3212+So far everyone is working and committing their changes into the same
3213+branch. This means that everyone needs to update fairly regularly and
3214+deal with other people's changes. Also, if one person commits something
3215+that breaks the codebase, then upon syncing, everyone will get the
3216+problem.
3217+
3218+Usually, it is better to do development on different branches, and then
3219+integrate those back into the main branch, once they are stable. This is
3220+one of the biggest changes from working with CVS/SVN. They both allow you
3221+to work on separate branches, but their merging algorithms are fairly
3222+weak, so it is difficult to keep things synchronized. Bazaar_ tracks
3223+what has already been merged, and can even apply changes to files that
3224+have been renamed.
3225+
3226+
3227+Creating and working on a new branch
3228+------------------------------------
3229+
3230+We want to keep our changes available for other people, even if they
3231+aren't quite complete yet. So we will create a new public branch on
3232+``centralhost``, and track it locally.
3233+
3234+::
3235+
3236+ % cd ~/work/sigil
3237+ % bzr branch bzr+ssh://centralhost/srv/bzr/sigil \
3238+ bzr+ssh://centralhost/srv/bzr/sigil/doodle-fixes
3239+ % bzr checkout bzr+ssh://centralhost/srv/bzr/sigil/doodle-fixes doodle-fixes
3240+ % cd doodle-fixes
3241+
3242+We now have a place to make any fixes we need to ``doodle``. And we would
3243+not interrupt people who are working on other parts of the code. Because
3244+we have a checkout, any commits made in the ``~/work/sigil/doodle-fixes/``
3245+will also show up on ``centralhost``. [#nestedbranches]_ It is also
3246+possible to have two developers collaborate on one of these branches, just
3247+like they would have collaborated on the ``dev`` branch. [#cbranch]_
3248+
3249+.. [#nestedbranches] It may look odd to have a branch in a subdirectory of
3250+ another branch. This is just fine, and you can think of it as a
3251+ hierarchical namespace where the nested branch is derived from the
3252+ outer branch.
3253+
3254+.. [#cbranch] When using lots of independent branches, having to retype
3255+ the full URL all the time takes a lot of typing. We are looking into
3256+ various methods to help with this, such as branch aliases, etc. For
3257+ now, though, the bzrtools_ plugin provides the ``bzr cbranch`` command.
3258+ Which is designed to take a base branch, create a new public branch,
3259+ and create a checkout of that branch, all with much less typing.
3260+ Configuring ``cbranch`` is outside the scope of this document, but the
3261+ final commands are similar to:
3262+
3263+::
3264+
3265+ % bzr cbranch dev my-feature-branch
3266+
3267+.. _bzrtools: http://wiki.bazaar.canonical.com/BzrTools
3268+
3269+
3270+Merging changes back
3271+--------------------
3272+
3273+When it is decided that some of the changes in ``doodle-fixes`` are ready
3274+to be merged into the main branch, simply do::
3275+
3276+ % cd ~/work/sigil/dev
3277+ % bzr merge ../doodle-fixes
3278+
3279+Now the changes are available in the ``dev`` branch, but they have not
3280+been committed yet. This is the time when you want to review the final
3281+changes, and double check the code to make sure it compiles cleanly and
3282+passes the test suite. The commands ``bzr status`` and ``bzr diff`` are
3283+good tools to use here. Also, this is the time to resolve any conflicts.
3284+Bazaar_ will prevent you from committing until you have resolved these
3285+conflicts. That way you don't accidentally commit the conflict markers.
3286+The command ``bzr status`` will show the conflicts along with the other
3287+changes, or you can use ``bzr conflicts`` to just list conflicts. Use
3288+``bzr resolve file/name`` or ``bzr resolve --all`` once conflicts have
3289+been handled. [#resolve]_ If you have a conflict that is particularly
3290+difficult to solve you may want to use the ``bzr remerge`` command. It
3291+will let you try different merge algorithms, as well as let you see the
3292+original source lines (``--show-base``).
3293+
3294+.. [#resolve] Some systems make you resolve conflicts as part of the merge
3295+ process. We have found that it is usually easier to resolve conflicts
3296+ when you have the view of the entire tree, rather than just a single
3297+ file. It gives you much more context, and also lets you run tests as
3298+ you resolve the problems.
3299+
3300+
3301+Recommended Branching
3302+---------------------
3303+
3304+One very common way to handle all of these branches is to give each
3305+developer their own branch, and their own place to work in the central
3306+location. This can be done with::
3307+
3308+ % bzr branch bzr+ssh://centralhost/srv/bzr/sigil \
3309+ bzr+ssh://centralhost/srv/bzr/sigil/user-a
3310+ % bzr branch bzr+ssh://centralhost/srv/bzr/sigil \
3311+ bzr+ssh://centralhost/srv/bzr/sigil/user-b
3312+
3313+This gives each developer their own branch to work on. And, they can
3314+easily create a new feature branch for themselves with just [#cbranch]_
3315+::
3316+
3317+ % bzr branch bzr+ssh://centralhost/srv/bzr/sigil/user-a \
3318+ bzr+ssh://centralhost/srv/bzr/sigil/user-a/feature
3319+ % cd ~/work/sigil
3320+ % bzr checkout bzr+ssh://centralhost/srv/bzr/sigil/user-a/feature myfeature
3321+
3322+
3323+Glossary
3324+========
3325+
3326+Shared Repository
3327+-----------------
3328+
3329+Bazaar_ has the concept of a "Shared Repository". This is similar to
3330+the traditional concept of a repository in other VCSs like CVS and
3331+Subversion. For example, in Subversion you have a remote repository,
3332+which is where all of the history is stored, and locally you don't
3333+have any history information, only a checkout of the working tree
3334+files. Note that "Shared" in this context means shared between
3335+branches. It *may* be shared between people, but standalone branches
3336+can also be shared between people.
3337+
3338+In Bazaar_ terms, a "Shared Repository" is a location where multiple
3339+branches can **share** their revision history information. In order to
3340+support decentralized workflows, it is possible for every branch to
3341+store its own revision history information. But this is often
3342+inefficient, since related branches share history, and they might as
3343+well share the storage as well.
3344+
3345+
3346+..
3347+ vim: tw=74 ft=rst spell spelllang=en_us
3348
3349=== added file 'doc/ch/tutorials/index.txt'
3350--- doc/ch/tutorials/index.txt 1970-01-01 00:00:00 +0000
3351+++ doc/ch/tutorials/index.txt 2012-11-23 02:18:19 +0000
3352@@ -0,0 +1,11 @@
3353+Tutorials
3354+=========
3355+
3356+.. toctree::
3357+ :maxdepth: 1
3358+
3359+ ../mini-tutorial/index
3360+ tutorial
3361+ using_bazaar_with_launchpad
3362+ centralized_workflow
3363+ licence
3364
3365=== added file 'doc/ch/tutorials/licence.txt'
3366--- doc/ch/tutorials/licence.txt 1970-01-01 00:00:00 +0000
3367+++ doc/ch/tutorials/licence.txt 2012-11-23 02:18:19 +0000
3368@@ -0,0 +1,7 @@
3369+Licence
3370+===============
3371+
3372+Copyright 2005-2011 Canonical Ltd. Bazaar is free software, and you
3373+may use, modify and redistribute both Bazaar and this document under
3374+the terms of the GNU General Public License version 2 or later. See
3375+<http://www.gnu.org/licenses/>.
3376
3377=== added file 'doc/ch/tutorials/tutorial.txt'
3378--- doc/ch/tutorials/tutorial.txt 1970-01-01 00:00:00 +0000
3379+++ doc/ch/tutorials/tutorial.txt 2012-11-23 02:18:19 +0000
3380@@ -0,0 +1,647 @@
3381+.. This file is in Python ReStructuredText format - it can be formatted
3382+.. into HTML or text. In the future we plan to extract the example commands
3383+.. and automatically test them.
3384+
3385+.. This text was previously on the wiki at
3386+.. http://bazaar.canonical.com/IntroductionToBzr
3387+.. but has been moved into the source tree so it can be kept in sync with
3388+.. the source and possibly automatically checked.
3389+
3390+===============
3391+Bazaar Tutorial
3392+===============
3393+
3394+
3395+Introduction
3396+============
3397+
3398+If you are already familiar with decentralized version control, then
3399+please feel free to skip ahead to "Introducing Yourself to Bazaar". If,
3400+on the other hand, you are familiar with version control but not
3401+decentralized version control, then please start at "How DVCS is
3402+different." Otherwise, get some coffee or tea, get comfortable and get
3403+ready to catch up.
3404+
3405+The purpose of version control
3406+==============================
3407+
3408+Odds are that you have worked on some sort of textual data -- the sources
3409+to a program, web sites or the config files that Unix system
3410+administrators have to deal with in /etc. The chances are also good that
3411+you have made some sort of mistake that you deeply regretted. Perhaps you
3412+deleted the configuration file for your mailserver or perhaps mauled the
3413+source code for a pet project. Whatever happened, you have just deleted
3414+important information that you would desperately like to get back. If this
3415+has ever happened to you, then you are probably ready for Bazaar.
3416+
3417+Version control systems (which I'll henceforth call VCS) such as
3418+Bazaar give you the ability to track changes for a directory by turning
3419+it into something slightly more complicated than a directory that we call
3420+a **branch**. The branch not only stores how the directory looks right
3421+now, but also how it looked at various points in the past. Then, when you
3422+do something you wish you hadn't, you can restore the directory to the way
3423+it looked at some point in the past.
3424+
3425+Version control systems give users the ability to save changes to a
3426+branch by "committing a **revision**". The revision created is essentially
3427+a summary of the changes that were made since the last time the tree was
3428+saved.
3429+
3430+These revisions have other uses as well. For example, one can comment
3431+revisions to record what the recent set of changes meant by providing an
3432+optional log message. Real life log messages include things like "Fixed
3433+the web template to close the table" and "Added SFTP suppport. Fixes #595"
3434+
3435+We keep these logs so that if later there is some sort of problem with
3436+SFTP, we can figure out when the problem probably happened.
3437+
3438+How DVCS is different
3439+=====================
3440+
3441+Many Version Control Systems (VCS) are stored on servers. If one wants to
3442+work on the code stored within a VCS, then one needs to connect to the
3443+server and "checkout" the code. Doing so gives one a directory in which a
3444+person can make changes and then commit. The VCS client then connects to
3445+the VCS server and stores the changes. This method is known as the
3446+centralized model.
3447+
3448+The centralized model can have some drawbacks. A centralized VCS requires
3449+that one is able to connect to the server whenever one wants to do version
3450+control work. This can be a bit of a problem if your server is on some other
3451+machine on the internet and you are not. Or, worse yet, you **are** on the
3452+internet but the server is missing!
3453+
3454+Decentralized Version Control Systems (which I'll call DVCS after this
3455+point) deal with this problem by keeping branches on the same machine as
3456+the client. In Bazaar's case, the branch is kept in the same place as
3457+the code that is being version controlled. This allows the user to save
3458+his changes (**commit**) whenever he wants -- even if he is offline. The
3459+user only needs internet access when he wants to access the changes in
3460+someone else's branch that are somewhere else.
3461+
3462+
3463+A common requirement that many people have is the need to keep track of
3464+the changes for a directory such as file and subdirectory changes.
3465+Performing this tracking by hand is a awkward process that over time
3466+becomes unwieldy. That is, until one considers version control tools such
3467+as Bazaar. These tools automate the process of storing data by creating
3468+a **revision** of the directory tree whenever the user asks.
3469+
3470+Version control software such as Bazaar can do much more than just
3471+storage and performing undo. For example, with Bazaar a developer can
3472+take the modifications in one branch of software and apply them to a
3473+related branch -- even if those changes exist in a branch owned by
3474+somebody else. This allows developers to cooperate without giving
3475+write access to the repository.
3476+
3477+Bazaar remembers the ''ancestry'' of a revision: the previous revisions
3478+that it is based upon. A single revision may have more than one direct
3479+descendant, each with different changes, representing a divergence in the
3480+evolution of the tree. By branching, Bazaar allows multiple people to
3481+cooperate on the evolution of a project, without all needing to work in
3482+strict lock-step. Branching can be useful even for a single developer.
3483+
3484+Introducing yourself to Bazaar
3485+==============================
3486+
3487+Bazaar installs a single new command, **bzr**. Everything else is a
3488+subcommand of this. You can get some help with ``bzr help``. Some arguments
3489+are grouped in topics: ``bzr help topics`` to see which topics are available.
3490+
3491+One function of a version control system is to keep track of who changed
3492+what. In a decentralized system, that requires an identifier for each
3493+author that is globally unique. Most people already have one of these: an
3494+email address. Bazaar is smart enough to automatically generate an email
3495+address by looking up your username and hostname. If you don't like the
3496+guess that Bazaar makes, then three options exist:
3497+
3498+1. Set an email address via ``bzr whoami``. This is the simplest way.
3499+
3500+ To set a global identity, use::
3501+
3502+ % bzr whoami "Your Name <email@example.com>"
3503+
3504+ If you'd like to use a different address for a specific branch, enter
3505+ the branch folder and use::
3506+
3507+ % bzr whoami --branch "Your Name <email@example.com>"
3508+
3509+#. Setting the email address in the ``~/.bazaar/bazaar.conf`` [1]_ by
3510+ adding the following lines. Please note that ``[DEFAULT]`` is case
3511+ sensitive::
3512+
3513+ [DEFAULT]
3514+ email=Your Name <email@isp.com>
3515+
3516+ As above, you can override this settings on a branch by branch basis
3517+ by creating a branch section in ``~/.bazaar/locations.conf`` and
3518+ adding the following lines::
3519+
3520+ [/the/path/to/the/branch]
3521+ email=Your Name <email@isp.com>
3522+
3523+
3524+#. Overriding the two previous options by setting the global environment
3525+ variable ``$BZR_EMAIL`` or ``$EMAIL`` (``$BZR_EMAIL`` will take
3526+ precedence) to your full email address.
3527+
3528+.. [1] On Windows, the users configuration files can be found in the
3529+ application data directory. So instead of ``~/.bazaar/branch.conf``
3530+ the configuration file can be found as:
3531+ ``C:\Documents and Settings\<username>\Application Data\Bazaar\2.0\branch.conf``.
3532+ The same is true for ``locations.conf``, ``ignore``, and the
3533+ ``plugins`` directory.
3534+
3535+Creating a branch
3536+=================
3537+
3538+History is by default stored in the .bzr directory of the branch. In a
3539+future version of Bazaar, there will be a facility to store it in a
3540+separate repository, which may be remote.
3541+
3542+We create a new branch by running ``bzr init`` in an existing directory::
3543+
3544+ % mkdir tutorial
3545+ % cd tutorial
3546+ % ls -a
3547+ ./ ../
3548+ % pwd
3549+ /home/mbp/work/bzr.test/tutorial
3550+ %
3551+ % bzr init
3552+ % ls -aF
3553+ ./ ../ .bzr/
3554+ %
3555+
3556+As with CVS, there are three classes of file: unknown, ignored, and
3557+versioned. The **add** command makes a file versioned: that is, changes
3558+to it will be recorded by the system::
3559+
3560+ % echo 'hello world' > hello.txt
3561+ % bzr status
3562+ unknown:
3563+ hello.txt
3564+ % bzr add hello.txt
3565+ added hello.txt
3566+ % bzr status
3567+ added:
3568+ hello.txt
3569+
3570+
3571+If you add the wrong file, simply use ``bzr remove`` to make it
3572+unversioned again. This does not delete the working copy in this case,
3573+though it may in others [2]_.
3574+
3575+.. [2] ``bzr remove`` will remove the working copy if it is currently
3576+ versioned, but has no changes from the last committed version. You
3577+ can force the file to always be kept with the ``--keep`` option to
3578+ ``bzr remove``, or force it to always be deleted with ``--force``.
3579+
3580+Branch locations
3581+================
3582+
3583+All history is stored in a branch, which is just an on-disk directory
3584+containing control files. By default there is no separate repository or
3585+database as used in svn or svk. You can choose to create a repository if
3586+you want to (see the ``bzr init-repo`` command). You may wish to do this
3587+if you have very large branches, or many branches of a moderately sized
3588+project.
3589+
3590+You'll usually refer to branches on your computer's filesystem just by
3591+giving the name of the directory containing the branch. bzr also supports
3592+accessing branches over SSH, HTTP and SFTP, amongst other things::
3593+
3594+ % bzr log bzr+ssh://bazaar.launchpad.net/~bzr-pqm/bzr/bzr.dev/
3595+ % bzr log http://bazaar.launchpad.net/~bzr-pqm/bzr/bzr.dev/
3596+ % bzr log sftp://bazaar.launchpad.net/~bzr-pqm/bzr/bzr.dev/
3597+
3598+By installing bzr plugins you can also access branches using the rsync
3599+protocol.
3600+
3601+See the `Publishing your branch`_ section for more about how to put your
3602+branch at a given location.
3603+
3604+Reviewing changes
3605+=================
3606+
3607+Once you have completed some work, you will want to **commit** it to the
3608+version history. It is good to commit fairly often: whenever you get a
3609+new feature working, fix a bug, or improve some code or documentation.
3610+It's also a good practice to make sure that the code compiles and passes
3611+its test suite before committing, to make sure that every revision is a
3612+known-good state. You can also review your changes, to make sure you're
3613+committing what you intend to, and as a chance to rethink your work before
3614+you permanently record it.
3615+
3616+Two bzr commands are particularly useful here: **status** and **diff**.
3617+
3618+bzr status
3619+----------
3620+
3621+The **status** command tells you what changes have been made to the
3622+working directory since the last revision::
3623+
3624+ % bzr status
3625+ modified:
3626+ foo
3627+
3628+``bzr status`` hides "boring" files that are either unchanged or ignored.
3629+The status command can optionally be given the name of some files or
3630+directories to check.
3631+
3632+bzr diff
3633+--------
3634+
3635+The **diff** command shows the full text of changes to all files as a
3636+standard unified diff. This can be piped through many programs such as
3637+''patch'', ''diffstat'', ''filterdiff'' and ''colordiff''::
3638+
3639+ % bzr diff
3640+ === added file 'hello.txt'
3641+ --- hello.txt 1970-01-01 00:00:00 +0000
3642+ +++ hello.txt 2005-10-18 14:23:29 +0000
3643+ @@ -0,0 +1,1 @@
3644+ +hello world
3645+
3646+
3647+With the ``-r`` option, the tree is compared to an earlier revision, or
3648+the differences between two versions are shown::
3649+
3650+ % bzr diff -r 1000.. # everything since r1000
3651+ % bzr diff -r 1000..1100 # changes from 1000 to 1100
3652+
3653+The ``--diff-options`` option causes bzr to run the external diff program,
3654+passing options. For example::
3655+
3656+ % bzr diff --diff-options --side-by-side foo
3657+
3658+Some projects prefer patches to show a prefix at the start of the path
3659+for old and new files. The ``--prefix`` option can be used to provide
3660+such a prefix.
3661+As a shortcut, ``bzr diff -p1`` produces a form that works with the
3662+command ``patch -p1``.
3663+
3664+
3665+Committing changes
3666+==================
3667+
3668+When the working tree state is satisfactory, it can be **committed** to
3669+the branch, creating a new revision holding a snapshot of that state.
3670+
3671+bzr commit
3672+----------
3673+
3674+The **commit** command takes a message describing the changes in the
3675+revision. It also records your userid, the current time and timezone, and
3676+the inventory and contents of the tree. The commit message is specified
3677+by the ``-m`` or ``--message`` option. You can enter a multi-line commit
3678+message; in most shells you can enter this just by leaving the quotes open
3679+at the end of the line.
3680+
3681+::
3682+
3683+ % bzr commit -m "added my first file"
3684+
3685+You can also use the ``-F`` option to take the message from a file. Some
3686+people like to make notes for a commit message while they work, then
3687+review the diff to make sure they did what they said they did. (This file
3688+can also be useful when you pick up your work after a break.)
3689+
3690+Message from an editor
3691+----------------------
3692+
3693+If you use neither the ``-m`` nor the ``-F`` option then bzr will open an
3694+editor for you to enter a message. The editor to run is controlled by
3695+your ``$VISUAL`` or ``$EDITOR`` environment variable, which can be overridden
3696+by the ``editor`` setting in ``~/.bazaar/bazaar.conf``; ``$BZR_EDITOR`` will
3697+override either of the above mentioned editor options. If you quit the
3698+editor without making any changes, the commit will be cancelled.
3699+
3700+The file that is opened in the editor contains a horizontal line. The part
3701+of the file below this line is included for information only, and will not
3702+form part of the commit message. Below the separator is shown the list of
3703+files that are changed in the commit. You should write your message above
3704+the line, and then save the file and exit.
3705+
3706+If you would like to see the diff that will be committed as you edit the
3707+message you can use the ``--show-diff`` option to ``commit``. This will include
3708+the diff in the editor when it is opened, below the separator and the
3709+information about the files that will be committed. This means that you can
3710+read it as you write the message, but the diff itself wont be seen in the
3711+commit message when you have finished. If you would like parts to be
3712+included in the message you can copy and paste them above the separator.
3713+
3714+Marking bugs as fixed
3715+---------------------
3716+
3717+Many changes to a project are as a result of fixing bugs. Bazaar can keep
3718+metadata about bugs you fixed when you commit them. To do this you use the
3719+``--fixes`` option. This option takes an argument that looks like this::
3720+
3721+ % bzr commit --fixes <tracker>:<id>
3722+
3723+Where ``<tracker>`` is an identifier for a bug tracker and ``<id>`` is an
3724+identifier for a bug that is tracked in that bug tracker. ``<id>`` is usually
3725+a number. Bazaar already knows about a few popular bug trackers. They are
3726+bugs.launchpad.net, bugs.debian.org, and bugzilla.gnome.org. These trackers
3727+have their own identifiers: lp, deb, and gnome respectively. For example,
3728+if you made a change to fix the bug #1234 on bugs.launchpad.net, you would
3729+use the following command to commit your fix::
3730+
3731+ % bzr commit -m "fixed my first bug" --fixes lp:1234
3732+
3733+For more information on this topic or for information on how to configure
3734+other bug trackers please read `Bug Tracker Settings`_.
3735+
3736+.. _Bug Tracker Settings: ../user-reference/index.html#bug-tracker-settings
3737+
3738+Selective commit
3739+----------------
3740+
3741+If you give file or directory names on the commit command line then only
3742+the changes to those files will be committed. For example::
3743+
3744+ % bzr commit -m "documentation fix" commit.py
3745+
3746+By default bzr always commits all changes to the tree, even if run from a
3747+subdirectory. To commit from only the current directory down, use::
3748+
3749+ % bzr commit .
3750+
3751+
3752+Removing uncommitted changes
3753+============================
3754+
3755+If you've made some changes and don't want to keep them, use the
3756+**revert** command to go back to the previous head version. It's a good
3757+idea to use ``bzr diff`` first to see what will be removed. By default the
3758+revert command reverts the whole tree; if file or directory names are
3759+given then only those ones will be affected. ``bzr revert`` also clears the
3760+list of pending merges revisions.
3761+
3762+
3763+Ignoring files
3764+==============
3765+
3766+The .bzrignore file
3767+-------------------
3768+
3769+Many source trees contain some files that do not need to be versioned,
3770+such as editor backups, object or bytecode files, and built programs. You
3771+can simply not add them, but then they'll always crop up as unknown files.
3772+You can also tell bzr to ignore these files by adding them to a file
3773+called ``.bzrignore`` at the top of the tree.
3774+
3775+This file contains a list of file wildcards (or "globs"), one per line.
3776+Typical contents are like this::
3777+
3778+ *.o
3779+ *~
3780+ *.tmp
3781+ *.py[co]
3782+
3783+If a glob contains a slash, it is matched against the whole path from the
3784+top of the tree; otherwise it is matched against only the filename. So
3785+the previous example ignores files with extension ``.o`` in all
3786+subdirectories, but this example ignores only ``config.h`` at the top level
3787+and HTML files in ``doc/``::
3788+
3789+ ./config.h
3790+ doc/*.html
3791+
3792+To get a list of which files are ignored and what pattern they matched,
3793+use ``bzr ignored``::
3794+
3795+ % bzr ignored
3796+ config.h ./config.h
3797+ configure.in~ *~
3798+
3799+It is OK to have either an ignore pattern match a versioned file, or to
3800+add an ignored file. Ignore patterns have no effect on versioned files;
3801+they only determine whether unversioned files are reported as unknown or
3802+ignored.
3803+
3804+The ``.bzrignore`` file should normally be versioned, so that new copies
3805+of the branch see the same patterns::
3806+
3807+ % bzr add .bzrignore
3808+ % bzr commit -m "Add ignore patterns"
3809+
3810+
3811+bzr ignore
3812+----------
3813+
3814+As an alternative to editing the ``.bzrignore`` file, you can use the
3815+``bzr ignore`` command. The ``bzr ignore`` command takes filenames and/or
3816+patterns as arguments and then adds them to the ``.bzrignore`` file. If a
3817+``.bzrignore`` file does not exist the ``bzr ignore`` command will
3818+automatically create one for you, and implicitly add it to be versioned::
3819+
3820+ % bzr ignore tags
3821+ % bzr status
3822+ added:
3823+ .bzrignore
3824+
3825+Just like when editing the ``.bzrignore`` file on your own, you should
3826+commit the automatically created ``.bzrignore`` file::
3827+
3828+ % bzr commit -m "Added tags to ignore file"
3829+
3830+
3831+Global ignores
3832+--------------
3833+
3834+There are some ignored files which are not project specific, but more user
3835+specific. Things like editor temporary files, or personal temporary files.
3836+Rather than add these ignores to every project, bzr supports a global
3837+ignore file in ``~/.bazaar/ignore`` [1]_. It has the same syntax as the
3838+per-project ignore file.
3839+
3840+
3841+Examining history
3842+=================
3843+
3844+bzr log
3845+-------
3846+
3847+The ``bzr log`` command shows a list of previous revisions. The ``bzr log
3848+--forward`` command does the same in chronological order to get most
3849+recent revisions printed at last.
3850+
3851+As with ``bzr diff``, ``bzr log`` supports the ``-r`` argument::
3852+
3853+ % bzr log -r 1000.. # Revision 1000 and everything after it
3854+ % bzr log -r ..1000 # Everything up to and including r1000
3855+ % bzr log -r 1000..1100 # changes from 1000 to 1100
3856+ % bzr log -r 1000 # The changes in only revision 1000
3857+
3858+
3859+Branch statistics
3860+=================
3861+
3862+The ``bzr info`` command shows some summary information about the working
3863+tree and the branch history.
3864+
3865+
3866+Versioning directories
3867+======================
3868+
3869+bzr versions files and directories in a way that can keep track of renames
3870+and intelligently merge them::
3871+
3872+ % mkdir src
3873+ % echo 'int main() {}' > src/simple.c
3874+ % bzr add src
3875+ added src
3876+ added src/simple.c
3877+ % bzr status
3878+ added:
3879+ src/
3880+ src/simple.c
3881+
3882+
3883+Deleting and removing files
3884+===========================
3885+
3886+You can delete files or directories by just deleting them from the working
3887+directory. This is a bit different to CVS, which requires that you also
3888+do ``cvs remove``.
3889+
3890+``bzr remove`` makes the file un-versioned, but may or may not delete the
3891+working copy [2]_. This is useful when you add the wrong file, or decide that
3892+a file should actually not be versioned.
3893+
3894+::
3895+
3896+ % rm -r src
3897+ % bzr remove -v hello.txt
3898+ ? hello.txt
3899+ % bzr status
3900+ removed:
3901+ hello.txt
3902+ src/
3903+ src/simple.c
3904+ unknown:
3905+ hello.txt
3906+
3907+If you remove the wrong file by accident, you can use ``bzr revert`` to
3908+restore it.
3909+
3910+
3911+Branching
3912+=========
3913+
3914+Often rather than starting your own project, you will want to submit a
3915+change to an existing project. To do this, you'll need to get a copy of
3916+the existing branch. Because this new copy is potentially a new branch,
3917+the command is called **branch**::
3918+
3919+ % bzr branch lp:bzr bzr.dev
3920+ % cd bzr.dev
3921+
3922+This copies down the complete history of this branch, so we can do all
3923+operations on it locally: log, annotate, making and merging branches.
3924+There will be an option to get only part of the history if you wish.
3925+
3926+You can also get a copy of an existing branch by copying its directory,
3927+expanding a tarball, or by a remote copy using something like rsync.
3928+
3929+Following upstream changes
3930+==========================
3931+
3932+You can stay up-to-date with the parent branch by "pulling" in their
3933+changes::
3934+
3935+ % bzr pull
3936+
3937+After this change, the local directory will be a mirror of the source. This
3938+includes the ''revision-history'' - which is a list of the commits done in
3939+this branch, rather than merged from other branches.
3940+
3941+This command only works if your local (destination) branch is either an
3942+older copy of the parent branch with no new commits of its own, or if the
3943+most recent commit in your local branch has been merged into the parent
3944+branch.
3945+
3946+Merging from related branches
3947+=============================
3948+
3949+If two branches have diverged (both have unique changes) then ``bzr
3950+merge`` is the appropriate command to use. Merge will automatically
3951+calculate the changes that exist in the branch you're merging from that
3952+are not in your branch and attempt to apply them in your branch.
3953+
3954+::
3955+
3956+ % bzr merge URL
3957+
3958+
3959+If there is a conflict during a merge, 3 files with the same basename
3960+are created. The filename of the common base is appended with ".BASE",
3961+the filename of the file containing your changes is appended with
3962+".THIS" and the filename with the changes from the other tree is
3963+appended with ".OTHER". Using a program such as kdiff3, you can now
3964+comfortably merge them into one file. In order to commit you have to
3965+rename the merged file (".THIS") to the original file name. To
3966+complete the conflict resolution you must use the resolve command,
3967+which will remove the ".OTHER" and ".BASE" files. As long as there
3968+exist files with .BASE, .THIS or .OTHER the commit command will
3969+report an error.
3970+
3971+::
3972+
3973+ % kdiff3 file.BASE file.OTHER file.THIS
3974+ % mv file.THIS file
3975+ % bzr resolve file
3976+
3977+[**TODO**: explain conflict markers within files]
3978+
3979+
3980+Publishing your branch
3981+======================
3982+
3983+You don't need a special server to publish a bzr branch, just a normal web
3984+server. Just mirror the files to your server, including the .bzr
3985+directory. One can push a branch (or the changes for a branch) by one of
3986+the following three methods:
3987+
3988+* The best method is to use bzr itself to do it.
3989+
3990+ ::
3991+
3992+ % bzr push bzr+ssh://servername.com/path/to/directory
3993+
3994+ (The destination directory must already exist unless the
3995+ ``--create-prefix`` option is used.)
3996+
3997+* Another option is the ``rspush`` plugin that comes with BzrTools, which
3998+ uses rsync to push the changes to the revision history and the working
3999+ tree.
4000+
4001+* You can also copy the files around manually, by sending a tarball, or using
4002+ rsync, or other related file transfer methods. This is usually less safe
4003+ than using ``push``, but may be faster or easier in some situations.
4004+
4005+
4006+Moving changes between trees
4007+============================
4008+
4009+It happens to the best of us: sometimes you'll make changes in the wrong
4010+tree. Maybe because you've accidentally started work in the wrong directory,
4011+maybe because as you're working, the change turns out to be bigger than you
4012+expected, so you start a new branch for it.
4013+
4014+To move your changes from one tree to another, use
4015+
4016+::
4017+
4018+ % cd NEWDIR
4019+ % bzr merge --uncommitted OLDDIR
4020+
4021+This will apply all of the uncommitted changes you made in OLDDIR to NEWDIR.
4022+It will not apply committed changes, even if they could be applied to NEWDIR
4023+with a regular merge. The changes will remain in OLDDIR, but you can use ``bzr
4024+revert OLDDIR`` to remove them, once you're satisfied with NEWDIR.
4025+
4026+NEWDIR does not have to be a copy of OLDDIR, but they should be related.
4027+The more different they are, the greater the chance of conflicts.
4028
4029=== added file 'doc/ch/tutorials/using_bazaar_with_launchpad.txt'
4030--- doc/ch/tutorials/using_bazaar_with_launchpad.txt 1970-01-01 00:00:00 +0000
4031+++ doc/ch/tutorials/using_bazaar_with_launchpad.txt 2012-11-23 02:18:19 +0000
4032@@ -0,0 +1,323 @@
4033+===========================
4034+Bazaar和Launchpad结合使用
4035+===========================
4036+
4037+
4038+动机
4039+==========
4040+
4041+社区不同于团队
4042+----------------------------------
4043+
4044+创建一个软件的初始版本所需的团队人数可能会是一个到几千人的大小差异。根据这个要求,涉及技术和管理的挑战都是巨大的。正如《Bazaar用户指南》所述,选择“正确”的流程和使用像Bazaar这样的支持匹配工作流的工具可以有极大的帮助。
4045+
4046+成功的软件需要的不仅仅是一个很大的团队,更需要一个健康的、积极的社区。这个团体通常远远大于团队,因为它包含了对该软件感兴趣的每个人:团队、用户、培训合作伙伴、支持合作伙伴还有第三方开发者等等。
4047+
4048+在自由软件领域,社区是很容易接受的。但社区的适用范围不仅如此,大多数成功的商业软件提供商在通过建设和管理社区使其主流产品更加成熟。
4049+
4050+就像伟大的团队,伟大的社区不仅仅只是存在。良好的政策和指导方针对培育正确的行为和参与者之间健康的关系是必要的。为了更深入研究这个主题,请看Karl Fogel的里程碑著作:
4051+`Producing Open Source Software <http://www.producingoss.com/>`_.
4052+
4053+
4054+协同开发环境的需要
4055+---------------------------------------------------
4056+
4057+一套智能的工具集对跟踪和管理社区信息和工作流程是很重要的。这些工具被称为协同开发环境(CDEs)。这些工具集通常是基于Web,并管理如公告,问题/错误,问题和答案,下载,文件和源代码等东西。一些CDEs的例子包括
4058+`Launchpad <https://launchpad.net>`_,
4059+`SourceForge <http://sourceforge.net>`_,
4060+`java.net <http://java.net>`_ 和
4061+`SAP Community Network <https://www.sdn.sap.com/irj/sdn>`_.
4062+
4063+
4064+利用相关社区来帮助社区工作
4065+-------------------------------------------------
4066+
4067+很多成功的产品都有数量庞大的下游依赖。换句话说,一个新的挑战与成功的处理其他社区,成功了解您的更改是如何影响他们的是一同出现的。这是大部分明显的项目,比如:
4068+
4069+* 软件语言, 比如 Python, PHP, Ruby, Java, Perl等等。
4070+* 编译工具, 比如 gcc, JDK等等。
4071+* (程序)库, 比如 zlib, openssl等等。
4072+* 框架, 比如 Zope, Ruby on Rails, Spring等等。
4073+
4074+然而,它同样适用于有附件的流行应用程序, 比如 Firefox, Thunderbird, OpenOffice.org, Drupal, Wordpress, Joomla等等。
4075+
4076+帮助社区跨社区的跟踪和管理问题及修复的工具是必需的。这些工具在两端都帮助人们:
4077+
4078+* 用户可以在终端报告问题, 比如在运行于操作系统Z上的应用程序y中x类型图片的绘制是断裂的。
4079+
4080+* 开发人员可以更好地体会到下游做出更改或修复的影响, 比如修复图像库的bug让10个操作系统上运行的5种应用软件的用户受益。
4081+
4082+人们在中间扮演 *连接点* 和沟通上下线的必要角色。在多数情况下,他们也可以为终端用户修复问题,以及提交补丁和修复建议到上游开发团队。随着时间的推移,以可持续的方式保持追踪所有问题不是简单的工作。
4083+
4084+
4085+Launchpad: 更多的开发,更少的阻碍
4086+------------------------------------------
4087+
4088+除了赞助 `Ubuntu <http://www.ubuntu.com>`_ 和 `Bazaar <http://bazaar.canonical.com>`_ 的开发, Canonical
4089+也支持 `Launchpad <https://launchpad.net/>`_ 作为一个免费的社区服务。 Launchpad是最好的CDEs之一,几个主要的原因是:
4090+
4091+* 它跟踪的东西之间的模块关系, 比如源代码分支可以联接到bug修复。
4092+
4093+* 除了管理历史信息外,它还通过提供如道路图,里程碑和蓝图等产品来支持未来发展计划和追踪。
4094+
4095+* 它提供翻译工具和打包服务,为想要加入社区的翻译员和测试员减少和摆脱障碍。
4096+
4097+* 它为不同社区就相关问题和蓝图一起工作提供了连接点。
4098+
4099+换句话说, Launchpad被设计的目的是帮助社区发展,并减少在社区内和社区间工作流程的摩擦。最后,这意味着在机械工作上花费更少的时间而在感兴趣的开发上花费更多的时间。
4100+
4101+
4102+Bazaar: Launchpad的VCS客户端
4103+------------------------------
4104+
4105+这个指导手册着重于如何把Bazaar和Launchpad结合起来使用,以及它们是如何互补的。重要的是:
4106+
4107+1. Bazaar能够在没有Launchpad情况下使用
4108+2. Launchpad能够在没有Bazaar情况下使用
4109+
4110+虽然如此设计,但把它们结合起来使用比单独使用要强大的多。
4111+
4112+
4113+使用Launchpad查找和浏览分支
4114+=============================================
4115+
4116+查找可用分支
4117+--------------------------
4118+
4119+尽管采纳分布式的版本控制有很多优势,但其中一个已消失的东西是包含所有可用分支的全能中心服务器。事实上,在分布式环境中,令人感兴趣的分支可以通过互联网上的位置长久的存在(或在内部网做那些事)。
4120+
4121+Launchpad通过提供分支的注册来填补这个空白。
4122+
4123+
4124+注册分支
4125+--------------------
4126+
4127+分支可以被上传到Launchpad,或简单的注册为在外部位置可用。分支也被赋予状态,比如 *New*, *Development*, *Mature* 或 *Abandoned*.
4128+
4129+注意:外部分支甚至可以被托管到传统的版本控制工具,如CVS 和 Subversion.这些系统中的代码会定期被审查和转换到Bazaar分支。为了最大限度的准确,把外部分支托管到Bazaar更加可取。
4130+
4131+
4132+浏览分支
4133+-----------------
4134+
4135+分支可以依照很多属性列出、过滤、分类出来。这些属性包括名字,注册人,作者,状态,年龄和最近更新时间。浏览分支功能的支持让查看东西变得很容易,比如这些东西:
4136+
4137+* 在哪里可以下载分支
4138+* 怎样上传更改
4139+* 每个分支最近的提交和更改
4140+* 给定版本的单个文件源代码
4141+
4142+
4143+在Lauchpad中使用Bazaar访问代码
4144+========================================
4145+
4146+获取项目代码
4147+------------------------------
4148+
4149+像Launchpad跟踪的数以千计的项目及其最新的代码,不管其是否由Bazaar,CVS 或Subversion管理,Bazaar用户都可以像这样简单的获取代码::
4150+
4151+ bzr branch lp:project-name
4152+
4153+`project-name` 是Launchpad项目ID。这里是几个例子::
4154+
4155+ bzr branch lp:inkscape
4156+ bzr branch lp:amarok
4157+ bzr branch lp:python
4158+ bzr branch lp:rails
4159+ bzr branch lp:java-gnome
4160+
4161+稍后您可以在本地用您最常用的编辑器或IDE浏览代码,并根据需要更改代码。
4162+
4163+如果一个项目已被注册了多个系列(比如开发系列和维护系列),获取给定系列的最新代码,用命令::
4164+
4165+ bzr branch lp:project-name/series
4166+
4167+发布更改
4168+-----------------------
4169+
4170+您已经修复了bug或给软件增添了您一直想要的新功能,现在是时候共享您的代码了。如前所述,Launchpad是免费的Bazaar代码托管服务,这样您就可以提交分支到Launchpad上,其他人也可以从这里获得您的代码。比如,假定您是一个相关团队的成员,登录到Launchpad::
4171+
4172+ bzr launchpad-login userid
4173+
4174+`userid` 是Launchpad账户的ID。然后您可以提交您的更改到团队分支::
4175+
4176+ bzr push lp:~team-name/project-name/branch-name
4177+
4178+然后其他人可以下载您的代码::
4179+
4180+ bzr branch lp:~team-name/project-name/branch-name
4181+
4182+
4183+个人分支
4184+-----------------
4185+
4186+即使您不是团队中的一员,Launchpad 也可以用来发布您的修改。在这种情况下,简单创建一个个人分支::
4187+
4188+ bzr push lp:~userid/project-name/branch-name
4189+
4190+然后其他人可以下载您的代码::
4191+
4192+ bzr branch lp:~userid/project-name/branch-name
4193+
4194+注意:即使发布到个人分支,把您分支的更改情况通知上游开发者是礼貌的,这样如果您的修改普遍适合所有用户并达到了项目的质量标准,他们可以从您的分支获取您的更改。
4195+
4196+
4197+打包源代码分支
4198+-----------------------
4199+
4200+当 `用Bazaar维护ubuntu包`_ 时,您可以在Launchpad上很容易地访问包的源代码分支。在当前(默认)系列,下载包的源代码分支::
4201+
4202+ bzr branch ubuntu:package
4203+
4204+*package* 是您想读取的ubuntu包名字。为了下载ubuntu特定系列的包分支(比如 Maverick 或 Lucid), 使用命令::
4205+
4206+ bzr branch ubuntu:maverick/package
4207+
4208+Ubuntu系列名也可以被缩写为它们的首字母。例如上述命令也可写为::
4209+
4210+ bzr branch ubuntu:m/package
4211+
4212+您也可以从Launchpad下载Debian系列的包源代码分支。下载这个默认系列::
4213+
4214+ bzr branch debianlp:package
4215+
4216+下载一个特定的系列::
4217+
4218+ bzr branch debianlp:lenny/package
4219+
4220+注意 ``debianlp:`` 只为Launchpad的包计划读取Debian源分支。
4221+
4222+.. _`用Bazaar维护ubuntu包`: https://wiki.ubuntu.com/DistributedDevelopment
4223+
4224+
4225+用Launchpad链接分支
4226+================================
4227+
4228+关联分支和bug
4229+-------------------------------
4230+
4231+在注册分支后,您可以将其关联到一个bug,这样对该bug有兴趣人能够跟踪和下载可用的补丁。
4232+
4233+这样做的步骤是:
4234+
4235+1. 在问题中导航到该bug
4236+
4237+2. 在 `Actions` 下选择 `Add branch`.
4238+
4239+3. 选择分支
4240+
4241+4. 可选地设置关联的状态。
4242+ *Fix In Progress* 是默认状态,但如果该分支已经解决了这个问题,您可能想把它设置成另一种状态,比如 *Fix Available* .
4243+
4244+如果您愿意,您可以为bug和分支的关联提供一些随意的注释。
4245+
4246+
4247+在Bazaar中提交时改变Launchpad的状态
4248+----------------------------------------------------------
4249+
4250+Bazaar和Launchpad一起工作可以为您减少一些状态处理。当您使用Bazaar提交时,可以使用--fixes选项::
4251+
4252+ bzr commit --fixes lp:1234 -m "..."
4253+
4254+1234 是 bug ID. 这会改变 bug-branch 关联的状态为 *Fix Available*.如果一次提交修复了多个问题, --fixes 选项被规定可以使用多次。
4255+
4256+对于这个特色,最好的事情之一就是提交时不需要Launchpad处于连接状态。 ``--fixes`` 选项通过储存数据来工作。对于这些数据,Launchpad会在推送该分支到它时进行检测或重新在线审阅。
4257+
4258+注意:Launchpad 不会暗中地关闭一个bug,只因为修复它后分支可用。对于这个有几点原因。第一,在大部分团队考虑修复它之前,分支通常需要融合到主干(主开发分支)。第二,许多团队在开发人员说明已修复bug后都有单独的程序来检测bug是否被修复。
4259+
4260+解释说明,Launchpad中的融合控制功能目前正在开发,并且一旦自动的改变bug状态为 *Fix Committed* 的功能实现,Launchpad的融合控制功能将会更适用。
4261+
4262+
4263+关联分支和蓝图
4264+-------------------------------------
4265+
4266+在注册分支后,您可以将其关联到蓝图,这样对该蓝图感兴趣的人能够追踪和测试开发中的功能。
4267+
4268+这样做的步骤是:
4269+
4270+1. 在问题中导航到该蓝图
4271+
4272+2. 在 `Actions` 下选择 `Link branch`.
4273+
4274+3. 选择分支
4275+
4276+如果您愿意,您可以为蓝图和分支的关联提供一些随意的注释。
4277+
4278+
4279+用Launchpad管理发布
4280+=================================
4281+
4282+集成更改
4283+-------------------
4284+
4285+一旦一个分支被开发和发布,在那些更改被集成进核心产品以及发布给最终用户之前,社区一般会进行一次严密的审查过程。几个涉及到的步骤可能包括:
4286+
4287+* 同事审查更改
4288+
4289+* 决定哪个版本包括这些更改。比如,下一个维护版本,下一个主版本或者它们二者兼有。
4290+
4291+* 运行功能回归测试
4292+
4293+* 基准测试以确保工作性能可接受
4294+
4295+* 包装成早期的版本来给最终用户测试
4296+
4297+* 文件更新。比如:发布目标版本的说明
4298+
4299+* 将用户界面和文档翻译成多种语言
4300+
4301+这一节暂时着重于Launchpad中的一些产品特征来帮助获得优质代码投入到产品中。与Bazaar的牢固集成是使其顺利达成目的的重要核心。
4302+
4303+注意:这里说明一下,有些产品功能还在开发中。如果您对其中的一个或更多的功能感兴趣,请考虑通过这个链接加入Launchpad的beta测试小组:
4304+https://help.launchpad.net/JoiningLaunchpadBetaTesters. 您可以较早的获得该功能并且在更广泛的推广之前提交反馈给开发人员。
4305+
4306+
4307+分支融合提议
4308+----------------------
4309+
4310+在导航到Launchpad的一个分支后,其中一个可用的操作是 *Propose for merging*. 这可以让您指定这些代码应该被融合到哪个分支。
4311+
4312+追踪哪些分支被提议融合代码行的信息,可以帮助发布经理在规定日期之前对还有什么需要完成或可以完成保持优势。利用这些信息,他们可以保证在任何必要的审查后分支被融合。在简单的情况下,发布经理可以手动融合分支。在更先进的的情况下,当分支达到正确的状态(比如 *Review completed* )时可以由机器人(如 `PQM`_ )自动融合。
4313+
4314+.. _PQM: https://launchpad.net/pqm
4315+
4316+
4317+代码审查跟踪
4318+--------------------
4319+
4320+在Launchpad中许多功能正在被开发,用来追踪状态,对话和代码的审查结果。预期这些功能会集成到分支融合提议和分支浏览功能中。
4321+
4322+
4323+个人包的存档库 (PPAs)
4324+--------------------------------
4325+
4326+PPAs帮助开发者和开发团队自定义构建用户早期测试和反馈的机制。换句话说,PPA允许开发者建立一个对这些更改有兴趣的测试者的社区。测试社区能够安装这些包,测试期间运行包,并且以后在他们的系统上完全删除包。
4327+
4328+更多的细节请看 https://help.launchpad.net/PPAQuickStart.
4329+
4330+
4331+翻译
4332+------------
4333+
4334+Launchpad的翻译模块被精心设计,来让任何人参与翻译应用软件为他们所知的语言变得很简单。翻译者不需考虑低层次的细节。
4335+
4336+Launchpad分别对项目的每个主要版本的翻译保持追踪,当其他人开始在正在开发的新版本上工作时,仍允许翻译人员继续改进稳定版本的翻译。通过项目分享资源让翻译速度降低了。来自包含750000翻译短语的软件库和19000个注册翻译师的社区的自动建议能够从根本上缩短翻译本地项目为多种语言所需的时间。
4337+
4338+
4339+总结
4340+=======
4341+
4342+我们加入的社区,不论在线还是不在线,都说了很多关于人员分类的东西。另一方面,您为您社区所选的工具,特别是CDE和版本控制工具,对社区成员怎样更容易地做出贡献有很大的影响。
4343+
4344+凭它们自己的功能,Launchpad 和 Bazaar是非常有用的工具。将它们一起使用时可以:
4345+
4346+* 帮助您的社区追踪主要的资源,比如源代码和文档
4347+* 减少登陆障碍来帮助社区成长
4348+* 帮助社区与其相关社区相互作用
4349+
4350+特别是,Launchpad对Bazaar分支来说是一个免费的代码托管服务。分支可以被在线浏览以及链接到bug和蓝图。当提交bug到Bazaar时bug-branch关联的状态可以被自动管理。进一步集成开发的目的是让 *好主意* 到 *最终用户手中的运行代码* 的这个过程流程化。
4351+
4352+如果您对Bazaar和Launchpad进一步集成有些看法反馈,请通过Bazaar邮箱联系我们:
4353+bazaar@lists.canonical.com.
4354+
4355+当Launchpad被设计成支持免费软件项目的免费服务时,Canonical公司可能会根据商业软件开发者的需求让Launchpad对其可用。如果您觉得Launchpad对管理您的社区有帮助,我们将很高兴收到您的来信。
4356
4357=== added directory 'doc/ch/user-guide'
4358=== added file 'doc/ch/user-guide/adv_merging.txt'
4359--- doc/ch/user-guide/adv_merging.txt 1970-01-01 00:00:00 +0000
4360+++ doc/ch/user-guide/adv_merging.txt 2012-11-23 02:18:19 +0000
4361@@ -0,0 +1,78 @@
4362+伪融合
4363+======
4364+
4365+cherrypicking
4366+-------------
4367+
4368+有时,有选择的融合分支中的修改是十分有用的,但不是针对所有修改。这种做法通常被称为 *cherrypicking* ,下面是些例子:
4369+
4370+* 有选择性的将修正从主开发分支移动到发行分支。
4371+
4372+* 有选择性的将改进从实验分支移动到特性分支。
4373+
4374+将分支 ``foo`` 修订版X的改动融合的命令是::
4375+
4376+ bzr merge -c X foo
4377+
4378+将改动融合到分支 ``foo`` 修订版X的命令是::
4379+
4380+ bzr merge -r X foo
4381+
4382+融合改动直到分支 ``foo`` 修订版X的命令是::
4383+
4384+ bzr merge -r X.. foo
4385+
4386+融合分支 ``foo`` 从修订版X到修订版Y的所有改动的命令是::
4387+
4388+ bzr merge -r X..Y foo
4389+
4390+像普通的融合一样,您必须明确的提交一个cherrypicks。在这样提交之前,您或许希望可以使用 ``bzr diff`` 来查看改动,然后运行您的测试套件(如果您有)。
4391+
4392+与普通的融合不同,Bazaar目前无法追踪cherrypicks。特别是,改动看起来像是一个正常的提交,修订版的历史修改记录已经丢失。在许多情况下,他们都是有用的(见上文),这不是主要的问题因为一次完全的融合是无法在短时间内完成的。在其他情况下,当改动再一次融合时将会有更多的冲突需要解决。
4393+
4394+无父母融合
4395+----------
4396+
4397+这是一种和cherrypicks相关的技术,它使得改动和修订版无关,因为这些改动只是为了融合,并且改动在提交前忽略了它们的父母修订版。这使得所有的改动在融合时只会出现一次提交,在融合后提交前,你可以执行::
4398+
4399+ bzr revert --forget-merges
4400+
4401+来保证这些改动还是属于该工程树,但是改动的修订记录已经被移除了。下次提交将记录所有这些没有了融合修订版记录的改动。
4402+
4403+对一些用户来说,消除历史记录正符合他们的意愿,但你必须小心,损失的历史记录不能超过清除的价值,特别是要考虑到Bazaar对于逐步融合修订的能力。要注意,因为这将包括来自源分支但没有归属的分支,它可能导致在包含相同源和目标分支的融合时产生新的冲突。
4404+
4405+反向cherrypicking
4406+-----------------
4407+
4408+Cherrypicking可以用来反向一组 *低于* 下界的修订范围上界的变更。例如,在修订版次10撤销更改的命令::
4409+
4410+ bzr merge -r 10..9
4411+
4412+如果你从别的地方想得到大多数的改动(并非所有),你不妨在一个正常的融合之后做少量反cherrypicks。
4413+
4414+
4415+无提交改动融合
4416+--------------
4417+
4418+如果你有多个分支,而您不慎改动错了,在这里要采取这样的步骤来修正此问题。假设你开始在 ``foo`` 工作分支,但你其实是想进入 ``bar`` 工作分支::
4419+1. 改变分支到 ``bar``.
4420+2. 执行 ``bzr merge --uncommitted foo``
4421+3. 检查所有的改动通过 (``bzr diff``)
4422+4. 改变分支到 ``foo``
4423+5. 执行 ``bzr revert``.
4424+
4425+.. TODO Selective file merging?
4426+
4427+
4428+Rebasing
4429+--------
4430+
4431+对于普通融合的另一种选择就是 *rebasing* ,即起源与当前分支但是是从另一个角度来看待一样。Rebasing是通过由 ``rebase`` 插件提供的 ``rebase`` 命令来在bazaar中使用的的。
4432+
4433+``rebase`` 命令将在当前工作目录的分支将重订基期的另一分支上的位置。如果分支没有指定,那么使用将使用父分支,而这通常是所期望的结果。
4434+
4435+首先要确定修订版在当前分支而不是在父分支。然后当前分支与目标分支要保持修订版一致,并且每个修订版要在分支最上层。在该过程结束时看起来就好像你目前的分支关闭了当前最后修订的目标。
4436+
4437+每个修订版的重置都可能会导致冲突。如果冲突发生了,命令将会停止工作,这是需要你去修复它们。就好像提交时出现冲突需要 ``merge(融合)`` ,然后运行 ``bzr resolve`` 来标记它们已经被解决。一旦你解决了所有冲突,执行bzr ``bzr rebase-continue`` 来继续rebase操作。如果遇到冲突而你不想继续下去,可以执行 ``bzr rebase-abort`` ,你也可以使用 ``rebase-todo`` 来现实仍需要被重置的提交列表。
4438+
4439+注意:一些用户来自融合较弱的中心VCS工具追踪起来像更新,因为它类似于旧工具的使用,或者因为“完全清除”的历史看上去很重要。在Bazaar更新前,想想是否一个常规融合才是更好的选择。特别是,在共享成功但更新后来的一个分支共享时有人不提倡前更新一个私有分支。
4440
4441=== added file 'doc/ch/user-guide/annotating_changes.txt'
4442--- doc/ch/user-guide/annotating_changes.txt 1970-01-01 00:00:00 +0000
4443+++ doc/ch/user-guide/annotating_changes.txt 2012-11-23 02:18:19 +0000
4444@@ -0,0 +1,28 @@
4445+注释更改
4446+==================
4447+
4448+查看原始内容
4449+----------------------------
4450+
4451+当两个或两个以上的人处理同一文件时,看到谁创建这个文件或者谁最后一次对文件进行了修改,有时是非常有用的。
4452+因此,可以像这样使用注解命令::
4453+
4454+ bzr annotate readme.txt
4455+
4456+如果您是一个悲观主义者或乐观主义者,您可能更喜欢使用一个内置的别名,比如 ``annotate`` : ``blame`` 或者 ``praise`` 。
4457+无论哪种方式,文件的每一行连同信息一起像这样显示:
4458+
4459+ * 谁进行了最后一次修改
4460+ * 在什么时候进行的最后一次修改
4461+ * 提交信息。
4462+
4463+GUI 工具
4464+---------
4465+
4466+Bazaar的各种GUI插件提供图形化的工具来查看注释信息。
4467+例如,bzr-gtk插件提供了一个GUI工具,可以使用 ``gannotate`` 命令启动这个工具::
4468+
4469+ bzr gannotate readme.txt
4470+
4471+GUI工具通常提供了更为丰富有趣的信息显示(例如,每次提交所有的变化),所以与基于文本的命令相比,您可能更喜欢图形化工具。
4472+
4473
4474=== added file 'doc/ch/user-guide/bazaar_workflows.txt'
4475--- doc/ch/user-guide/bazaar_workflows.txt 1970-01-01 00:00:00 +0000
4476+++ doc/ch/user-guide/bazaar_workflows.txt 2012-11-23 02:18:19 +0000
4477@@ -0,0 +1,122 @@
4478+工作流
4479+=========
4480+
4481+Bazaar只是一个工具
4482+---------------------
4483+
4484+Bazaar支持多种方法来组织工作,也就是说您可以以一个工作流开始,并且随着时间的推移和环境的改变而去不断改写它,永远都不会有一个万能的方法总是能够起作用。这一节概要地讲述了Bazaar支持的几种流行的工作流。
4485+
4486+记住这几种工作模式只是Bazaar使用的几个范例而已,也许您想用的工作流没有列在这里,但是以下的思想却是有用的。
4487+
4488+单机模式
4489+----
4490+
4491+无论是开发软件、编辑文档还是改变配置文件,一个好用的VCS总是能够帮上忙。一个单独的用户可以使用这种模式来有效地管理只由他个人维护的项目。
4492+
4493+.. image:: images/workflows_single.png
4494+
4495+这种工作流相对于不进行版本控制最大的优势包括:
4496+
4497+ * 备份老版本
4498+ * 回滚至上一个状态
4499+ * 可追踪历史
4500+
4501+而Bazaar这种工作流最关键的特征则是易用和无需管理。
4502+
4503+
4504+伙伴模式
4505+-------
4506+
4507+有时两个人需要一起工作并且共享他们所做的更改,这通常以单机模式(上一节)或者团队导向模式(下一节)为开始。在有些情况下,第二个人需要拷贝第一个人所做的一个分支(包括历史记录),继而两人可以共同工作并且在适当时候进行交互来融合他们的工作。
4508+
4509+.. image:: images/workflows_peer.png
4510+
4511+相对于单机模式的优势:
4512+
4513+ * 更容易地共享更新
4514+ * 每个文件的每条支线可以定义特定更新(包括作者、时间和原因)的属性
4515+
4516+实施这种工作模式时,Bazaar相对于CVS和Subversion的优势有:
4517+
4518+ * 不需要设置服务器
4519+ * 智能融合,多次融合变得不再费力
4520+
4521+
4522+中心模式
4523+-----------
4524+
4525+也被称为“锁定步骤”模式,本质上与CVS和Subversion所推荐和强制使用的工作模式是一样的。所有的开发者都在同一个分支上工作,他们使用bzr update命令来获得他们最新的版本,然后用bzr commit命令将他们所做的更新发布到中心服务器上去。
4526+
4527+.. image:: images/workflows_centralized.png
4528+
4529+若是实施这种工作模式,易用的CVS和Subversion也是不错的选择。Bazaar也直接支持这种模式,相较于CVS和Subversion的重大优势是:
4530+
4531+ * 更好地对分支和融合的支持
4532+ * 更好地重命名的支持
4533+
4534+
4535+带本地提交的中心模式
4536+------------------------------
4537+
4538+除了当开发者在做了一系列更新之后会使用commit -local命令或者解除他们的校验,这种模式本质上与中心模式是相同的。当全部更新完成之后,他们会把更新提交到共享主分支上去。
4539+
4540+.. image:: images/workflows_localcommit.png
4541+
4542+相较于中心模式的优势:
4543+
4544+ * 可以离线工作,比如旅行中
4545+ * 减小一个错误提交对他人工作影响的可能性
4546+
4547+CVS和Subversion都是不支持这种模式的。其他的一些分布式VCS可以支持这种工作模式,但是和bazaar相比流程要复杂一些。
4548+
4549+
4550+共享主分支的分布模式
4551+----------------------------------
4552+
4553+在这种工作流程下,每一个工作者都有他自己的分支和对主分支的提交权。他们在自己的个人分支上做工作,当完成后再将其添加到主分支之中。
4554+
4555+.. image:: images/workflows_shared.png
4556+
4557+相较于带本地提交的中心模式的优势:
4558+
4559+ * 更容易组织工作 - 每个分支可以进行独立开发
4560+ * 当需要时开发者可以融合另一个人的工作
4561+
4562+CVS和Subversion都是不支持这种工作模式的,而其他的分布式VCS是支持的。Bazaar的许多特性对这种模式效果良好,比如易用、共享仓库、完美融合和丰富元数据(包括目录重命名的监测)。
4563+
4564+人工审核的分布模式
4565+-----------------------------------
4566+
4567+在这种工作流下,每一个工作者都有他自己的分支和对主分支的只读权。特定的某个开发者(也就是审核员)有对主分支的提交权。当开发者想提交他的工作成果时,他需要审核员来进行提交。审核员对代码进行复查,在代码达到了必要条件之后将其提交到主分支上。
4568+
4569+.. image:: images/workflows_gatekeeper.png
4570+
4571+相较于共享主分支的分布模式的优势:
4572+
4573+ * 加入到主分支的代码已经复查过了
4574+ * 控制更新加入到主分支更加轻松
4575+
4576+Bazaar的一个伙伴工具,Bundle Buggy在追踪复查的修改以及它们的情况、复查员的意见上有十分大的帮助。
4577+
4578+
4579+自动审核的分布模式
4580+---------------------------------------
4581+
4582+在这种工作模式下,每一个工作者都有他自己的分支和对主分支的只读权。而审核软件有对主分支的提交权。当某个开发者想提交代码时,他可以找另一个人来复查。复查通过之后,原作者或者复查员(这由团队规定决定)可以寻求审核软件将其提交到主分支上。审核软件会接受提交、编译并运行监测套件。当且仅当代码通过测试后它才能被提交到主分支上。
4583+
4584+注:也可以选择不进行复查由作者直接向审核软件提交。(这仅适用于“成对编程”(Pair Programming)这种即编即查的开发过程,这种情况可以有效避免错误,而且不需要进行单独的复查)。
4585+
4586+.. image:: images/workflows_pqm.png
4587+
4588+相较于人工审核的分布模式的优势:
4589+
4590+ * 代码在提交到主分支之前已经被测试(这样主分支有更强的健全性)
4591+ * 使团队成长更平稳
4592+
4593+Bazaar的伙伴工具Patch Queue Manager (PQM)能够提供自动审核功能。
4594+
4595+
4596+执行一个模式
4597+-----------------------
4598+
4599+对于深入的了解和使用某种模式,请参看本手册的第3-6章。然而,首先来说,第二章讲解了一些重要的前提要素包括Bazaar的安装、常用指令和编译步骤。
4600
4601=== added file 'doc/ch/user-guide/branching_a_project.txt'
4602--- doc/ch/user-guide/branching_a_project.txt 1970-01-01 00:00:00 +0000
4603+++ doc/ch/user-guide/branching_a_project.txt 2012-11-23 02:18:19 +0000
4604@@ -0,0 +1,80 @@
4605+分支项目
4606+========
4607+
4608+分支的网址
4609+----------
4610+
4611+在别人能够得到一份您的工作之前,您需要同意转让技术。
4612+您可能会决定让您的顶层目录分支进行网络共享,这是Windows用户熟悉的方法。
4613+Unix用户可能更喜欢通过SSH访问,内置的SSH服务器的安全协议。
4614+Bazaar在支持协议方面是 *非常* 灵活的,下面给出了其中一些支持的协议。
4615+
4616+ =========== ======================================================
4617+ 前缀 描述
4618+ =========== ======================================================
4619+ \file:// 使用标准的文件系统访问(默认)。
4620+ \bzr+ssh:/ 通过SSH进行访问(最佳远程选项)。
4621+ \sftp:// 使用SFTP访问(大多数SSH服务器提供了SFTP)。
4622+ \bzr:// 使用Bazaar智能服务器快速访问。
4623+ \ftp:// 使用被动FTP访问。
4624+ \http:// 访问通过web服务器输出的分支。
4625+ \https:// 加密访问web服务器输出的分支。
4626+ =========== ======================================================
4627+
4628+如上所示,通过URL前缀指定的传输协议来识别分支。
4629+如果没有指定前缀,指定默认文件名。
4630+支持协议的完整列表,请参阅 ``urlspec`` 在线帮助主题或者 `URL标识符 <http://doc.bazaar.canonical.com/bzr.dev/en/user-reference/index.html#url-identifiers>`_ bazaar用户参考部分。
4631+
4632+URL通常是相对于服务器的根目录,所以 ``ftp://example.com/repo/foo`` 是指该主机的 ``/repo/foo`` 目录。(我们说 '通常' ,因为一些像Apache这样的服务器软件,通过配置可以重新映射到任意的URL,在这种情况下,您需要查看服务器配置,以找出哪些URL对应这目录。)
4633+
4634+为了解决在服务器上相对于您家目录(home目录)的路径,使用波浪线,如: ``bzr+ssh://example.com/~/public_html`` 将映射到您家目录下的 ``public_html`` 。
4635+
4636+.. note:: 通过HTTP或HTTPS访问,默认情况下是只读的。
4637+ 参见 `Pushing over the HTTP smart server(推动基于HTTP的智能服务器) <http_smart_server.html#pushing-over-the-http-smart-server>`_ 配置的读写访问的详细信息。
4638+
4639+关于共享存储库的提醒
4640+-------------------
4641+
4642+在获得一个分支的拷贝之前,首先需要考虑把它放在文件系统的哪个位置。
4643+最高的存储效率下降的轨道,建议分支被创建一个目录下的某个地方,并将此目录设置为共享的存储库。(参见 `分支特征 <organizing_your_workspace.html#feature-branches>`_ 在 `组织您的工作区 <organizing_your_workspace.html>`_ 中,一个常用的布局。)例如::
4644+
4645+ bzr init-repo my-repo
4646+ cd my-repo
4647+
4648+现在您已经准备好从别人那里抢一个分支并hack away。
4649+
4650+branch 命令
4651+-----------
4652+
4653+基于已经存在的分支获得一个分支, 使用 ``branch`` 命令.语法是::
4654+
4655+ bzr branch URL [目录]
4656+
4657+如果目录没有给出,基于URL的最后一部分创建一个目录。这里有一些例子分别显示一个驱动限定路径(M:/)和一个SFTP URL::
4658+
4659+ bzr branch M:/cool-trunk
4660+ bzr branch sftp://bill@mary-laptop/cool-repo/cool-trunk
4661+
4662+这个例子明显的展示了新分支使用目录名::
4663+
4664+ bzr branch /home/mary/cool-repo/cool-trunk cool
4665+
4666+时间和空间的考虑
4667+---------------
4668+
4669+根据分支转移的大小,速度和您的计算机和源分支网络之间的延迟,首次转移可能需要一些时间。由于只传输分支间的改变,后续更新应该更快。
4670+
4671+请记住,Bazaar转移分支的完整历史记录,而不仅仅是最新的快照。因此,您可以在 ``分支`` 完成后关闭网络(或从网络共享断开),但您仍然能够尽可能多的获得 ``日志`` 和 ``diff`` 的分支历史。此外,这些操作作为历史快速存储在本地。
4672+
4673+需要注意的是,bazzr使用智能压缩技术,以尽量减少所需的磁盘空间来存储版本历史。在许多情况下,一个项目的完整历史记录将比最新版本的工作副本占用较少的磁盘空间。
4674+
4675+正如在后面的章节中,Bazaar也有支持一个分支的 `lightweight checkouts(轻量级checkouts) <using_checkouts.html#getting-a-lightweight-checkout>`_ 即没有存储本地历史的工作树。当然,断开连接的用法是不可用的,但是如果本地磁盘空间很有限,这是一个折衷方案。支持有限回溯到历史 - *历史视野* - 是目前正在开发。
4676+
4677+查看分支信息
4678+------------
4679+
4680+如果您想看一个分支的信息,包括分支来自何处,使用 ``info`` 命令。例如::
4681+
4682+ bzr info cool
4683+
4684+如果没有分支,显示当前分支的信息。
4685
4686=== added file 'doc/ch/user-guide/browsing_history.txt'
4687--- doc/ch/user-guide/browsing_history.txt 1970-01-01 00:00:00 +0000
4688+++ doc/ch/user-guide/browsing_history.txt 2012-11-23 02:18:19 +0000
4689@@ -0,0 +1,75 @@
4690+浏览历史记录
4691+================
4692+
4693+bzr log
4694+-------
4695+
4696+ ``bzr log`` 命令会展示一个先前版本的列表。
4697+
4698+ ``bzr diff``, ``bzr log`` 支持 ``-r`` 选项::
4699+
4700+ % bzr log -r 1000.. # Revision 1000 and everything after it
4701+ % bzr log -r ..1000 # Everything up to and including r1000
4702+ % bzr log -r 1000..1100 # changes from 1000 to 1100
4703+ % bzr log -r 1000 # The changes in only revision 1000
4704+
4705+查看融合版本
4706+------------
4707+
4708+作为分布式VCS工具例如Bazaar比集中式VCS工具更容易进行版本融合,一个分支的历史也许经常包含开发中的主线发展和以后的版本合并。技术上来说,众多修改节点之间的关系叫做DAG。
4709+
4710+在许多案例中,您当然想要先看主线然后再向下钻研。因此登录后默认直接展示主线并表明哪些修订被合并嵌套到修订里。为了审阅修订版里被合并的修订,使用如下命令::
4711+
4712+ bzr log -n0 -rX
4713+
4714+若想看所有的修订::
4715+
4716+ bzr log -n0
4717+
4718+注意:-n标志着显示等级,0代表所有。如果太乱,您可以容易的调整您所查看的数量。例如,如果您项目在团队审核员中的最高级的审核员, ``bzr log`` 展示最高级审核员做的事而 ``bzr log -n2`` 表示团队审核员做的事情。在多数案例中 ``-n0`` 即可。
4719+
4720+调整输出
4721+--------
4722+
4723+``log`` 命令有很多选项对输出有用。这些包括:
4724+
4725+ * ``--forward`` 表示登录按照时间排序,即:最新的修订最后显示。
4726+
4727+ * ``--limit`` 选项控制显示修订的最大数量。
4728+
4729+可以看在线帮助来了解log命令或用户参考来获得更多关于调整输出的命令。
4730+
4731+查看文件历史
4732+------------
4733+
4734+它对于过滤历史文件很有用,因此只能适用于一个指定的文件。为了达成目的需要我们为 ``log`` 命令像这样提供文件名::
4735+
4736+ bzr log foo.py
4737+
4738+查看老版本的文件
4739+---------------
4740+
4741+为了获得给定版本的文件内容可以这样使用 ``cat`` 命令::
4742+
4743+ bzr cat -r X file
4744+
4745+``X`` 是修订的标识符, ``file`` 是文件名。这些会把输出送入标准输出流所以您当然想到通过可观察的工具(像 ``less`` 或 ``more``)来输出或者像这样更改输出地址::
4746+
4747+ bzr cat -r -2 foo.py | less
4748+ bzr cat -r 1 foo.py > /tmp/foo-1st-version.py
4749+
4750+图形化历史记录视图
4751+-----------------
4752+
4753+历史浏览是GUI工具的一个便捷功能。Bazaar有很多插件提供了该功能,包括QBzr 和 bzr-gtk。如果您没有准备好安装这些插件,请看 `Using plugins(使用插件) <plugins.html>`_ 。
4754+
4755+用QBzr使用图形试图::
4756+
4757+ bzr qlog
4758+
4759+用bzr-gtk使用图形视图::
4760+
4761+ bzr viz
4762+
4763+``viz`` 事实上是 ``visualize`` 的简写,如果您喜欢长命令您也可以用 ``visualize`` 。
4764+
4765
4766=== added file 'doc/ch/user-guide/bug_trackers.txt'
4767--- doc/ch/user-guide/bug_trackers.txt 1970-01-01 00:00:00 +0000
4768+++ doc/ch/user-guide/bug_trackers.txt 2012-11-23 02:18:19 +0000
4769@@ -0,0 +1,34 @@
4770+Bug跟踪器
4771+============
4772+
4773+Bazaar有设备,让您能在项目的bug跟踪器中把提交和bug关联起来。其他工具(或hooks)能用这些信息生成bug和提交之间的超链接,或者在包含该提交的分支中自动标记bug为结束状态。
4774+
4775+关联提交和bug
4776+----------------------------
4777+
4778+当您做了一个提交,您可以用 ``commit`` 命令的 ``--fixes`` 选项将它和bug关联起来。例如::
4779+
4780+ $ bzr commit --fixes lp:12345 -m "Properly close the connection"
4781+
4782+这将在Bazaar中记录连接Launchpad中的bug 12345和该提交的相关数据。如果您用不同的bug跟踪器,它可以以它自己的跟踪器代码(而不是 ``lp`` )来代替使用。至于如何为Bugzilla,Trac,Roundup和其他bug/issue跟踪器配置这个功能,请参考Bazaar用户参考资料中的 `Bug跟踪器设置`_.
4783+
4784+.. _Bug跟踪器设置: http://doc.bazaar.canonical.com/bzr.dev/en/user-reference/index.html#bug-tracker-settings
4785+
4786+数据记录和bug跟踪器更新
4787+------------------------------------------
4788+
4789+在提交时记录bug修复的数据只是为完善bug跟踪器集成的一个特殊需求。因为Bazaar是分布式VCS,当提交时用户可能没联网,所以在这种时候访问bug跟踪器本身是不可能的。因此,建议安装一个hook,使得当提交更改到适合项目工作流程的中央位置时能够更新bug跟踪器。
4790+
4791+
4792+注意:当Launchpad扫描外部或托管的分支时,这第二个处理阶段就是Launchpad提供的集成的一部分。
4793+
4794+检查更正
4795+------------------
4796+
4797+关联修正和bug的方法有一些局限性。第一个就是只有在提交时关联才能被启用。这意味着如果您提交时忘记做关联操作或者bug是在您修复后才被记录,在以后您通常是不能返回和添加链接了。
4798+
4799+与此相关的是该关联是不可变的。如果bug被一个提交标记为已修复,但是该补丁又没有完全解决该bug,或者有一个更迟的回归,您不能返回和删除该链接。
4800+
4801+当然, ``bzr uncommit`` 命令常常被用来取消最近的提交,以此来确保再次提交的正确。这通常是为了纠正坏的提交信息,并且这也同样适用于改正最近提交的数据记录(例如,通过 ``--fixes`` 选项)。
4802+
4803+注意: ``uncommit`` 操作最好在发布错误的补丁之前使用。
4804
4805=== added file 'doc/ch/user-guide/bzrtools_plugin.txt'
4806--- doc/ch/user-guide/bzrtools_plugin.txt 1970-01-01 00:00:00 +0000
4807+++ doc/ch/user-guide/bzrtools_plugin.txt 2012-11-23 02:18:19 +0000
4808@@ -0,0 +1,31 @@
4809+BzrTools
4810+========
4811+
4812+简介
4813+--------
4814+
4815+BzrTools是对Bazaar有帮助的增强功能的集合。
4816+至于安装说明,请看BzrTools的主页:
4817+http://wiki.bazaar.canonical.com/BzrTools.
4818+这里是BzrTools提供的常用命令的一个示例。
4819+
4820+
4821+shell
4822+-----
4823+
4824+``bzr shell`` 启动命令解释器来理解Bazaar本身的命令。这样就有几个优势:
4825+
4826+ * 不需要在每个命令的前面打印 ``bzr``.
4827+
4828+ * 提供自动补全功能。
4829+
4830+ * 由于不需要每次都加载Bazaar的命令库,因此执行命令稍微快一些。
4831+
4832+
4833+cdiff
4834+-----
4835+
4836+``bzr cdiff`` 提供的是 ``bzr diff`` 命令输出的有色版本。
4837+在GNU/Linux, UNIX和OS X上, 这个命令经常被这样使用::
4838+
4839+ bzr cdiff | less -R
4840
4841=== added file 'doc/ch/user-guide/central_intro.txt'
4842--- doc/ch/user-guide/central_intro.txt 1970-01-01 00:00:00 +0000
4843+++ doc/ch/user-guide/central_intro.txt 2012-11-23 02:18:19 +0000
4844@@ -0,0 +1,20 @@
4845+集中式开发
4846+=======================
4847+
4848+动机
4849+----------
4850+
4851+而不是并行工作和偶尔合并,它可以用在工作步调一致的时候,即多个人连续提交变更到一个中心位置,每次提交前根据最新内容合并他们的工作。
4852+
4853+对像Subversion和CVS等中央VCS工具的用户来说,这个工作流程是非常熟悉的。它同样适用于一个人在多个机器上工作的开发人员,例如有的开发通常在桌面计算机上工作,有可能带笔记本电脑去旅行,或者有人在工作时间外用他们的家庭计算机(连接互联网)来完成办公工作。
4854+
4855+如果集中式开发已经使您的团队工作得很好,非常棒。很多团队以这种方式使用Bazaar,然后用实验替代工作流程。
4856+
4857+集中式工作流程
4858+--------------------
4859+
4860+下面的图表提供了一个 *集中式工作流程* 的概述。
4861+
4862+.. image:: images/workflows_centralized.png
4863+
4864+即使您的团队计划使用更多的分布式工作流,本章中许多任务可能对您有用,尤其是如何发布分支。
4865
4866=== added file 'doc/ch/user-guide/configuring_bazaar.txt'
4867--- doc/ch/user-guide/configuring_bazaar.txt 1970-01-01 00:00:00 +0000
4868+++ doc/ch/user-guide/configuring_bazaar.txt 2012-11-23 02:18:19 +0000
4869@@ -0,0 +1,147 @@
4870+配置Bazaar
4871+==========
4872+
4873+个人信息注册
4874+------------
4875+
4876+一个版本控制系统的最大作用就是可以追踪谁做了什么。在一个分布式系统中,这需要给每个作者一个全局唯一的身份识别信息。多部分人都有一个符合要求的东西:邮箱地址。Bazaar能够自动通过用户名和主机名来识别一个邮箱地址,如果您不喜欢Bazaar这个猜测的模式,您可以用 ``whoami`` 命令来设定您的身份识别信息::
4877+
4878+ % bzr whoami "Your Name <email@example.com>"
4879+
4880+如果 ``whoami`` 命令没有参数的话,会自动显示当前的用户信息。
4881+
4882+使用网络代理服务器
4883+-----------------
4884+
4885+如果您的网络要求您通过代理服务器与外界连接的话,您就必须要设置 ``http_proxy`` 变量。如果代理服务器也要求https连接的话,您还需要设置 ``http_proxy`` 变量。如果您需要这些而您又没有设置的话,您会发现您连接到Lauchpad或其他外部服务器时会失败或者超时。
4886+
4887+在Unix系服务器中您通常可以通过 ``/etc/environment`` 或者 ``~/.bash_profile`` 设置,而在Windows中这些都在用户配置文件中。
4888+
4889+::
4890+
4891+ http_proxy=http://proxy.example.com:3128/
4892+ https_proxy=http://proxy.example.com:3128/
4893+
4894+而 ``no_proxy`` 变量可以被设置成一系列由逗号隔开的主机名,这些主机应当是代理服务器所不能到达的。(浏览 <http://docs.python.org/library/urllib.html> 获取更多信息)
4895+
4896+多种配置方法
4897+------------
4898+
4899+就像上面所展示的,配置Bazaar的方法多种多样,但是它们也有共通的特性。一个选项包括:
4900+
4901+- 一个有效的Python标识符来作为名称,
4902+
4903+- 一个字符串作为值。在一些特殊的情况下,Bazaar能够将一些特殊的值,比如’True’、’False’识别为布尔型变量,但是一般来讲,作为一个用户,您应当永远指定一个字符串来作为值。
4904+
4905+为了保证某种环境中选项名是唯一的,选项名一般会按照不同的环境来分组。当需要的时候,可以通过在配置文件中记录选项以使它们能够长久的使用。
4906+
4907+
4908+配置文件
4909+--------
4910+
4911+Unix系OS中配置文件在目录 ``$HOME/.bazaar`` 下,Windows下则在 ``C:\Documents and Settings\<username>\Application Data\Bazaar\2.0`` 中。这些目录中有三个基本的配置文件:
4912+
4913+* ``bazaar.conf`` 描述了默认的配置选项,
4914+
4915+* ``locations.conf`` 描述了特定分支所在的配置信息,
4916+
4917+* ``authentication.conf`` 述了远程服务器的认证信息.
4918+
4919+每个分支还有一个设置了特定值的配置文件,即分支目录下的 ``.bzr/branch/branch.conf`` 文件,对 **这个分支下的所有用户** 都是可见的。如果您想将某个分支的值设置为您所需要的特定值,那么您可以在 ``locations.conf`` 中进行修改。
4920+
4921+以下是一个用 ``whoami`` 命令设定了某个邮箱地址后的 ``bazaar.conf`` 的示例内容::
4922+
4923+ [DEFAULT]
4924+ email = Your Name <email@example.com>
4925+
4926+如果您想深入地了解语法和能够支持的配置设置的话,可以参看Bazaar用户参考中的 `Configuration Settings <http://doc.bazaar.canonical.com/bzr.dev/en/user-reference/index.html#configuration-settings>`_ 。
4927+
4928+
4929+查看当前活动配置
4930+----------------
4931+
4932+要查看当前已定义的所有选项,您可以用以下命令::
4933+
4934+ bzr config
4935+
4936+``bzr`` 会执行一些规则来决定去哪里找配置选项所需的值。
4937+
4938+我们现在的策略是按以下顺序测试已存在的配置文件来找到匹配的定义。
4939+
4940+ * ``locations.conf`` 会被第一个搜索以找到名称能匹配当前地址的部分(工作树、分支或者是远程分支),
4941+
4942+ * 接下来是当前的 ``branch.conf`` ,
4943+
4944+ * 再接着是 ``bazaar.conf`` ,
4945+
4946+ * 最后,有一些值是在代码中定义的,不会出现在 ``bzr config`` 中 (具体参看 `Configuration Settings <http://doc.bazaar.canonical.com/bzr.dev/en/user-reference/index.html#configuration-settings>`_).
4947+
4948+不加参数使用 ```bzr config`` 命令可能更有利于理解, 您将会看到下面这些输出::
4949+
4950+ locations:
4951+ post_commit_to = commits@example.com
4952+ news_merge_files = NEWS
4953+ branch:
4954+ parent_location = bzr+ssh://bazaar.launchpad.net/+branch/bzr/
4955+ nickname = config-modify
4956+ push_location = bzr+ssh://bazaar.launchpad.net/~vila/bzr/config-modify/
4957+ bazaar:
4958+ debug_flags = hpss,
4959+
4960+每一个配置都与一个给定的范围联系,范围的名称会在一系列定义了的选项前给出。
4961+
4962+如果您需要更加具体的参数信息, 可以使用该命令::
4963+
4964+ bzr config <option>
4965+
4966+这样只会显示选项值,并且经常被用于脚本中。
4967+
4968+更改活动配置
4969+------------
4970+
4971+设置某一个选项为某值用如下命令::
4972+
4973+ bzr config opt=value
4974+
4975+一个选项值可以通过添加花括号来引用另一个选项值::
4976+
4977+ bzr config opt={other_opt}/subdir
4978+
4979+如果 ``other_opt``使用 ``'root``值, ``bzr config opt`` 将会输出以下内容::
4980+
4981+ root/subdir
4982+
4983+注意:当 ``--all`` 参数被使用时, 可以更好的反映配置文件的内容从而更容易的组织它们::
4984+
4985+ bzr config --all .*opt
4986+
4987+ bazaar:
4988+ [DEFAULT]
4989+ opt = {other_opt}/subdir
4990+ other_opt = root
4991+
4992+
4993+
4994+
4995+
4996+可以用以下命令来移除选项值::
4997+
4998+ bzr config --remove opt
4999+
5000+
The diff has been truncated for viewing.