Skip to content
Snippets Groups Projects
documentation.zh_HANS-CN.po 2.2 MiB
Newer Older
  • Learn to ignore specific revisions
  • 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
    
    #, priority:100
    
    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]"