Newer
Older
64001
64002
64003
64004
64005
64006
64007
64008
64009
64010
64011
64012
64013
64014
64015
64016
64017
64018
64019
64020
64021
64022
64023
64024
64025
64026
64027
64028
64029
64030
64031
64032
64033
64034
64035
64036
64037
64038
64039
64040
64041
64042
64043
64044
64045
64046
64047
64048
64049
64050
64051
64052
64053
64054
64055
64056
64057
64058
64059
64060
64061
64062
64063
64064
64065
64066
64067
64068
64069
64070
64071
64072
64073
64074
64075
64076
64077
64078
64079
64080
64081
64082
64083
64084
64085
64086
64087
64088
64089
64090
64091
64092
64093
64094
64095
64096
64097
64098
64099
64100
64101
64102
64103
64104
64105
64106
64107
64108
64109
64110
64111
64112
64113
64114
64115
64116
64117
64118
64119
64120
64121
64122
64123
64124
64125
64126
64127
64128
64129
64130
64131
64132
64133
64134
64135
64136
64137
64138
64139
64140
64141
64142
64143
64144
64145
64146
64147
64148
64149
64150
64151
64152
64153
64154
64155
64156
64157
64158
64159
64160
64161
64162
64163
64164
64165
64166
64167
64168
64169
64170
64171
64172
64173
64174
64175
64176
64177
64178
64179
64180
64181
64182
64183
64184
64185
64186
64187
64188
64189
64190
64191
64192
64193
64194
64195
64196
64197
64198
64199
64200
64201
64202
64203
64204
64205
64206
64207
64208
64209
64210
64211
64212
64213
64214
64215
64216
64217
msgstr ""
#. type: Title ~
#: en/git-bisect-lk2009.txt:900
#, no-wrap, priority:100
msgid "Bisecting build failures"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:904
#, priority:100
msgid "You can very easily automatically bisect broken builds using something like:"
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:908
#, no-wrap, priority:100
msgid ""
"$ git bisect start BAD GOOD\n"
"$ git bisect run make\n"
msgstr ""
#. type: Title ~
#: en/git-bisect-lk2009.txt:911
#, no-wrap, priority:100
msgid "Passing sh -c \"some commands\" to \"git bisect run\""
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:917
#, no-wrap, priority:100
msgid "$ git bisect run sh -c \"make || exit 125; ./my_app | grep 'good output'\"\n"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:921
#, priority:100
msgid "On the other hand if you do this often, then it can be worth having scripts to avoid too much typing."
msgstr ""
#. type: Title ~
#: en/git-bisect-lk2009.txt:923
#, no-wrap, priority:100
msgid "Finding performance regressions"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:927
#, priority:100
msgid "Here is an example script that comes slightly modified from a real world script used by Junio Hamano <<4>>."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:930
#, priority:100
msgid "This script can be passed to \"git bisect run\" to find the commit that introduced a performance regression:"
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:936
#, no-wrap, priority:100
msgid ""
"# Build errors are not what I am interested in.\n"
"make my_app || exit 255\n"
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:939
#, ignore-ellipsis, no-wrap, priority:100
msgid ""
"# We are checking if it stops in a reasonable amount of time, so\n"
"# let it run in the background...\n"
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:941
#, no-wrap, priority:100
msgid "./my_app >log 2>&1 &\n"
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:944
#, ignore-ellipsis, no-wrap, priority:100
msgid ""
"# ... and grab its process ID.\n"
"pid=$!\n"
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:947
#, ignore-ellipsis, no-wrap, priority:100
msgid ""
"# ... and then wait for sufficiently long.\n"
"sleep $NORMAL_TIME\n"
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:959
#, ignore-ellipsis, no-wrap, priority:100
msgid ""
"# ... and then see if the process is still there.\n"
"if kill -0 $pid\n"
"then\n"
"\t# It is still running -- that is bad.\n"
"\tkill $pid; sleep 1; kill $pid;\n"
"\texit 1\n"
"else\n"
"\t# It has already finished (the $pid process was no more),\n"
"\t# and we are happy.\n"
"\texit 0\n"
"fi\n"
msgstr ""
#. type: Title ~
#: en/git-bisect-lk2009.txt:962
#, no-wrap, priority:100
msgid "Following general best practices"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:967
#, priority:100
msgid "It is obviously a good idea not to have commits with changes that knowingly break things, even if some other commits later fix the breakage."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:970
#, priority:100
msgid "It is also a good idea when using any VCS to have only one small logical change in each commit."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:975
#, priority:100
msgid "The smaller the changes in your commit, the most effective \"git bisect\" will be. And you will probably need \"git bisect\" less in the first place, as small changes are easier to review even if they are only reviewed by the committer."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:978
#, priority:100
msgid "Another good idea is to have good commit messages. They can be very helpful to understand why some changes were made."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:980
#, priority:100
msgid "These general best practices are very helpful if you bisect often."
msgstr ""
#. type: Title ~
#: en/git-bisect-lk2009.txt:982
#, no-wrap, priority:100
msgid "Avoiding bug prone merges"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:988
#, priority:100
msgid "First merges by themselves can introduce some regressions even when the merge needs no source code conflict resolution. This is because a semantic change can happen in one branch while the other branch is not aware of it."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:991
#, priority:100
msgid "For example one branch can change the semantic of a function while the other branch add more calls to the same function."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:998
#, priority:100
msgid "This is made much worse if many files have to be fixed to resolve conflicts. That's why such merges are called \"evil merges\". They can make regressions very difficult to track down. It can even be misleading to know the first bad commit if it happens to be such a merge, because people might think that the bug comes from bad conflict resolution when it comes from a semantic change in one branch."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1004
#, priority:100
msgid "Anyway \"git rebase\" can be used to linearize history. This can be used either to avoid merging in the first place. Or it can be used to bisect on a linear history instead of the non linear one, as this should give more information in case of a semantic change in one branch."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1007
#, priority:100
msgid "Merges can be also made simpler by using smaller branches or by using many topic branches instead of only long version related branches."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1010
#, priority:100
msgid "And testing can be done more often in special integration branches like linux-next for the linux kernel."
msgstr ""
#. type: Title ~
#: en/git-bisect-lk2009.txt:1012
#, no-wrap, priority:100
msgid "Adapting your work-flow"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1015
#, priority:100
msgid "A special work-flow to process regressions can give great results."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1017
#, priority:100
msgid "Here is an example of a work-flow used by Andreas Ericsson:"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1019
#, priority:100
msgid "write, in the test suite, a test script that exposes the regression"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1020
msgid "use \"git bisect run\" to find the commit that introduced it"
msgstr "使用 \"git bisect run\" 查找引入它的提交"
64221
64222
64223
64224
64225
64226
64227
64228
64229
64230
64231
64232
64233
64234
64235
64236
64237
64238
64239
64240
64241
64242
64243
64244
64245
64246
64247
64248
64249
64250
64251
64252
64253
64254
64255
64256
64257
64258
64259
64260
64261
64262
64263
64264
64265
64266
64267
64268
64269
64270
64271
64272
64273
64274
64275
64276
64277
64278
64279
64280
64281
64282
64283
64284
64285
64286
64287
64288
64289
64290
64291
64292
64293
64294
64295
64296
64297
64298
64299
64300
64301
64302
64303
64304
64305
64306
64307
64308
64309
64310
64311
64312
64313
64314
64315
64316
64317
64318
64319
64320
64321
64322
64323
64324
64325
64326
64327
64328
64329
64330
64331
64332
64333
64334
64335
64336
64337
64338
64339
64340
64341
64342
64343
64344
64345
64346
64347
64348
64349
64350
64351
64352
64353
64354
64355
64356
64357
64358
64359
64360
64361
64362
64363
64364
64365
64366
64367
64368
64369
64370
64371
64372
64373
64374
64375
64376
64377
64378
64379
64380
64381
64382
64383
64384
64385
64386
64387
64388
64389
64390
64391
64392
64393
64394
64395
64396
64397
64398
64399
64400
64401
64402
64403
64404
64405
64406
64407
64408
64409
64410
64411
64412
64413
64414
64415
64416
64417
64418
64419
64420
64421
64422
64423
64424
64425
64426
64427
64428
64429
64430
64431
64432
64433
64434
64435
64436
64437
64438
64439
64440
64441
64442
64443
64444
64445
64446
64447
64448
64449
64450
64451
64452
64453
64454
64455
64456
64457
64458
64459
64460
64461
64462
64463
64464
64465
64466
64467
64468
64469
64470
64471
64472
64473
64474
64475
64476
64477
64478
64479
64480
64481
64482
64483
64484
64485
64486
64487
64488
64489
64490
64491
64492
64493
64494
64495
64496
64497
64498
64499
64500
64501
64502
64503
64504
64505
64506
64507
64508
64509
64510
64511
64512
64513
64514
64515
64516
64517
64518
64519
64520
64521
64522
64523
64524
64525
64526
64527
64528
64529
64530
64531
64532
64533
64534
64535
64536
64537
64538
64539
64540
64541
64542
64543
64544
64545
64546
64547
64548
64549
64550
64551
64552
64553
64554
64555
64556
64557
64558
64559
64560
64561
64562
64563
64564
64565
64566
64567
64568
64569
64570
64571
64572
64573
64574
64575
64576
64577
64578
64579
64580
64581
64582
64583
64584
64585
64586
64587
64588
64589
64590
64591
64592
64593
64594
64595
64596
64597
64598
64599
64600
64601
64602
64603
64604
64605
64606
64607
64608
64609
64610
64611
64612
64613
64614
64615
64616
64617
64618
64619
64620
64621
64622
64623
64624
64625
64626
64627
64628
64629
64630
64631
64632
64633
64634
64635
64636
64637
64638
64639
64640
64641
64642
64643
64644
64645
64646
64647
64648
64649
64650
64651
64652
64653
64654
64655
64656
64657
64658
64659
64660
64661
64662
64663
64664
64665
64666
64667
64668
64669
64670
64671
64672
64673
64674
64675
64676
64677
64678
64679
64680
64681
64682
64683
64684
64685
64686
64687
64688
64689
64690
64691
64692
64693
64694
64695
64696
64697
64698
64699
64700
64701
64702
64703
64704
64705
64706
64707
64708
64709
64710
64711
64712
64713
64714
64715
#. type: Plain text
#: en/git-bisect-lk2009.txt:1021
#, priority:100
msgid "fix the bug that is often made obvious by the previous step"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1022
#, priority:100
msgid "commit both the fix and the test script (and if needed more tests)"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1024
#, priority:100
msgid "And here is what Andreas said about this work-flow <<5>>:"
msgstr ""
#. type: delimited block _
#: en/git-bisect-lk2009.txt:1034
#, priority:100
msgid "To give some hard figures, we used to have an average report-to-fix cycle of 142.6 hours (according to our somewhat weird bug-tracker which just measures wall-clock time). Since we moved to Git, we've lowered that to 16.2 hours. Primarily because we can stay on top of the bug fixing now, and because everyone's jockeying to get to fix bugs (we're quite proud of how lazy we are to let Git find the bugs for us). Each new release results in ~40% fewer bugs (almost certainly due to how we now feel about writing tests)."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1039
#, priority:100
msgid "Clearly this work-flow uses the virtuous circle between test suites and \"git bisect\". In fact it makes it the standard procedure to deal with regression."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1044
#, ignore-ellipsis, priority:100
msgid "In other messages Andreas says that they also use the \"best practices\" described above: small logical commits, topic branches, no evil merge,... These practices all improve the bisectability of the commit graph, by making it easier and more useful to bisect."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1047
#, priority:100
msgid "So a good work-flow should be designed around the above points. That is making bisecting easier, more useful and standard."
msgstr ""
#. type: Title ~
#: en/git-bisect-lk2009.txt:1049
#, no-wrap, priority:100
msgid "Involving QA people and if possible end users"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1055
#, priority:100
msgid "One nice about \"git bisect\" is that it is not only a developer tool. It can effectively be used by QA people or even end users (if they have access to the source code or if they can get access to all the builds)."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1059
#, priority:100
msgid "There was a discussion at one point on the linux kernel mailing list of whether it was ok to always ask end user to bisect, and very good points were made to support the point of view that it is ok."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1061
#, priority:100
msgid "For example David Miller wrote <<6>>:"
msgstr ""
#. type: delimited block _
#: en/git-bisect-lk2009.txt:1068
#, priority:100
msgid "What people don't get is that this is a situation where the \"end node principle\" applies. When you have limited resources (here: developers) you don't push the bulk of the burden upon them. Instead you push things out to the resource you have a lot of, the end nodes (here: users), so that the situation actually scales."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1072
#, priority:100
msgid "This means that it is often \"cheaper\" if QA people or end users can do it."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1079
#, priority:100
msgid "What is interesting too is that end users that are reporting bugs (or QA people that reproduced a bug) have access to the environment where the bug happens. So they can often more easily reproduce a regression. And if they can bisect, then more information will be extracted from the environment where the bug happens, which means that it will be easier to understand and then fix the bug."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1083
#, priority:100
msgid "For open source projects it can be a good way to get more useful contributions from end users, and to introduce them to QA and development activities."
msgstr ""
#. type: Title ~
#: en/git-bisect-lk2009.txt:1085
#, no-wrap, priority:100
msgid "Using complex scripts"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1089
#, priority:100
msgid "In some cases like for kernel development it can be worth developing complex scripts to be able to fully automate bisecting."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1091
#, priority:100
msgid "Here is what Ingo Molnar says about that <<7>>:"
msgstr ""
#. type: delimited block _
#: en/git-bisect-lk2009.txt:1101
#, priority:100
msgid "i have a fully automated bootup-hang bisection script. It is based on \"git-bisect run\". I run the script, it builds and boots kernels fully automatically, and when the bootup fails (the script notices that via the serial log, which it continuously watches - or via a timeout, if the system does not come up within 10 minutes it's a \"bad\" kernel), the script raises my attention via a beep and i power cycle the test box. (yeah, i should make use of a managed power outlet to 100% automate it)"
msgstr ""
#. type: Title ~
#: en/git-bisect-lk2009.txt:1104
#, no-wrap, priority:100
msgid "Combining test suites, git bisect and other systems together"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1109
#, priority:100
msgid "We have seen that test suites and git bisect are very powerful when used together. It can be even more powerful if you can combine them with other systems."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1116
#, priority:100
msgid "For example some test suites could be run automatically at night with some unusual (or even random) configurations. And if a regression is found by a test suite, then \"git bisect\" can be automatically launched, and its result can be emailed to the author of the first bad commit found by \"git bisect\", and perhaps other people too. And a new entry in the bug tracking system could be automatically created too."
msgstr ""
#. type: Title -
#: en/git-bisect-lk2009.txt:1119
#, no-wrap, priority:100
msgid "The future of bisecting"
msgstr ""
#. type: Title ~
#: en/git-bisect-lk2009.txt:1122
#, fuzzy, no-wrap, priority:100
#| msgid "git-replace(1)"
msgid "\"git replace\""
msgstr "git-replace(1)"
#. type: Plain text
#: en/git-bisect-lk2009.txt:1128
#, priority:100
msgid "We saw earlier that \"git bisect skip\" is now using a PRNG to try to avoid areas in the commit graph where commits are untestable. The problem is that sometimes the first bad commit will be in an untestable area."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1134
#, priority:100
msgid "To simplify the discussion we will suppose that the untestable area is a simple string of commits and that it was created by a breakage introduced by one commit (let's call it BBC for bisect breaking commit) and later fixed by another one (let's call it BFC for bisect fixing commit)."
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:1139
#, ignore-ellipsis, no-wrap, priority:100
msgid "...-Y-BBC-X1-X2-X3-X4-X5-X6-BFC-Z-...\n"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1143
#, priority:100
msgid "where we know that Y is good and BFC is bad, and where BBC and X1 to X6 are untestable."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1150
#, priority:100
msgid "In this case if you are bisecting manually, what you can do is create a special branch that starts just before the BBC. The first commit in this branch should be the BBC with the BFC squashed into it. And the other commits in the branch should be the commits between BBC and BFC rebased on the first commit of the branch and then the commit after BFC also rebased on."
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:1157
#, ignore-ellipsis, no-wrap, priority:100
msgid ""
" (BBC+BFC)-X1'-X2'-X3'-X4'-X5'-X6'-Z'\n"
" /\n"
"...-Y-BBC-X1-X2-X3-X4-X5-X6-BFC-Z-...\n"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1160
#, priority:100
msgid "where commits quoted with ' have been rebased."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1162
#, priority:100
msgid "You can easily create such a branch with Git using interactive rebase."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1164
#, priority:100
msgid "For example using:"
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:1167
#, no-wrap, priority:100
msgid "$ git rebase -i Y Z\n"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1170
#, priority:100
msgid "and then moving BFC after BBC and squashing it."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1173
#, priority:100
msgid "After that you can start bisecting as usual in the new branch and you should eventually find the first bad commit."
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:1178
#, no-wrap, priority:100
msgid "$ git bisect start Z' Y\n"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1189
#, priority:100
msgid "If you are using \"git bisect run\", you can use the same manual fix up as above, and then start another \"git bisect run\" in the special branch. Or as the \"git bisect\" man page says, the script passed to \"git bisect run\" can apply a patch before it compiles and test the software <<8>>. The patch should turn a current untestable commits into a testable one. So the testing will result in \"good\" or \"bad\" and \"git bisect\" will be able to find the first bad commit. And the script should not forget to remove the patch once the testing is done before exiting from the script."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1194
#, priority:100
msgid "(Note that instead of a patch you can use \"git cherry-pick BFC\" to apply the fix, and in this case you should use \"git reset --hard HEAD^\" to revert the cherry-pick after testing and before returning from the script.)"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1202
#, priority:100
msgid "But the above ways to work around untestable areas are a little bit clunky. Using special branches is nice because these branches can be shared by developers like usual branches, but the risk is that people will get many such branches. And it disrupts the normal \"git bisect\" work-flow. So, if you want to use \"git bisect run\" completely automatically, you have to add special code in your script to restart bisection in the special branches."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1207
#, priority:100
msgid "Anyway one can notice in the above special branch example that the Z' and Z commits should point to the same source code state (the same \"tree\" in git parlance). That's because Z' result from applying the same changes as Z just in a slightly different order."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1211
#, priority:100
msgid "So if we could just \"replace\" Z by Z' when we bisect, then we would not need to add anything to a script. It would just work for anyone in the project sharing the special branches and the replacements."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1213
#, priority:100
msgid "With the example above that would give:"
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:1218
#, ignore-ellipsis, no-wrap, priority:100
msgid ""
" (BBC+BFC)-X1'-X2'-X3'-X4'-X5'-X6'-Z'-...\n"
" /\n"
"...-Y-BBC-X1-X2-X3-X4-X5-X6-BFC-Z\n"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1225
#, priority:100
msgid "That's why the \"git replace\" command was created. Technically it stores replacements \"refs\" in the \"refs/replace/\" hierarchy. These \"refs\" are like branches (that are stored in \"refs/heads/\") or tags (that are stored in \"refs/tags\"), and that means that they can automatically be shared like branches or tags among developers."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1230
#, priority:100
msgid "\"git replace\" is a very powerful mechanism. It can be used to fix commits in already released history, for example to change the commit message or the author. And it can also be used instead of git \"grafts\" to link a repository with another old repository."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1234
#, priority:100
msgid "In fact it's this last feature that \"sold\" it to the Git community, so it is now in the \"master\" branch of Git's Git repository and it should be released in Git 1.6.5 in October or November 2009."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1241
#, priority:100
msgid "One problem with \"git replace\" is that currently it stores all the replacements refs in \"refs/replace/\", but it would be perhaps better if the replacement refs that are useful only for bisecting would be in \"refs/replace/bisect/\". This way the replacement refs could be used only for bisecting, while other refs directly in \"refs/replace/\" would be used nearly all the time."
msgstr ""
#. type: Title ~
#: en/git-bisect-lk2009.txt:1243
#, no-wrap, priority:100
msgid "Bisecting sporadic bugs"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1248
#, priority:100
msgid "Another possible improvement to \"git bisect\" would be to optionally add some redundancy to the tests performed so that it would be more reliable when tracking sporadic bugs."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1252
#, priority:100
msgid "This has been requested by some kernel developers because some bugs called sporadic bugs do not appear in all the kernel builds because they are very dependent on the compiler output."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1261
#, priority:100
msgid "The idea is that every 3 test for example, \"git bisect\" could ask the user to test a commit that has already been found to be \"good\" or \"bad\" (because one of its descendants or one of its ancestors has been found to be \"good\" or \"bad\" respectively). If it happens that a commit has been previously incorrectly classified then the bisection can be aborted early, hopefully before too many mistakes have been made. Then the user will have to look at what happened and then restart the bisection using a fixed bisect log."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1265
#, priority:100
msgid "There is already a project called BBChop created by Ealdwulf Wuffinga on Github that does something like that using Bayesian Search Theory <<9>>:"
msgstr ""
#. type: delimited block _
#: en/git-bisect-lk2009.txt:1272
#, priority:100
msgid "BBChop is like 'git bisect' (or equivalent), but works when your bug is intermittent. That is, it works in the presence of false negatives (when a version happens to work this time even though it contains the bug). It assumes that there are no false positives (in principle, the same approach would work, but adding it may be non-trivial)."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1276
#, priority:100
msgid "But BBChop is independent of any VCS and it would be easier for Git users to have something integrated in Git."
msgstr ""
#. type: Title -
#: en/git-bisect-lk2009.txt:1278
#, no-wrap, priority:100
msgid "Conclusion"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1285
#, priority:100
msgid "We have seen that regressions are an important problem, and that \"git bisect\" has nice features that complement very well practices and other tools, especially test suites, that are generally used to fight regressions. But it might be needed to change some work-flows and (bad) habits to get the most out of it."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1292
#, priority:100
msgid "Some improvements to the algorithms inside \"git bisect\" are possible and some new features could help in some cases, but overall \"git bisect\" works already very well, is used a lot, and is already very useful. To back up that last claim, let's give the final word to Ingo Molnar when he was asked by the author how much time does he think \"git bisect\" saves him when he uses it:"
msgstr ""
#. type: delimited block _
#: en/git-bisect-lk2009.txt:1295
#, priority:100
msgid "a _lot_."
msgstr ""
#. type: delimited block _
#: en/git-bisect-lk2009.txt:1300
#, priority:100
msgid "About ten years ago did i do my first 'bisection' of a Linux patch queue. That was prior the Git (and even prior the BitKeeper) days. I literally days spent sorting out patches, creating what in essence were standalone commits that i guessed to be related to that bug."
msgstr ""
#. type: delimited block _
#: en/git-bisect-lk2009.txt:1303
#, priority:100
msgid "It was a tool of absolute last resort. I'd rather spend days looking at printk output than do a manual 'patch bisection'."
msgstr ""
#. type: delimited block _
#: en/git-bisect-lk2009.txt:1308
#, priority:100
msgid "With Git bisect it's a breeze: in the best case i can get a ~15 step kernel bisection done in 20-30 minutes, in an automated way. Even with manual help or when bisecting multiple, overlapping bugs, it's rarely more than an hour."
msgstr ""
#. type: delimited block _
#: en/git-bisect-lk2009.txt:1314
#, priority:100
msgid "In fact it's invaluable because there are bugs i would never even _try_ to debug if it wasn't for git bisect. In the past there were bug patterns that were immediately hopeless for me to debug - at best i could send the crash/bug signature to lkml and hope that someone else can think of something."
msgstr ""
#. type: delimited block _
#: en/git-bisect-lk2009.txt:1318
#, priority:100
msgid "And even if a bisection fails today it tells us something valuable about the bug: that it's non-deterministic - timing or kernel image layout dependent."
msgstr ""
#. type: delimited block _
#: en/git-bisect-lk2009.txt:1321
#, priority:100
msgid "So git bisect is unconditional goodness - and feel free to quote that ;-)"
msgstr ""
#. type: Title -
#: en/git-bisect-lk2009.txt:1324
#, no-wrap, priority:100
msgid "Acknowledgments"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1330
#, priority:100
msgid "Many thanks to Junio Hamano for his help in reviewing this paper, for reviewing the patches I sent to the Git mailing list, for discussing some ideas and helping me improve them, for improving \"git bisect\" a lot and for his awesome work in maintaining and developing Git."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1335
#, priority:100
msgid "Many thanks to Ingo Molnar for giving me very useful information that appears in this paper, for commenting on this paper, for his suggestions to improve \"git bisect\" and for evangelizing \"git bisect\" on the linux kernel mailing lists."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1338
#, priority:100
msgid "Many thanks to Linus Torvalds for inventing, developing and evangelizing \"git bisect\", Git and Linux."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1343
#, priority:100
msgid "Many thanks to the many other great people who helped one way or another when I worked on Git, especially to Andreas Ericsson, Johannes Schindelin, H. Peter Anvin, Daniel Barkalow, Bill Lear, John Hawley, Shawn O. Pierce, Jeff King, Sam Vilain, Jon Seymour."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1346
#, priority:100
msgid "Many thanks to the Linux-Kongress program committee for choosing the author to given a talk and for publishing this paper."
msgstr ""
#. type: Title -
#: en/git-bisect-lk2009.txt:1348
#, fuzzy, no-wrap, priority:100
#| msgid "--dereference"
msgid "References"
msgstr "--dereference"
#. type: Plain text
#: en/git-bisect-lk2009.txt:1351
#, priority:100
msgid "[[[1]]] https://www.nist.gov/sites/default/files/documents/director/planning/report02-3.pdf['The Economic Impacts of Inadequate Infratructure for Software Testing'. Nist Planning Report 02-3], see Executive Summary and Chapter 8."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1352
#, priority:100
msgid "[[[2]]] http://www.oracle.com/technetwork/java/codeconvtoc-136057.html['Code Conventions for the Java Programming Language'. Sun Microsystems.]"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1353
#, priority:100
msgid "[[[3]]] https://en.wikipedia.org/wiki/Software_maintenance['Software maintenance'. Wikipedia.]"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1354
#, priority:100
msgid "[[[4]]] https://lore.kernel.org/git/7vps5xsbwp.fsf_-_@assigned-by-dhcp.cox.net/[Junio C Hamano. 'Automated bisect success story'.]"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1355
#, priority:100
msgid "[[[5]]] https://lwn.net/Articles/317154/[Christian Couder. 'Fully automated bisecting with \"git bisect run\"'. LWN.net.]"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1356
#, priority:100
msgid "[[[6]]] https://lwn.net/Articles/277872/[Jonathan Corbet. 'Bisection divides users and developers'. LWN.net.]"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1357
#, priority:100
msgid "[[[7]]] https://lore.kernel.org/lkml/20071207113734.GA14598@elte.hu/[Ingo Molnar. 'Re: BUG 2.6.23-rc3 can't see sd partitions on Alpha'. Linux-kernel mailing list.]"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1358
#, priority:100
msgid "[[[8]]] https://www.kernel.org/pub/software/scm/git/docs/git-bisect.html[Junio C Hamano and the git-list. 'git-bisect(1) Manual Page'. Linux Kernel Archives.]"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:1358
#, priority:100
msgid "[[[9]]] https://github.com/Ealdwulf/bbchop[Ealdwulf. 'bbchop'. GitHub.]"
msgstr ""
#, fuzzy
#~ msgid "see linkgit:git-commit-tree[1]"
#~ msgstr "linkgit:git-commit-tree[1]"