-
Notifications
You must be signed in to change notification settings - Fork 1
/
atom.xml
696 lines (624 loc) · 44 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>mercurial tips from hgtip.com</title><link href="http://hgtip.com/http://zoomquiet.github.com/hgtip/atom.xml" rel="self"/><link href="http://hgtip.com/http://zoomquiet.github.com/hgtip"/><updated>2011-11-04T15:27:06Z</updated><id>http://hgtip.com/http://zoomquiet.github.com/hgtip/</id><entry><title>调试类命令的戏法</title><author><name>Friedrich Kastner-Masilko</name></author><link href="http://hgtip.com/http://zoomquiet.github.com/hgtip/advanced/2010-04-23-debug-command-tricks.html"/><updated>2010-04-23T00:00:00Z</updated><published>2010-04-23T00:00:00Z</published><id>http://hgtip.com/http://zoomquiet.github.com/hgtip/advanced/2010-04-23-debug-command-tricks.html/</id><content type="html">
<p>如果尝试过<code>hg help --debug</code>,
可能已熟悉有&#8217;调试&#8217;前缀命令.
他们多数用以检查 Mercurial 的内部存储情况,有的更加得心应手.
比如说,这两个:<code>hg debugsetparents</code> 和 <code>hg debugrebuildstate</code>.</p>
<p>第一个命令能强令 Mercurial 的工作复本忘记&#8221;真正&#8221;的父辈版本,而指向<code>debugsetparents</code>指定的修订版本.
第二个命令是迫使 Mercurial&nbsp;重建其内部状态.</p>
<p>那么,在正常情景里他们有用嘛?&nbsp;这里俺列举3种场景来说明他们怎么方便我们的工作的:</p>
<h3 id="1">1.&nbsp;将工作复本绑定到仓库</h3>
<p>设想有个Mercurial 发布的有趣项目.
起初,你只下载了一份儿项目的快照代码来体验.&nbsp;并没有完全克隆仓库,因为你要避免网络开销,只是看一下最新的代码.</p>
<p>在后来赏玩代码的过程中,你整明白了所有关系,
于是你想克隆仓库,并提交你的修订.
由于这货非常庞大,而且你已经重命名/删除/添加了一些文件,
又不想简单粗暴的复制覆盖到克隆仓库上.&nbsp;那么如何提交你的修订到适当的版本呢?</p>
<p>解决方案是复制 <code>.hg</code> 目录到快照根目录中,并执行:</p>
<pre><code>$ hg debugsetparent tip
$ hg debugrebuildstate
$ hg commit -Am "my snapshot"
</code></pre>
<h3 id="2">2.&nbsp;创建有备胎的检入</h3>
<p>如果你像我一样不信任自个儿.
那么,你一定也在删除之<strong>前</strong>追加一份备用的.&nbsp;用回滚来虐待提交,那不是你的范儿.</p>
<p>其实可以这么来:</p>
<pre><code>$ hg debugsetparent tip^^
$ hg debugrebuildstate
</code></pre>
<p>这样就恢复到你提交前的状态,甚至于&#8221;问题&#8221;提交,还存在.</p>
<h3 id="3-git-no-ff">3. 模拟 Git 的&#8212;no-ff&nbsp;匿名头合并</h3>
<p>多数Git的工作流程能很容易的在Mercurial里再现,
但有些(<a href="http://nvie.com/git-model">gitflow</a>)使用所谓的 &#8220;non-fast-forward&#8221; 合并.
这种合并也可以在Mercurial&nbsp;做到,但是只能对命名分行:</p>
<pre><code>$ hg sl
$ echo x &gt; x
$ hg ci -Am "base"
adding x
$ hg branch feature
marked working directory as branch feature
$ echo y &gt; x
$ hg ci -m "feature"
$ hg up default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg merge feature
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -m "merged"
$ hg glog
@ changeset: 2:e0502e1d12c6
|\ tag: tip
| | parent: 0:387ca709aeaf
| | parent: 1:205ec0dce78f
| | summary: merged
| |
| o changeset: 1:205ec0dce78f
|/ branch: feature
| summary: feature
|
o changeset: 0:387ca709aeaf
summary: base
</code></pre>
<p>如你所见,上面graphlog的输出说明,合并除了两个分支的名称
(&#8216;default&#8217; 和 &#8216;feature&#8217;) 并没有包含实际的详细信息.
从 Mercurial 1.5.1&nbsp;开始,你可以基于匿名头来进行合并了:</p>
<pre><code>$ echo x &gt; x
$ hg ci -Am "base"
adding x
$ echo y &gt; x
$ hg ci -m "feature"
$ hg up 0
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg merge 1
abort: nothing to merge (use 'hg update' or check 'hg heads')
</code></pre>
<p>一定得用匿名头嘛?
好吧,另种方法是用书签扩展来模拟 git 的分支.
杯具的是,用书签(来标识匿名头部)仍然是匿名头部,&nbsp;上述问题可以用以下方式来解决:</p>
<pre><code>$ hg bookmark master
$ hg bookmark feature -r 1
$ hg bookmark
* master 0:6965ee5bb884
feature 1:2061809a8e23
$ hg merge feature
abort: nothing to merge (use 'hg update' or check 'hg heads')
</code></pre>
<p>效果如:</p>
<pre><code>$ hg debugsetparents master feature
$ hg revert -a -r feature
reverting x
$ hg ci -m "merged"
$ hg glog
@ changeset: 2:0dfae55684f6
|\ tag: master
| | tag: tip
| | parent: 0:6965ee5bb884
| | parent: 1:2061809a8e23
| | summary: merged
| |
| o changeset: 1:2061809a8e23
|/ tag: feature
| summary: feature
|
o changeset: 0:6965ee5bb884
summary: base
</code></pre>
</content></entry><entry><title>进度条</title><author><name>David Harrigan</name></author><link href="http://hgtip.com/http://zoomquiet.github.com/hgtip/beginner/2010-03-24-keeping-informed-with-progress.html"/><updated>2010-03-24T00:00:00Z</updated><published>2010-03-24T00:00:00Z</published><id>http://hgtip.com/http://zoomquiet.github.com/hgtip/beginner/2010-03-24-keeping-informed-with-progress.html/</id><content type="html">
<p>有时 Mercurial 在处理多个文件时,在命令中会顿住不知道是否正常执行中.
好在1.5之后,有内置扩展来改进.只要先[修订你的配置文件: &#8216;~/.hgrc&#8217;]hgrc]&nbsp;包含类似声明:</p>
<pre><code>[extensions]
progress =
</code></pre>
<p>这个伶俐的小扩展,将使你在比较耗时的操作时的到这样的输出:</p>
<div class="screenshot">
<a href="https://github.com/ZoomQuiet/hgtip/blob/gh-pages/beginner/progress-verify.png"
title="Progress when verifying a Mercurial repository">
<img src="http://zoomquiet.github.com/hgtip/beginner/progress-verify.png"
class="force-border"
alt="Progress when verifying a Mercurial repository"/>
</a>
</div>
<p>注意到漂亮的进度条了嘛?&nbsp;这有另外一个实例:</p>
<div class="screenshot">
<a href="https://github.com/ZoomQuiet/hgtip/blob/gh-pages/beginner/progress-clone-remote.png"
title="Progress when cloning a remote Mercurial repository">
<img src="http://zoomquiet.github.com/hgtip/beginner/progress-clone-remote.png"
class="force-border"
alt="Progress when cloning a remote Mercurial repository"/>
</a>
</div>
<p>希望这一技巧能帮到你.
有关这一扩展的更多信息,请参考Mercurial 维基中 <a href="http://mercurial.selenic.com/wiki/ProgressExtension">progress</a>&nbsp;页面.</p>
</content></entry><entry><title>用`变基`扩展来合并MQ补丁</title><author><name>Steve Losh</name></author><link href="http://hgtip.com/http://zoomquiet.github.com/hgtip/advanced/2010-02-11-merging-mq-patches-with-rebase.html"/><updated>2010-02-11T00:00:00Z</updated><published>2010-02-11T00:00:00Z</published><id>http://hgtip.com/http://zoomquiet.github.com/hgtip/advanced/2010-02-11-merging-mq-patches-with-rebase.html/</id><content type="html">
<p><strong>首先:</strong> 在这里,俺想尝试新东西~ 这是首个包含截屏录像的贴士.
这是一个复杂的主题,俺认为用操作录像的形式可以更好的表述.请评注,反馈给俺知道你的体验,
是喜欢呢,还是期望 <code>hgtip</code> 保持纯文本的形式?!</p>
<p><strong>好吧~</strong>反正俺从珠海电信是看不到这个录像的&#8230;</p>
<p>这一贴士是为已能熟练并舒适使用 <a href="http://mercurial.selenic.com/wiki/MqExtension"><span class="caps">MQ</span></a>来处理补丁的好人.
如果常用<span class="caps">MQ</span>,您可能已经注意到一些问题.&nbsp;最大的麻烦一般发生在你处理一堆补丁时,又有人正好在对你处理中的文件提交了新修订.</p>
<p>正常的流程是先下拉他们的变更集,
<code>qpop</code>你的补丁,更新到新的仓库(或是分支),
再<code>qpush</code>你的补丁.
不幸的是<span class="caps">MQ</span>不保留补丁的继承轨迹,从而在你进行<code>qpush</code>时无法智能合并.</p>
<p>解决这一问题的方法,就是使用<a href="http://mercurial.selenic.com/wiki/RebaseExtension">变基扩展</a>,
在<span class="caps">MQ</span>补丁期间确保他们可用.&nbsp;我将在下面的截屏录像里演示如何进行:</p>
<div class="screencast">
<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0' width='560' height='345'><param name='movie' value='http://screenr.com/Content/assets/screenr_1116090935.swf' /><param name='flashvars' value='i=46386' /><param name='allowFullScreen' value='true' /><embed src='http://screenr.com/Content/assets/screenr_1116090935.swf' flashvars='i=46386' allowFullScreen='true' width='560' height='345' pluginspage='http://www.macromedia.com/go/getflashplayer'></embed></object>
</div>
</content></entry><entry><title>风格化Mercurial的CLI</title><author><name>Steve Losh</name></author><link href="http://hgtip.com/http://zoomquiet.github.com/hgtip/advanced/2010-01-15-styling-mercurials-cli.html"/><updated>2010-01-15T00:00:00Z</updated><published>2010-01-15T00:00:00Z</published><id>http://hgtip.com/http://zoomquiet.github.com/hgtip/advanced/2010-01-15-styling-mercurials-cli.html/</id><content type="html">
<p>Mercurial 拥有一个非常捧的命令行界面,多数开发者在仓库中工作时根本用不上图形界面的工具.&nbsp;不过,通过模板功能我们可以将其变得更加爽直.</p>
<p>本贴士会展示一些我自个儿在用的模板给你作参考.
要想明白模板具体怎么工作的,推荐参考 <code>hg help templating</code> 内置手册.</p>
<p>如果你喜欢俺的分享,可以直接从BitBucket中的<a href="http://bitbucket.org/sjl/mercurial-cli-templates/">仓库</a>克隆一份来用:</p>
<pre><code>hg clone http://bitbucket.org/sjl/mercurial-cli-templates/
</code></pre>
<p><a href="http://stevelosh.com/blog/2009/03/candy-colored-terminal/">blog entry</a> I wrote about it.
<strong>注意:</strong> 我对自个儿的终端进行了颜色定制,
如果你喜欢俺的定制,推荐阅读我为之专门写的<a href="http://stevelosh.com/blog/2009/03/candy-colored-terminal/">Blog文章</a>.</p>
<div class="toc">
<ul>
<li><a href="#">短日志</a><ul>
<li><a href="#_1">美日志</a></li>
<li><a href="#_2">简图志</a></li>
<li><a href="#_3">贡献</a></li>
</ul>
</li>
</ul>
</div>
<h2 id="">短日志</h2>
<p>在 <a href="../beginner/2009-10-07-shortlog-for-fun-and-profit.html">前述贴士</a> 里,我描述了如何通过 <code>hg slog</code> 的别名命令来统计变更集.
配合适当的风格对你的日常工作将更加好用.
这里展示一下 <code>hg slog</code> 的效果:</p>
<div class="screenshot">
<a href="http://www.flickr.com/photos/sjl7678/4277311247/"
title="hg-slog by Steve Losh, on Flickr">
<img src="http://farm5.static.flickr.com/4064/4277311247_343f88a399.jpg"
width="500" height="488" alt="hg-slog" />
</a>
</div>
<p>使用这一模板,得 <a href="2009-09-30-configuring-mercurial.html">修订 ~/.hgrc </a>&nbsp;包含以下配置:</p>
<pre><code>[alias]
slog = log --style=/full/path/to/map-cmdline.slog
</code></pre>
<h2 id="_1">美日志</h2>
<p>用短日志样式来快速回顾过往变更变更集很赞,
不过,要想查阅指定变更集的详细信息时,我创建了 <code>hg nlog</code> 别名,输出的效果如下:</p>
<div class="screenshot">
<a href="http://www.flickr.com/photos/sjl7678/4278058138/"
title="hg-nlog by Steve Losh, on Flickr">
<img src="http://farm5.static.flickr.com/4054/4278058138_4ecb312f11.jpg"
width="412" height="500" alt="hg-nlog" />
</a>
</div>
<p>使用这一模板,得 <a href="2009-09-30-configuring-mercurial.html">修订 ~/.hgrc </a>&nbsp;包含以下配置:</p>
<pre><code>[alias]
nlog = log --style=/full/path/to/map-cmdline.nlog
</code></pre>
<h2 id="_2">简图志</h2>
<p><a href="/tips/beginner/2009-10-03-stay-sane-with-graphlog/">图形日志</a> 命令对回顾仓库的分支情况非常有用,
不过,我们可以运用模板来更加简洁的查阅.&nbsp;最终效果如下:</p>
<div class="screenshot">
<a href="http://www.flickr.com/photos/sjl7678/4277311549/"
title="hg-sglog by Steve Losh, on Flickr">
<img src="http://farm5.static.flickr.com/4045/4277311549_ae56e22012.jpg"
width="441" height="500" alt="hg-sglog" />
</a>
</div>
<p>使用这一模板,得 <a href="2009-09-30-configuring-mercurial.html">修订 ~/.hgrc </a>&nbsp;包含以下配置:</p>
<pre><code>[alias]
sglog = glog --style=/full/path/to/map-cmdline.sglog
</code></pre>
<h2 id="_3">贡献</h2>
<p>如果你有更加漂亮的模板,或是对俺的有所改进,
可以在 BitBucket 中自由分支 <a href="http://bitbucket.org/sjl/mercurial-cli-templates/">仓库</a>&nbsp;继续增订.</p>
</content></entry><entry><title>找出不寻常的变更集</title><author><name>Steve Losh</name></author><link href="http://hgtip.com/http://zoomquiet.github.com/hgtip/beginner/2009-12-09-finding-uncommon-changesets.html"/><updated>2009-12-09T00:00:00Z</updated><published>2009-12-09T00:00:00Z</published><id>http://hgtip.com/http://zoomquiet.github.com/hgtip/beginner/2009-12-09-finding-uncommon-changesets.html/</id><content type="html">
<p>这一技巧是从 <a href="http://mercurial.selenic.com/wiki/MailingLists">mercurial-devel 邮件列表</a> 的<a href="http://www.selenic.com/pipermail/mercurial-devel/2009-December/017417.html">讨论</a>中得到的灵感.</p>
<p>问题的要点是:你是否能指出哪些变更可以包含在版本 <code>X</code> 而不包含在 <code>Y</code> 版本中?&nbsp;这通常在你需要明确两个软件版本中确切的差异时很有用.</p>
<p>这看起来很简单,但是有几个方面你都得同时考虑到.</p>
<p>注意:我将运用 <a href="/tips/beginner/2009-10-07-shortlog-for-fun-and-profit/">精简日志</a> 来使默认的 <code>hg log</code> 输出更加可读.
虽然操作使用的是 <code>hg log</code> (其实,已经用 <code>hg slog</code> 配置了别名来替代 <code>hg log</code>),
所以,面对精简日志格式,请放轻松&nbsp;;-)</p>
<h3 id="">简单方法(不完美的)</h3>
<p>先从简单的方式, 用 <code>--rev</code> 来列出版本,某仓库使用图形日志时的输出可能是:</p>
<pre><code>$ hg glog
o 4 Fix another bug. (6 seconds ago by Steve Losh) tip
|
o 3 Fix a bug. (16 seconds ago by Steve Losh)
|
@ 2 Add another simple feature. (34 seconds ago by Steve Losh)
|
o 1 Add a simple feature. (40 seconds ago by Steve Losh)
|
o 0 Initial revision. (7 minutes ago by Steve Losh)
</code></pre>
<p>如果你目前在 版本<code>2</code>,想知道如果升级到 <code>tip</code> 得包含哪些变更集,先尝试:</p>
<pre><code> $ hg slog --rev 2:tip
2 Add another simple feature. (5 minutes ago by Steve Losh)
3 Fix a bug. (5 minutes ago by Steve Losh)
4 Fix another bug. (5 minutes ago by Steve Losh) tip
</code></pre>
<p>会见到输出包含了 版本<code>2</code>,实话说不应该列出来,不过,问题不大,你可以直接忽略.</p>
<p>而且,这种方法,在你有多个分支时就囧了:</p>
<pre><code>$ hg glog
@ 6 Fix a critical bug. (1 second ago by Steve Losh) tip
|
| o 5 Start the rewrite of the UI. (24 seconds ago by Steve Losh) ui-rewrite
| |
o | 4 Fix another bug. (8 minutes ago by Steve Losh)
| |
o | 3 Fix a bug. (8 minutes ago by Steve Losh)
| |
o | 2 Add another simple feature. (9 minutes ago by Steve Losh)
|/
o 1 Add a simple feature. (9 minutes ago by Steve Losh)
|
o 0 Initial revision. (16 minutes ago by Steve Losh)
$ hg slog --rev 2:tip
2 Add another simple feature. (9 minutes ago by Steve Losh)
3 Fix a bug. (9 minutes ago by Steve Losh)
4 Fix another bug. (9 minutes ago by Steve Losh)
5 Start the rewrite of the UI. (54 seconds ago by Steve Losh)
6 Fix a critical bug. (31 seconds ago by Steve Losh) tip
</code></pre>
<p>注意到这时 <code>hg slog</code> 的输出包含了版本<code>5</code>.
这是个独立分支,当你从 版本<code>2</code>升级到<code>tip</code>(即版本<code>6</code>)时,其实并没有包含版本<code>5</code>.</p>
<p>这是因为,你使用版本号来通告 Mercurial 进行处置的范畴.
<code>1:4</code> 的含义就是 &#8220;<code>1</code>, <code>2</code>, <code>3</code>, 到 <code>4</code> 不论她们分布在什么分支上.&#8221;</p>
<p>使用扩展参数,可以可以令 <code>hg log</code> 更加精确.</p>
<h3 id="_1">当前方法</h3>
<p>如果我们退回来思考要解决的问题,&nbsp;就可以缩小问题的定义.其实我们要查阅:</p>
<ul>
<li>目标版本包含的变更(换而言之:继承的)</li>
<li><strong>除</strong>了出发点版本已经包含的变更</li>
</ul>
<p>可以用两个参数 <code>--rev</code> 和 <code>--follow</code> 来解决第一个问题:</p>
<pre><code>$ hg slog --rev tip:0 --follow
6 Fix a critical bug. (11 minutes ago by Steve Losh) tip
4 Fix another bug. (20 minutes ago by Steve Losh)
3 Fix a bug. (20 minutes ago by Steve Losh)
2 Add another simple feature. (20 minutes ago by Steve Losh)
1 Add a simple feature. (21 minutes ago by Steve Losh)
0 Initial revision. (28 minutes ago by Steve Losh)
</code></pre>
<p>注意,这就没有包含其它分支上的变更了.</p>
<p>使用 <code>--rev DESTINATION:0</code> 配合 <code>--follow</code>
表达&#8221;展示<code>DESTINATION</code>所有继承的变更&#8221;.
用 <code>hg help log</code> 来进一步了解所有参数细节.</p>
<p>现在就剩一件事儿了 &#8212;&nbsp;我们要清除当前版本已包含的变更:</p>
<pre><code>$ hg slog --rev tip:0 --follow --prune 2
6 Fix a critical bug. (16 minutes ago by Steve Losh) tip
4 Fix another bug. (25 minutes ago by Steve Losh)
3 Fix a bug. (25 minutes ago by Steve Losh)
</code></pre>
<p>就酱! 在我们的仓库中,变更集<code>6</code>,<code>4</code>和<code>3</code> 是从 <code>2</code> 升级到 <code>6</code> 需要历经的变更.</p>
<p>最终命令应该是这样的:</p>
<pre><code>hg slog --rev DESTINATION:0 --follow --prune SOURCE
| | || | | +-- 出发版本号
| | || | +-- 剔除指定版本包含的变更集
| | || +-- 跟随变更路径,而不是无视分支
| | |+-- 对比到底部版本
| | +-- 连续版本
| +-- 目标版本号
+-- 指定版本号范畴
</code></pre>
<p>当然,你可以用版本的指代快捷形式.
例如,要查阅从当前版本升级到 <code>tip</code>(顶端)时包含的变更:</p>
<pre><code>hg slog -r tip:0 -fP .
</code></pre>
<p>注意: 这一命令在你向后升级时<strong>不</strong>工作.那将仅显示你已经追加的变更
&#8212; 不会涉及 已经在 <code>SOURCE</code> 中但<strong>不</strong>在 <code>DESTINATION</code> 中的变更.</p>
</content></entry><entry><title>二进制文件的合并</title><author><name>Ryan Wilcox</name></author><link href="http://hgtip.com/http://zoomquiet.github.com/hgtip/advanced/2009-11-30-merging-binary-files.html"/><updated>2009-11-30T00:00:00Z</updated><published>2009-11-30T00:00:00Z</published><id>http://hgtip.com/http://zoomquiet.github.com/hgtip/advanced/2009-11-30-merging-binary-files.html/</id><content type="html">
<p>比如说,你在构建一个web站点,将使用的图片也用 Mercurial 进行了管理.&nbsp;若同时有两个人对图片进行了变更就引发了二进制文件的冲突.</p>
<h3 id="mercurial-setting-up-mercurial-for-different-merge-tools">为合并工具配置 Mercurial Setting up Mercurial for Different Merge&nbsp;Tools</h3>
<p>在你的 <code>~/.hgrc</code> 文件中,先增订如下配置:</p>
<pre><code>[merge-tools]
diff_images.args = $output $other
[merge-patterns]
**.png = diff_images
</code></pre>
<p>现在,创建 <code>diff_images</code> 脚本,并配置为可执行,丢到 <code>$PATH</code> 里,类似:</p>
<pre><code>open -a GraphicConverter $1 $2 -W
# 用GraphicConverter 打开第一/二参数进行处置
# 直到返回,再继续脚本运行.
</code></pre>
<p>现在遇到<code>.png</code> 文件的合并冲突时,将使用 <code>GraphicConverter</code>打开两个图片:</p>
<ul>
<li>当前你工作中目录中的</li>
<li>存在Mercurial&nbsp;仓库中的</li>
</ul>
<p>你能轻易的识别出这两种文件,因为从 Mercurial 中提取的图片有个随机字母组成的很长的扩展名.
例如,如果冲突的文件是<code>image.png</code>那么
GraphicConverter 在两个窗口打开: <code>image.png</code> 和 <code>image.png〜other.bQkQxd</code>。</p>
<p>手动移动新的文件到原文件(<code>image.png</code>)以确认更改,
保存,完成后 <code>GraphicConverter</code> 就退出.&nbsp;现在就可以检入变更了.</p>
<h3 id="">工作原理</h3>
<p>首先,通过 <code>diff_images.args</code> 配置两个参数用调用图像工具:</p>
<ul>
<li><code>$output</code> 指Mercurial&nbsp;将检入的文件,包含继承自父辈的变更</li>
<li><code>$other</code> 指准备进行合并的版本</li>
</ul>
<p>其实,还有其它 <code>.args</code> 参数可用:</p>
<ul>
<li><code>$local</code> 是 <code>$output</code> 的复本,不过合并会忽略文件的历史变更集</li>
<li><code>$base</code> 是发生分岐前的文件</li>
</ul>
<p>您能用这些设置三种合并方式,
提高<code>diff_images</code> 的展现能力,向用户出示合并 <em>前</em>&nbsp;发生了什么.</p>
<p>接下来的 <code>[merge-patterns]</code> 部分,声明对匹配什么模式的文件使用合并工具.</p>
<p>如果没有 <code>merge-pattern</code> 这节配置,
<code>diff_images</code>会作为差异处置候选程序,
很可能因 Mercurual 判定 <code>diff_images</code> 不操作二进制文件差异而被略过.
添加了 <code>[merge-pattern]</code> 就会告之 Mercurial <code>diff_images</code>
可以处理的文件类型,从而达到效果.</p>
<p>另外,可以用 <code>diff_images.args</code> 来替代<code>merge-patterns</code>
告诉 Mercurial <code>diff_images</code> 可以处理二进制文件:</p>
<pre><code>diff_images.binary= TRUE
</code></pre>
<p>然而,这将使 <code>diff_images</code> 尝试对 <em>所有</em> 二进制文件进行差异处理,
对 <code>GraphicConverter</code> 而言显然 <span class="caps">HOLD</span> 不住
(例如,对mp3音乐文件进行差异处理,肯定不是 <code>GraphicConverter</code> 能作的)</p>
<h3 id="_1">发生恶性错误时:中止合并</h3>
<p>合并 <em>不能</em> 通过标准的 <code>hg revert</code> 来恢复.&nbsp;尝试一下,你会得到:</p>
<pre><code>$ hg revert --all
abort: uncommitted merge - please provide a specific revision
</code></pre>
<p>不过,要是想放弃你的合并,从头再来.
使用<code>hg update --clean</code>.</p>
<h3 id="_2">参考</h3>
<ul>
<li><a href="http://mercurial.selenic.com/wiki/MergeToolConfiguration">Merge Tool Configuration on the Mercurial&nbsp;Wiki</a></li>
<li><a href="http://mercurial.selenic.com/bts/issue1533">Issue 1533: &#8220;abort: outstanding uncommitted merges should mention update&nbsp;-C&#8221;</a></li>
<li><a href="http://mercurial.selenic.com/wiki/BinaryFiles">Binary Files in Mercurial explained, on the Mercurial&nbsp;Wiki</a></li>
</ul>
</content></entry><entry><title>恢复整乱的文件</title><author><name>Ryan Wilcox</name></author><link href="http://hgtip.com/http://zoomquiet.github.com/hgtip/beginner/2009-11-30-reverting-dirty-files.html"/><updated>2009-11-30T00:00:00Z</updated><published>2009-11-30T00:00:00Z</published><id>http://hgtip.com/http://zoomquiet.github.com/hgtip/beginner/2009-11-30-reverting-dirty-files.html/</id><content type="html">
<p>好吧,你想放弃一些不靠谱的修订:</p>
<pre><code>$ hg status
M fileone.txt
M filetwo.txt
</code></pre>
<p>逐一打开这些文件手工修订回去,那绝对是坑爹的.
所以,Mercurial 提供了专用命令: <code>hg revert</code>:</p>
<pre><code>$ hg revert filetwo.txt
</code></pre>
<p>如果你要一次次放弃N个文件的变更,使用 <code>--all</code> 开关:</p>
<pre><code>$ hg revert --all
reverting fileone.txt
reverting filetwo.txt
</code></pre>
<p>对于 Git 宅而言,这一命令效果同 <code>git reset --hard HEAD^</code> </p>
<p><strong>译注</strong>:
这个技巧的前提是你还没有用 <code>hg ci</code> 将变更检入仓库,
如果你想恢复几个版本前的文件状态(多数情况下,是几个特定的文件) 那就要使用 <code>hg merge</code> 小心的对指定文件的指定版本进行合并了&#8230;</p>
</content></entry><entry><title>仓库整合</title><author><name>Steve Losh</name></author><link href="http://hgtip.com/http://zoomquiet.github.com/hgtip/advanced/2009-11-17-combining-repositories.html"/><updated>2009-11-17T00:00:00Z</updated><published>2009-11-17T00:00:00Z</published><id>http://hgtip.com/http://zoomquiet.github.com/hgtip/advanced/2009-11-17-combining-repositories.html/</id><content type="html">
<p>Thomas 分享的技巧 <a href="2009-11-16-using-convert-to-decompose-your-repository.html">分解仓库 </a> 令俺意识到,相反的需求乍整?&nbsp;将两个仓库整合为一个.</p>
<p>比如,你的项目,代码都在 <code>project</code> 仓库,而文档都在 <code>docs</code>.&nbsp;发觉这么搞很蛋痛,决定整合在一起方便大家.</p>
<p>你 <em>可以</em> 创建新仓库,并复制入所有相关数据,
但是这样一来,就无法保留历史变更了.&nbsp;让我们来研究一下怎么完美作到仓库的整合.</p>
<h2 id="">创建全新的目标仓库</h2>
<p>首先创建目标新仓库:</p>
<pre><code>$ ls
total 24
drwxr-xr-x 5 sjl 170B Nov 17 19:56 docs
drwxr-xr-x 4 sjl 136B Nov 17 19:58 project
$ mv project project-code
$ hg init project
$ ls
total 24
drwxr-xr-x 5 sjl 170B Nov 17 19:56 docs
drwxr-xr-x 3 sjl 102B Nov 17 20:04 project
drwxr-xr-x 4 sjl 136B Nov 17 19:58 project-code
</code></pre>
<p>我们先将原 <code>project</code> 仓库变成 <code>project-code</code>.</p>
<h2 id="_1">整理好各仓库</h2>
<p>我们当然不想将所有东西吐到新仓库的根目录里.
所以,首先我们将原 <code>project</code> 仓库的数据迁移到 <code>src/</code> 目录里:</p>
<pre><code>$ cd project-code
$ mkdir src
$ mv * src
mv: rename src to src/src: Invalid argument
$ ls
total 0
drwxr-xr-x 3 sjl 102B Nov 17 20:08 src
$ hg addremove --similarity 100
removing myproject.py
adding src/myproject.py
recording removal of myproject.py as rename to src/myproject.py (100% similar)
$ hg commit -m 'Move the code into the src/ directory.'
</code></pre>
<p>同理对<code>doc</code> 仓库也进行处理:</p>
<pre><code>$ cd ../docs
$ mkdir docs
$ mv * docs
mv: rename docs to docs/docs: Invalid argument
$ ls
total 0
drwxr-xr-x 4 sjl 136B Nov 17 20:11 docs
$ hg addremove --similarity 100
removing LICENSE
removing README
adding docs/LICENSE
adding docs/README
recording removal of LICENSE as rename to docs/LICENSE (100% similar)
recording removal of README as rename to docs/README (100% similar)
$ hg commit -m 'Move the documentation into the docs/ directory.'
</code></pre>
<h2 id="_2">拉入全部仓库</h2>
<p>现在,我们已经调整好了仓库结构,需要将原仓库逐一拉入 <code>project</code>:</p>
<pre><code>$ cd ..
$ ls
total 24
drwxr-xr-x 4 sjl 136B Nov 17 20:12 docs
drwxr-xr-x 3 sjl 102B Nov 17 20:04 project
drwxr-xr-x 4 sjl 136B Nov 17 20:08 project-code
$ cd project
$ ls
$ hg pull --update ../project-code
pulling from ../project-code
requesting all changes
adding changesets
adding manifests
adding file changes
added 4 changesets with 4 changes to 2 files
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ ls
total 0
drwxr-xr-x 3 sjl 102B Nov 17 20:15 src
$ hg pull --force --update ../docs
pulling from ../docs
searching for changes
warning: repository is unrelated
adding changesets
adding manifests
adding file changes
added 3 changesets with 4 changes to 4 files (+1 heads)
not updating, since new heads added
(run 'hg heads' to see heads, 'hg merge' to merge)
$ ls
total 0
drwxr-xr-x 3 sjl 102B Nov 17 20:15 src
</code></pre>
<p>注意,我们在 <code>hg pull</code> 时使用 <code>--force</code> 标记来告诉 Mercurial:&nbsp;&#8221;没事儿,俺知道俺在作什么,俺真的要将这俩仓库合并起来.&#8221;</p>
<h2 id="_3">合并仓库</h2>
<p>回顾一下最后那个 <code>ls</code> 命令的输出.
为毛只有 <code>src/</code> 目录?
那是因为我们必须进行合并,才真正完成仓库的 <code>整合</code>.</p>
<p>先来观察一下新仓库的图形日志,来明确真实情况:</p>
<pre><code>$ hg glog
o 6 Move the documentation into the docs/ directory. (7 minutes ago by Steve Losh) tip
|
o 5 Add a LICENSE file. (22 minutes ago by Steve Losh)
|
o 4 Add a README file. (22 minutes ago by Steve Losh)
@ 3 Move the code into the src/ directory. (10 minutes ago by Steve Losh)
|
o 2 Fix a bug. (21 minutes ago by Steve Losh)
|
o 1 Implement some basic functionality. (21 minutes ago by Steve Losh)
|
o 0 Start the project. (21 minutes ago by Steve Losh)
</code></pre>
<p>看到了吧,实际上有两个版本树.
变更集0到3是有关联的,而4一直链接到6,不过,3和4却没有什么关联.
现在我们要将这两个版本树焊接到一起.&nbsp;这其实牵扯的事儿很小,毕竟之前也没有什么关联:</p>
<pre><code>$ hg update 6
2 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg merge 3
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg commit -m 'Combine the source and docs repositories.'
</code></pre>
<p>现在再观察一下树图:</p>
<pre><code>$ hg glog
@ 7 Combine the source and docs repositories. (37 seconds ago by Steve Losh) tip
|\
| o 6 Move the documentation into the docs/ directory. (11 minutes ago by Steve Losh)
| |
| o 5 Add a LICENSE file. (26 minutes ago by Steve Losh)
| |
| o 4 Add a README file. (27 minutes ago by Steve Losh)
|
o 3 Move the code into the src/ directory. (15 minutes ago by Steve Losh)
|
o 2 Fix a bug. (25 minutes ago by Steve Losh)
|
o 1 Implement some basic functionality. (25 minutes ago by Steve Losh)
|
o 0 Start the project. (26 minutes ago by Steve Losh)
$ ls
total 0
drwxr-xr-x 4 sjl 136B Nov 17 20:22 docs
drwxr-xr-x 3 sjl 102B Nov 17 20:22 src
</code></pre>
<p>我们原先两个仓库,已经完美合并成了一个!&nbsp;现在可以删除旧仓库,将新仓库提供给大伙使用了.</p>
<p>更加<span class="caps">NB</span>的是,因为实际上我们并没有改变历史变更集的散列值,&nbsp;这意味着原先使用独立仓库的老用户,可以无缝使用新仓库!</p>
</content></entry><entry><title>用 Convert 来分解仓库</title><author><name>Thomas G. Willis</name></author><link href="http://hgtip.com/http://zoomquiet.github.com/hgtip/advanced/2009-11-16-using-convert-to-decompose-your-repository.html"/><updated>2009-11-16T00:00:00Z</updated><published>2009-11-16T00:00:00Z</published><id>http://hgtip.com/http://zoomquiet.github.com/hgtip/advanced/2009-11-16-using-convert-to-decompose-your-repository.html/</id><content type="html">
<p>如果你的仓库包含了很多项目(目录).</p>
<p>现在,你决定将每个项目(目录)拆分到独立仓库.
那么,使用 <code>convert</code> 扩展来处置,还能保留历史变更.</p>
<p>例如,当前仓库是这样的:</p>
<pre><code>/yourrepository
/DatabaseFoo
/SweetBusinessLogic
/BaseUI
/AnotherDamnContentManagementSystem
</code></pre>
<p>若认定 <code>AnotherDamnContentManagementSystem</code> 真的要启用独立仓库,&nbsp;并且能预见到继续和其它项目混到一起进行版本控制,很囧很杯具.</p>
<p>那么,你非常幸运的可以使用 <code>convert</code> 扩展快速完成调整,而不耽搁和风投进行午餐.</p>
<p>首先 <a href="2009-09-30-configuring-mercurial.html">激活 convert 扩展</a>:</p>
<pre><code>[extensions]
convert =
</code></pre>
<p><code>convert</code> 命令有 <code>--filemap</code> 参数,可以指定哪些目录进行转换,哪些忽略.
你甚至可以将更名包含到操作里.
一般 <code>--filemap</code> 这么来定义:</p>
<pre><code>include AnotherDamnContentManagementSystem
rename .
</code></pre>
<p>然后,就可以这么调用<code>convert</code> :</p>
<pre><code>$ hg convert --filemap myfilemap bigrepo AnotherDamnContentManagementSystem-Repo
</code></pre>
<p>齐活儿.
现在 <code>AnotherDamnContentManagementSystem</code> 已经在自个儿的仓库中了.</p>
</content></entry><entry><title>使用 Git 镜像</title><author><name>Steve Losh</name></author><link href="http://hgtip.com/http://zoomquiet.github.com/hgtip/advanced/2009-11-09-create-a-git-mirror.html"/><updated>2009-11-09T00:00:00Z</updated><published>2009-11-09T00:00:00Z</published><id>http://hgtip.com/http://zoomquiet.github.com/hgtip/advanced/2009-11-09-create-a-git-mirror.html/</id><content type="html">
<p>相对其它类似Mercurial 的分布式版本控制系统,
<a href="http://git-scm.com">git</a> 是最流行的一种.
如果你的项目使用 Mercurial,
可以轻松的建立一个 git 镜像仓库,这样,那些 git&nbsp;用户就可以对你的项目进行方便的贡献了!</p>
<h3 id="hg-git">安装&nbsp;hg-git</h3>
<p>首先,你得下载 <a href="http://hg-git.github.com/">hg-git</a>&nbsp;插件:</p>
<pre><code>easy_install dulwich
hg clone http://bitbucket.org/durin42/hg-git/
</code></pre>
<p><strong>提示:</strong> 当前Python&nbsp;环境有更好的模块管理系统,可以使用一行命令完成安装:</p>
<pre><code># pip install hg-git
</code></pre>
<p>现在<a href="2009-09-30-configuring-mercurial.html">修订你的 <code>~/.hgrc</code> </a>&nbsp;包含:</p>
<pre><code>[extensions]
hggit = /path/to/hg-git
</code></pre>
<h3 id="github">创建 GitHub&nbsp;帐号</h3>
<p>你肯定需要有地儿部署你的git 镜像,<a href="http://github.com/">GitHub</a> 是最好的选择.
到 GitHub 的<a href="http://github.com/plans">注册</a> 页面先创建个帐号吧.&nbsp;当然已经有了最好.</p>
<h3 id="github_1">在 GitHub&nbsp;创建仓库</h3>
<p>使用 &#8220;New Repository&#8221;&nbsp;按钮创建仓库先.</p>
<p>一但创建了仓库,你应该可以见到如下页面:</p>
<div class="screenshot">
<a href="http://www.flickr.com/photos/sjl7678/4091674740/" title="GitHub New Repo Sample by Steve Losh, on Flickr"><img src="http://farm3.static.flickr.com/2580/4091674740_f6d488f9a5.jpg" width="432" height="500" alt="GitHub New Repo Sample" /></a>
</div>
<p>的到 <code>[email protected]:username/project.git</code> ?&nbsp;用你的帐号名,替换对应用户名,这将用以推送镜像仓库.</p>
<h3 id="">发布你的项目</h3>
<p>现在安装好了 <code>hg-git</code> 并创建了对应的 GitHub 镜像仓库,你需要将己有的 Mercurial 仓库推送进 GitHub.
首先,要将 git 的仓库地址增订到你的 Mercurial 仓库中的 <code>.hg/hgrc</code> 配置中:</p>
<pre><code>[paths]
git = git+ssh://[email protected]/username/project.git
</code></pre>
<p><strong>重要提示:</strong> 你得用<code>/</code>(正斜杠)来替代<code>github.com</code> 后的<code>:</code>.因为这是 Mercurial&nbsp;的仓库访问格式.</p>
<p>当然,你也得将 <code>username</code> 和 <code>project</code> 根据之前的 git&nbsp;仓库信息进行替换.</p>
<p>现在,你要向 <code>git</code> 推送,以便创建镜像:</p>
<pre><code>hg push git
</code></pre>
<p>如果你的仓库很太,这将消耗些时间.
一担正常完成,你的Mercurial 仓库就拥有了一个 100% 的git仓库镜像,
git 用户可以使用 <code>git clone git://github.com/username/project.git</code> 来克隆你的化,加入开发,而没有意识到你其实在用&nbsp;mercurial.</p>
<h3 id="_1">接受贡献</h3>
<p>为 git 用户创建仓库镜像很简单,
(如果你的项目很有趣)终究会有人在GitHub 里向你发出下拉申请的,这时,如何简单的将 git 用户的修订,下拉到 Mercurial&nbsp;仓库来?</p>
<p><code>hg-git</code> 让一切轻松自在.
首先要将贡献者的分支仓库追加到你的项目路径中(增补 <code>.hg/hgrc</code>):</p>
<pre><code>[paths]
git = git+ssh://[email protected]/username/project.git
contributor = git+ssh://[email protected]/contributor_username/project.git
</code></pre>
<p>再次提醒, <strong>将<code>github.com</code>后的<code>:</code>用<code>/</code> (正斜杠)替代!</strong></p>
<p>然后就可以 pull 那些变更集到你的 Mercurial&nbsp;仓库:</p>
<pre><code>hg pull contributor
</code></pre>
<p>你可以使用 <a href="/tips/beginner/2009-10-03-stay-sane-with-graphlog/">graphlog</a>&nbsp;来非常直观的观察(如果需要合并时).</p>
<p>合并你需要的(想要的), 再将这些贡献推送到你的Mercurial 主仓库以及 git&nbsp;镜像仓库:</p>
<pre><code>hg push
hg push git
</code></pre>
<p>以上是基本操作!
如果你有很变态的多分支开发流程,那么事儿就洧这么简单,
不过,当前小贴士足以使你用习惯的方式来接受来自 git&nbsp;用户的贡献.</p>
</content></entry></feed>