Newer
Older
#: en/git-bisect-lk2009.txt:813
#, priority:100
msgid "In fact development teams often maintain both a development branch and a maintenance branch, and it would be quite easy for them if \"git bisect\" just worked when they want to bisect a regression on the development branch that is not on the maintenance branch. They should be able to start bisecting using:"
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:816
msgid "$ git bisect start dev main\n"
msgstr "$ git bisect start dev main\n"
66011
66012
66013
66014
66015
66016
66017
66018
66019
66020
66021
66022
66023
66024
66025
66026
66027
66028
66029
66030
66031
66032
66033
66034
66035
66036
66037
66038
66039
66040
66041
66042
66043
66044
66045
66046
66047
66048
66049
66050
66051
66052
66053
66054
66055
66056
66057
66058
66059
66060
66061
66062
66063
66064
66065
66066
66067
66068
66069
66070
66071
66072
66073
66074
66075
66076
66077
66078
66079
66080
66081
66082
66083
66084
66085
66086
66087
66088
66089
66090
66091
66092
66093
66094
66095
66096
66097
66098
66099
66100
66101
66102
66103
66104
66105
66106
66107
66108
66109
66110
66111
66112
66113
66114
66115
66116
66117
66118
66119
66120
66121
66122
66123
66124
66125
66126
66127
66128
66129
66130
66131
66132
66133
66134
66135
66136
66137
66138
66139
66140
66141
66142
66143
66144
66145
66146
66147
66148
66149
66150
66151
66152
66153
66154
66155
66156
66157
66158
66159
66160
66161
66162
66163
66164
66165
66166
66167
66168
66169
66170
66171
66172
66173
66174
66175
66176
66177
66178
66179
66180
66181
66182
66183
66184
66185
66186
66187
66188
66189
66190
66191
66192
66193
66194
66195
66196
66197
66198
66199
66200
66201
66202
66203
66204
66205
66206
66207
66208
66209
66210
66211
66212
66213
66214
66215
66216
66217
66218
66219
66220
66221
66222
66223
66224
66225
66226
66227
66228
66229
66230
66231
66232
66233
66234
66235
66236
66237
66238
66239
66240
66241
66242
66243
66244
66245
66246
66247
66248
66249
66250
66251
66252
66253
66254
66255
66256
66257
66258
66259
66260
66261
66262
66263
66264
66265
66266
66267
66268
66269
66270
66271
66272
66273
66274
66275
66276
66277
66278
66279
66280
66281
66282
66283
66284
66285
66286
66287
66288
66289
66290
66291
66292
66293
66294
66295
66296
66297
66298
66299
66300
66301
66302
66303
66304
66305
66306
66307
66308
66309
66310
66311
66312
66313
66314
66315
66316
66317
66318
66319
66320
66321
66322
66323
66324
66325
66326
66327
66328
66329
66330
66331
66332
66333
66334
66335
66336
66337
66338
66339
66340
66341
66342
66343
66344
66345
66346
66347
66348
66349
66350
66351
#. type: Plain text
#: en/git-bisect-lk2009.txt:823
#, priority:100
msgid "To enable that additional nice feature, when a bisection is started and when some good commits are not ancestors of the bad commit, we first compute the merge bases between the bad and the good commits and we chose these merge bases as the first commits that will be checked out and tested."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:826
#, priority:100
msgid "If it happens that one merge base is bad, then the bisection process is stopped with a message like:"
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:830
#, ignore-ellipsis, no-wrap, priority:100
msgid ""
"The merge base BBBBBB is bad.\n"
"This means the bug has been fixed between BBBBBB and [GGGGGG,...].\n"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:834
#, ignore-ellipsis, priority:100
msgid "where BBBBBB is the sha1 hash of the bad merge base and [GGGGGG,...] is a comma separated list of the sha1 of the good commits."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:838
#, priority:100
msgid "If some of the merge bases are skipped, then the bisection process continues, but the following message is printed for each skipped merge base:"
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:843
#, ignore-ellipsis, no-wrap, priority:100
msgid ""
"Warning: the merge base between BBBBBB and [GGGGGG,...] must be skipped.\n"
"So we cannot be sure the first bad commit is between MMMMMM and BBBBBB.\n"
"We continue anyway.\n"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:848
#, ignore-ellipsis, priority:100
msgid "where BBBBBB is the sha1 hash of the bad commit, MMMMMM is the sha1 hash of the merge base that is skipped and [GGGGGG,...] is a comma separated list of the sha1 of the good commits."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:851
#, priority:100
msgid "So if there is no bad merge base, the bisection process continues as usual after this step."
msgstr ""
#. type: Title -
#: en/git-bisect-lk2009.txt:853
#, no-wrap, priority:100
msgid "Best bisecting practices"
msgstr ""
#. type: Title ~
#: en/git-bisect-lk2009.txt:856
#, no-wrap, priority:100
msgid "Using test suites and git bisect together"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:863
#, priority:100
msgid "If you both have a test suite and use git bisect, then it becomes less important to check that all tests pass after each commit. Though of course it is probably a good idea to have some checks to avoid breaking too many things because it could make bisecting other bugs more difficult."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:868
#, priority:100
msgid "You can focus your efforts to check at a few points (for example rc and beta releases) that all the T test cases pass for all the N configurations. And when some tests don't pass you can use \"git bisect\" (or better \"git bisect run\"). So you should perform roughly:"
msgstr ""
#. type: delimited block -
#: en/git-bisect-lk2009.txt:871
#, no-wrap, priority:100
msgid "c * N * T + b * M * log2(M) tests\n"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:875
#, priority:100
msgid "where c is the number of rounds of test (so a small constant) and b is the ratio of bug per commit (hopefully a small constant too)."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:878
#, priority:100
msgid "So of course it's much better as it's O(N * T) vs O(N * T * M) if you would test everything after each commit."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:883
#, priority:100
msgid "This means that test suites are good to prevent some bugs from being committed and they are also quite good to tell you that you have some bugs. But they are not so good to tell you where some bugs have been introduced. To tell you that efficiently, git bisect is needed."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:890
#, priority:100
msgid "The other nice thing with test suites, is that when you have one, you already know how to test for bad behavior. So you can use this knowledge to create a new test case for \"git bisect\" when it appears that there is a regression. So it will be easier to bisect the bug and fix it. And then you can add the test case you just created to your test suite."
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:893
#, priority:100
msgid "So if you know how to create test cases and how to bisect, you will be subject to a virtuous circle:"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:895
#, priority:100
msgid "more tests => easier to create tests => easier to bisect => more tests"
msgstr ""
#. type: Plain text
#: en/git-bisect-lk2009.txt:898
#, priority:100
msgid "So test suites and \"git bisect\" are complementary tools that are very powerful and efficient when used together."
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 ""
"utiliser\"git bisect run\" pour rechercher la modification qui l'a introduite"
66356
66357
66358
66359
66360
66361
66362
66363
66364
66365
66366
66367
66368
66369
66370
66371
66372
66373
66374
66375
66376
66377
66378
66379
66380
66381
66382
66383
66384
66385
66386
66387
66388
66389
66390
66391
66392
66393
66394
66395
66396
66397
66398
66399
66400
66401
66402
66403
66404
66405
66406
66407
66408
66409
66410
66411
66412
66413
66414
66415
66416
66417
66418
66419
66420
66421
66422
66423
66424
66425
66426
66427
66428
66429
66430
66431
66432
66433
66434
66435
66436
66437
66438
66439
66440
66441
66442
66443
66444
66445
66446
66447
66448
66449
66450
66451
66452
66453
66454
66455
66456
66457
66458
66459
66460
66461
66462
66463
66464
66465
66466
66467
66468
66469
66470
66471
66472
66473
66474
66475
66476
66477
66478
66479
66480
66481
66482
66483
66484
66485
66486
66487
66488
66489
66490
66491
66492
66493
66494
66495
66496
#. 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
66500
66501
66502
66503
66504
66505
66506
66507
66508
66509
66510
66511
66512
66513
66514
66515
66516
66517
66518
66519
66520
66521
66522
66523
66524
66525
66526
66527
66528
66529
66530
66531
66532
66533
66534
66535
66536
66537
66538
66539
66540
66541
66542
66543
66544
66545
66546
66547
66548
66549
66550
66551
66552
66553
#. 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
msgstr "Par exemple en utilisant :"
#. type: delimited block -
#: en/git-bisect-lk2009.txt:1167
#. 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
msgid "$ git bisect start Z' Y\n"
msgstr "$ git bisect start Z' Y\n"
66581
66582
66583
66584
66585
66586
66587
66588
66589
66590
66591
66592
66593
66594
66595
66596
66597
66598
66599
66600
66601
66602
66603
66604
66605
66606
66607
66608
66609
66610
66611
66612
66613
66614
66615
66616
66617
66618
66619
66620
66621
66622
66623
66624
66625
66626
66627
66628
66629
66630
66631
66632
66633
66634
66635
66636
66637
66638
66639
66640
66641
66642
66643
66644
66645
66646
66647
66648
66649
66650
66651
66652
#. 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
msgid "Bisecting sporadic bugs"
msgstr "Bisection de bugs sporatiques"
66656
66657
66658
66659
66660
66661
66662
66663
66664
66665
66666
66667
66668
66669
66670
66671
66672
66673
66674
66675
66676
66677
66678
66679
66680
66681
66682
66683
66684
66685
66686
66687
66688
66689
66690
66691
66692
66693
66694
66695
66696
66697
66698
66699
66700
66701
66702
66703
66704
66705
66706
66707
66708
66709
66710
66711
66712
66713
66714
66715
66716
66717
66718
66719
66720
66721
66722
66723
66724
66725
66726
66727
66728
66729
66730
66731
66732
66733
66734
66735
66736
66737
66738
66739
66740
66741
66742
66743
66744
66745
66746
66747
66748
66749
66750
66751
66752
66753
66754
66755
66756
66757
66758
66759
66760
66761
66762
66763
66764
66765
66766
66767
66768
66769
66770
66771
66772
66773
66774
66775
66776
66777
66778
66779
66780
66781
66782
66783
66784
66785
66786
66787
66788
66789
66790
#. 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
66794
66795
66796
66797
66798
66799
66800
66801
66802
66803
66804
66805
66806
66807
66808
66809
66810
66811
66812
66813
66814
66815
66816
66817
66818
66819
66820
66821
66822
66823
66824
66825
66826
66827
66828
66829
66830
66831
66832
66833
66834
66835
66836
66837
66838
66839
66840
66841
66842
66843
66844
66845
66846
66847
66848
#. 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 ""
#, ignore-ellipsis
#~ msgid "<file>..."
#~ msgstr "<fichier>..."
#~ msgid "The <file> list given to the command can be exact pathnames, file glob patterns, or leading directory names. The command removes only the paths that are known to Git. Giving the name of a file that you have not told Git about does not remove that file."
#~ msgstr "La liste de <fichier> fournie à la commande doit être faite de chemins exacts, de motifs de fichiers, ou de répertoires en entêtes. La commande supprime seulement les fichiers connus de Git. Fournir le nom d'un fichier qui n'est pas pas reconnu par Git ne supprime pas ce fichier."
#~ msgid "see linkgit:git-commit-tree[1]"
#~ msgstr "voir linkgit:git-commit-tree[1]"
#~ msgid "'git checkout' [<tree-ish>] [--] <pathspec>..."
#~ msgstr "'git checkout' [<arbre-esque>] [--] <spéc. de chemin>..."
#~ msgid "Overwrite paths in the working tree by replacing with the contents in the index or in the `<tree-ish>` (most often a commit). When a `<tree-ish>` is given, the paths that match the `<pathspec>` are updated both in the index and in the working tree."
#~ msgstr "Écrase les chemins dans l'arbre de travail en les remplaçant par le contenu dans l'index ou dans l'<arbre-esque> (le plus souvent un commit). Quand un <arbre-esque> est fourni, les chemins qui correspondent à <spéc. de chemin> sont mis à jour à la fois dans l'index et dans l'arbre de travail."
#~ msgid "--notes[=<treeish>]"
#~ msgstr "--notes[=<arbre-esque>]"
#~ msgid "single path, only for \"dst\""
#~ msgstr "un seul chemin, seulement pour \"dst\""
#~ msgid "::100644 100644 100644 fabadb8 cc95eb0 4866510 MM\tdescribe.c\n"
#~ msgstr "::100644 100644 100644 fabadb8 cc95eb0 4866510 MM\tdescription.c\n"
#~ msgid "The optional configuration variable `core.excludesFile` indicates a path to a file containing patterns of file names to exclude from git-add, similar to $GIT_DIR/info/exclude. Patterns in the exclude file are used in addition to those in info/exclude. See linkgit:gitignore[5]."
#~ msgstr "Le paramètre de configuration optionnel `core.excludesFile` indique un chemin vers un fichier contenant les patrons des noms de fichier à exclure de git-add, similaire à $GIT_DIR/info/exclude. Les patrons dans le fichier d'exclusion sont additionnés à ceux de info/exclude. Référez-vous à linkgit:gitignore[5]."
#~ msgid "git-remote-testgit(1)"
#~ msgstr "git-remote-testgit(1)"
#~ msgid "If you want to undo a commit other than the latest on a branch, linkgit:git-revert[1] is your friend."
#~ msgstr "Si vous souhaitez défaire un commit autre que le dernier sur la branche, linkgit:git-revert[1] est votre ami."
#~ msgid "'git update-server-info' [--force]\n"
#~ msgstr "git update-server-info [--force]"
#~ msgid "Update the info files from scratch."
#~ msgstr "Mettre à jour les fichiers d'information à partir de rien."