1.\" Copyright (c) 2010-2013 Hudson River Trading LLC 2.\" Written by: John H. Baldwin <jhb@FreeBSD.org> 3.\" All rights reserved. 4.\" 5.\" Redistribution and use in source and binary forms, with or without 6.\" modification, are permitted provided that the following conditions 7.\" are met: 8.\" 1. Redistributions of source code must retain the above copyright 9.\" notice, this list of conditions and the following disclaimer. 10.\" 2. Redistributions in binary form must reproduce the above copyright 11.\" notice, this list of conditions and the following disclaimer in the 12.\" documentation and/or other materials provided with the distribution. 13.\" 14.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24.\" SUCH DAMAGE. 25.\" 26.Dd August 9, 2022 27.Dt ETCUPDATE 8 28.Os 29.Sh NAME 30.Nm etcupdate 31.Nd "manage updates to system files not updated by installworld" 32.Sh SYNOPSIS 33.Nm 34.Op Fl npBFN 35.Op Fl d Ar workdir 36.Op Fl r | Fl s Ar source | Fl t Ar tarball 37.Op Fl A Ar patterns 38.Op Fl D Ar destdir 39.Op Fl I Ar patterns 40.Op Fl L Ar logfile 41.Op Fl M Ar options 42.Op Fl m Ar make 43.Nm 44.Cm build 45.Op Fl BN 46.Op Fl d Ar workdir 47.Op Fl s Ar source 48.Op Fl L Ar logfile 49.Op Fl M Ar options 50.Op Fl m Ar make 51.Ar tarball 52.Nm 53.Cm diff 54.Op Fl d Ar workdir 55.Op Fl D Ar destdir 56.Op Fl I Ar patterns 57.Op Fl L Ar logfile 58.Nm 59.Cm extract 60.Op Fl BN 61.Op Fl d Ar workdir 62.Op Fl s Ar source | Fl t Ar tarball 63.Op Fl D Ar destdir 64.Op Fl L Ar logfile 65.Op Fl M Ar options 66.Op Fl m Ar make 67.Nm 68.Cm resolve 69.Op Fl p 70.Op Fl d Ar workdir 71.Op Fl D Ar destdir 72.Op Fl L Ar logfile 73.Nm 74.Cm revert 75.Op Fl d Ar workdir 76.Op Fl D Ar destdir 77.Op Fl L Ar logfile 78.Ar 79.Nm 80.Cm status 81.Op Fl d Ar workdir 82.Op Fl D Ar destdir 83.Sh DESCRIPTION 84The 85.Nm 86utility is a tool for managing updates to files that are not updated as 87part of 88.Sq make installworld 89such as files in 90.Pa /etc . 91It manages updates by doing a three-way merge of changes made to these 92files against the local versions. 93It is also designed to minimize the amount of user intervention with 94the goal of simplifying upgrades for clusters of machines. 95.Pp 96To perform a three-way merge, 97.Nm 98keeps copies of the current and previous versions of files that it manages. 99These copies are stored in two trees known as the 100.Dq current 101and 102.Dq previous 103trees. 104During a merge, 105.Nm 106compares the 107.Dq current 108and 109.Dq previous 110copies of each file to determine which changes need to be merged into the 111local version of each file. 112If a file can be updated without generating a conflict, 113.Nm 114will update the file automatically. 115If the local changes to a file conflict with the changes made to a file in 116the source tree, 117then a merge conflict is generated. 118The conflict must be resolved after the merge has finished. 119The 120.Nm 121utility will not perform a new merge until all conflicts from an earlier 122merge are resolved. 123.Sh MODES 124The 125.Nm 126utility supports several modes of operation. 127The mode is specified via an optional command argument. 128If present, the command must be the first argument on the command line. 129If a command is not specified, the default mode is used. 130.Ss Default Mode 131The default mode merges changes from the source tree to the destination 132directory. 133First, 134it updates the 135.Dq current 136and 137.Dq previous 138trees. 139Next, 140it compares the two trees merging changes into the destination directory. 141Finally, 142it displays warnings for any conditions it could not handle automatically. 143.Pp 144If the 145.Fl r 146option is not specified, 147then the first step taken is to update the 148.Dq current 149and 150.Dq previous 151trees. 152If a 153.Dq current 154tree already exists, 155then that tree is saved as the 156.Dq previous 157tree. 158An older 159.Dq previous 160tree is removed if it exists. 161By default the new 162.Dq current 163tree is built from a source tree. 164However, 165if a tarball is specified via the 166.Fl t 167option, 168then the tree is extracted from that tarball instead. 169.Pp 170Next, 171.Nm 172compares the files in the 173.Dq current 174and 175.Dq previous 176trees. 177If a file was removed from the 178.Dq current 179tree, 180then it will be removed from the destination directory only if it 181does not have any local modifications. 182If a file was added to the 183.Dq current 184tree, 185then it will be copied to the destination directory only if it 186would not clobber an existing file. 187If a file is changed in the 188.Dq current 189tree, 190then 191.Nm 192will attempt to merge the changes into the version of the file in the 193destination directory. 194If the merge encounters conflicts, 195then a version of the file with conflict markers will be saved for 196future resolution. 197If the merge does not encounter conflicts, 198then the merged version of the file will be saved in the destination 199directory. 200If 201.Nm 202is not able to safely merge in changes to a file other than a merge conflict, 203it will generate a warning. 204.Pp 205For each file that is updated a line will be output with a leading character 206to indicate the action taken. 207The possible actions follow: 208.Pp 209.Bl -tag -width "A" -compact -offset indent 210.It A 211Added 212.It C 213Conflict 214.It D 215Deleted 216.It M 217Merged 218.It U 219Updated 220.El 221.Pp 222Finally, 223if any warnings were encountered they are displayed after the merge has 224completed. 225.Pp 226Note that for certain files 227.Nm 228will perform post-install actions any time that the file is updated. 229Specifically, 230.Xr pwd_mkdb 8 231is invoked if 232.Pa /etc/master.passwd 233is changed, 234.Xr cap_mkdb 1 235is invoked to update 236.Pa /etc/login.conf.db 237if 238.Pa /etc/login.conf 239is changed, 240.Xr newaliases 1 241is invoked if 242.Pa /etc/mail/aliases 243is changed, 244.Xr services_mkdb 8 245is invoked if 246.Pa /etc/services 247is changed, 248.Xr tzsetup 8 249is invoked if 250.Pa /etc/localtime 251is changed and if 252.Fa /var/db/zoneinfo 253exists, 254and 255.Pa /etc/rc.d/motd 256is invoked if 257.Pa /etc/motd 258is changed. 259One exception is that if 260.Pa /etc/mail/aliases 261is changed and the destination directory is not the default, 262then a warning will be issued instead. 263This is due to a limitation of the 264.Xr newaliases 1 265command. 266Similarly, 267if 268.Pa /etc/motd 269is changed and the destination directory is not the default, 270then 271.Pa /etc/rc.d/motd 272will not be executed due to a limitation of that script. 273In this case no warning is issued as the result of 274.Pa /etc/rc.d/motd 275is merely cosmetic and will be corrected on the next reboot. 276.Ss Build Mode 277The 278.Cm build 279mode is used to build a tarball that contains a snapshot of a 280.Dq current 281tree. 282This tarball can be used by the default and extract modes. 283Using a tarball can allow 284.Nm 285to perform a merge without requiring a source tree that matches the 286currently installed world. 287The 288.Fa tarball 289argument specifies the name of the file to create. 290The file will be a 291.Xr tar 5 292file compressed with 293.Xr bzip2 1 . 294.Ss Diff Mode 295The 296.Cm diff 297mode compares the versions of files in the destination directory to the 298.Dq current 299tree and generates a unified format diff of the changes. 300This can be used to determine which files have been locally modified and how. 301Note that 302.Nm 303does not manage files that are not maintained in the source tree such as 304.Pa /etc/fstab 305and 306.Pa /etc/rc.conf . 307.Ss Extract Mode 308The 309.Cm extract 310mode generates a new 311.Dq current 312tree. 313Unlike the default mode, 314it does not save any existing 315.Dq current 316tree and does not modify any existing 317.Dq previous 318tree. 319The new 320.Dq current 321tree can either be built from a source tree or extracted from a tarball. 322.Ss Resolve Mode 323The 324.Cm resolve 325mode is used to resolve any conflicts encountered during a merge. 326In this mode, 327.Nm 328iterates over any existing conflicts prompting the user for actions to take 329on each conflicted file. 330For each file, the following actions are available: 331.Pp 332.Bl -tag -width "(tf) theirs-full" -compact 333.It (p) postpone 334Ignore this conflict for now. 335.It (df) diff-full 336Show all changes made to the merged file as a unified diff. 337.It (e) edit 338Change the merged file in an editor. 339.It (r) resolved 340Install the merged version of the file into the destination directory. 341.It (mf) mine-full 342Use the version of the file in the destination directory and ignore any 343changes made to the file in the 344.Dq current 345tree. 346.It (tf) theirs-full 347Use the version of the file from the 348.Dq current 349tree and discard any local changes made to the file. 350.It (h) help 351Display the list of commands. 352.El 353.Ss Revert Mode 354The 355.Cm revert 356mode is used to restore the stock versions of files. 357In this mode, 358.Nm 359installs the stock version of requested files. 360This mode cannot be used to restore directories, only individual files. 361.Ss Status Mode 362The 363.Cm status 364mode shows a summary of the results of the most recent merge. 365First it lists any files for which there are unresolved conflicts. 366Next it lists any warnings generated during the last merge. 367If the last merge did not generate any conflicts or warnings, 368then nothing will be output. 369.Sh OPTIONS 370The following options are available. 371Note that most options do not apply to all modes. 372.Bl -tag -width ".Fl A Ar patterns" 373.It Fl A Ar patterns 374Always install the new version of any files that match any of the patterns 375listed in 376.Ar patterns . 377Each pattern is evaluated as an 378.Xr sh 1 379shell pattern. 380This option may be specified multiple times to specify multiple patterns. 381Multiple space-separated patterns may also be specified in a single 382option. 383Note that ignored files specified via the 384.Ev IGNORE_FILES 385variable or the 386.Fl I 387option will not be installed. 388.It Fl B 389Do not build generated files in a private object tree. 390Instead, 391reuse the generated files from a previously built object tree that matches 392the source tree. 393This can be useful to avoid gratuitous conflicts in 394.Xr sendmail 8 395configuration 396files when bootstrapping. 397It can also be useful for building a tarball that matches a specific 398world build. 399.It Fl D Ar destdir 400Specify an alternate destination directory as the target of a merge. 401This is analogous to the 402.Dv DESTDIR 403variable used with 404.Sq make installworld . 405The default destination directory is an empty string which results in 406merges updating 407.Pa /etc 408on the local machine. 409.It Fl d Ar workdir 410Specify an alternate directory to use as the work directory. 411The work directory is used to store the 412.Dq current 413and 414.Dq previous 415trees as well as unresolved conflicts. 416The default work directory is 417.Pa <destdir>/var/db/etcupdate . 418.It Fl F 419Ignore changes in the FreeBSD ID string when comparing files in the 420destination directory to files in either of the 421.Dq current 422or 423.Dq previous 424trees. 425In 426.Cm diff 427mode, 428this reduces noise due to FreeBSD ID string changes in the output. 429During an update this can simplify handling for harmless conflicts caused 430by FreeBSD ID string changes. 431.Pp 432Specifically, 433if a file in the destination directory is identical to the same file in the 434.Dq previous 435tree modulo the FreeBSD ID string, 436then the file is treated as if it was unmodified and the 437.Dq current 438version of the file will be installed. 439Similarly, 440if a file in the destination directory is identical to the same file in the 441.Dq current 442tree modulo the FreeBSD ID string, 443then the 444.Dq current 445version of the file will be installed to update the ID string. 446If the 447.Dq previous 448and 449.Dq current 450versions of the file are identical, 451then 452.Nm 453will not change the file in the destination directory. 454.Pp 455Due to limitations in the 456.Xr diff 1 457command, 458this option may not have an effect if there are other changes in a file that 459are close to the FreeBSD ID string. 460.It Fl I Ar patterns 461Ignore any files that match any of the patterns listed in 462.Ar patterns . 463No warnings or other messages will be generated for those files during a 464merge. 465Each pattern is evaluated as an 466.Xr sh 1 467shell pattern. 468This option may be specified multiple times to specify multiple patterns. 469Multiple space-separated patterns may also be specified in a single 470option. 471.It Fl L Ar logfile 472Specify an alternate path for the log file. 473The 474.Nm 475utility logs each command that it invokes along with the standard output 476and standard error to this file. 477By default the log file is stored in a file named 478.Pa log 479in the work directory. 480.It Fl M Ar options 481Pass 482.Ar options 483as additional parameters to 484.Xr make 1 485when building a 486.Dq current 487tree. 488This can be used for to set the 489.Dv TARGET 490or 491.Dv TARGET_ARCH 492variables for a cross-build. 493.It Fl m Ar make 494Use 495.Ar make 496as the 497.Xr make 1 498binary when building a 499.Dq current 500tree. 501.It Fl n 502Enable 503.Dq dry-run 504mode. 505Do not merge any changes to the destination directory. 506Instead, 507report what actions would be taken during a merge. 508Note that the existing 509.Dq current 510and 511.Dq previous 512trees will not be changed. 513If the 514.Fl r 515option is not specified, 516then a temporary 517.Dq current 518tree will be extracted to perform the comparison. 519.It Fl N 520Perform a 521.Dv NO_ROOT 522build when building a 523.Dq current 524tree. 525The resulting tree will include a corresponding 526.Pa METALOG 527file at its root. 528.It Fl p 529Enable 530.Dq pre-world 531mode. 532Only merge changes to files that are necessary to successfully run 533.Sq make installworld 534or 535.Sq make installkernel . 536When this flag is enabled, 537the existing 538.Dq current 539and 540.Dq previous 541trees are left alone. 542Instead, 543a temporary tree is populated with the necessary files. 544This temporary tree is compared against the 545.Dq current 546tree. 547This allows a normal update to be run after 548.Sq make installworld 549has completed. 550Any conflicts generated during a 551.Dq pre-world 552update should be resolved by a 553.Dq pre-world 554.Cm resolve . 555.It Fl r 556Do not update the 557.Dq current 558and 559.Dq previous 560trees during a merge. 561This can be used to 562.Dq re-run 563a previous merge operation. 564.It Fl s Ar source 565Specify an alternate source tree to use when building or extracting a 566.Dq current 567tree. 568The default source tree is 569.Pa /usr/src . 570.It Fl t Ar tarball 571Extract a new 572.Dq current 573tree from a tarball previously generated by the 574.Cm build 575command rather than building the tree from a source tree. 576.El 577.Sh CONFIG FILE 578The 579.Nm 580utility can also be configured by setting variables in an optional 581configuration file named 582.Pa /etc/etcupdate.conf . 583Note that command line options override settings in the configuration file. 584The configuration file is executed by 585.Xr sh 1 , 586so it uses that syntax to set configuration variables. 587The following variables can be set: 588.Bl -tag -width ".Ev ALWAYS_INSTALL" 589.It Ev ALWAYS_INSTALL 590Always install files that match any of the patterns listed in this variable 591similar to the 592.Fl A 593option. 594.It Ev DESTDIR 595Specify an alternate destination directory similar to the 596.Fl D 597option. 598.It Ev EDITOR 599Specify a program to edit merge conflicts. 600.It Ev FREEBSD_ID 601Ignore changes in the FreeBSD ID string similar to the 602.Fl F 603option. 604This is enabled by setting the variable to a non-empty value. 605.It Ev IGNORE_FILES 606Ignore files that match any of the patterns listed in this variable 607similar to the 608.Fl I 609option. 610.It Ev LOGFILE 611Specify an alternate path for the log file similar to the 612.Fl L 613option. 614.It Ev MAKE_CMD 615Specify the 616.Xr make 1 617binary when building a 618.Dq current 619tree similar to the 620.Fl m 621option. 622.It Ev MAKE_OPTIONS 623Pass additional options to 624.Xr make 1 625when building a 626.Dq current 627tree similar to the 628.Fl M 629option. 630.It Ev SRCDIR 631Specify an alternate source tree similar to the 632.Fl s 633option. 634.It Ev WORKDIR 635Specify an alternate work directory similar to the 636.Fl d 637option. 638.El 639.Sh ENVIRONMENT 640The 641.Nm 642utility uses the program identified in the 643.Ev EDITOR 644environment variable to edit merge conflicts. 645If 646.Ev EDITOR 647is not set, 648.Xr vi 1 649is used as the default editor. 650.Sh FILES 651.Bl -tag -width ".Pa /var/db/etcupdate/log" -compact 652.It Pa /etc/etcupdate.conf 653Optional config file. 654.It Pa /var/db/etcupdate 655Default work directory used to store trees and other data. 656.It Pa /var/db/etcupdate/log 657Default log file. 658.El 659.Sh EXIT STATUS 660.Ex -std 661.Sh EXAMPLES 662To compare the files in 663.Pa /etc 664with the stock versions: 665.Pp 666.Dl "etcupdate diff" 667.Pp 668To merge changes after an upgrade via the buildworld and installworld process: 669.Pp 670.Dl "etcupdate" 671.Pp 672To resolve any conflicts generated during a merge: 673.Pp 674.Dl "etcupdate resolve" 675.Ss Bootstrapping 676The 677.Nm 678utility may need to be bootstrapped before it can be used. 679The 680.Cm diff 681command will fail with an error about a missing reference tree if 682bootstrapping is needed. 683.Pp 684Bootstrapping 685.Nm 686requires a source tree that matches the currently installed world. 687The easiest way to ensure this is to bootstrap 688.Nm 689before updating the source tree to start the next world upgrade cycle. 690First, 691generate a reference tree: 692.Pp 693.Dl "etcupdate extract" 694.Pp 695Second, 696use the 697.Cm diff 698command to compare the reference tree to your current files in 699.Pa /etc . 700Undesired differences should be removed using an editor, 701.Xr patch 1 , 702or by copying files from the reference tree 703.Po 704located at 705.Pa /var/db/etcupdate/current 706by default 707.Pc 708. 709.Pp 710If the tree at 711.Pa /usr/src 712is already newer than the currently installed world, 713a new tree matching the currently installed world can be checked out to 714a temporary location. 715The reference tree for 716.Nm 717can then be generated via: 718.Pp 719.Dl "etcupdate extract -s /path/to/tree" 720.Pp 721The 722.Cm diff 723command can be used as above to remove undesired differences. 724Afterwards, 725the changes in the tree at 726.Pa /usr/src 727can be merged via a regular merge. 728.Sh DIAGNOSTICS 729The following warning messages may be generated during a merge. 730Note that several of these warnings cover obscure cases that should occur 731rarely if at all in practice. 732For example, 733if a file changes from a file to a directory in the 734.Dq current 735tree 736and the file was modified in the destination directory, 737then a warning will be triggered. 738In general, 739when a warning references a pathname, 740the corresponding file in the destination directory is not changed by a 741merge operation. 742.Bl -diag 743.It "Directory mismatch: <path> (<type>)" 744An attempt was made to create a directory at 745.Pa path 746but an existing file of type 747.Dq type 748already exists for that path name. 749.It "Modified link changed: <file> (<old> became <new>)" 750The target of a symbolic link named 751.Pa file 752was changed from 753.Dq old 754to 755.Dq new 756in the 757.Dq current 758tree. 759The symbolic link has been modified to point to a target that is neither 760.Dq old 761nor 762.Dq new 763in the destination directory. 764.It "Modified mismatch: <file> (<new> vs <dest>)" 765A file named 766.Pa file 767of type 768.Dq new 769was modified in the 770.Dq current 771tree, 772but the file exists as a different type 773.Dq dest 774in the destination directory. 775.It "Modified <type> changed: <file> (<old> became <new>)" 776A file named 777.Pa file 778changed type from 779.Dq old 780in the 781.Dq previous 782tree to type 783.Dq new 784in the 785.Dq current 786tree. 787The file in the destination directory of type 788.Dq type 789has been modified, 790so it could not be merged automatically. 791.It "Modified <type> remains: <file>" 792The file of type 793.Dq type 794named 795.Pa file 796has been removed from the 797.Dq current 798tree, 799but it has been locally modified. 800The modified version of the file remains in the destination directory. 801.It "Needs update: /etc/localtime (required manual update via tzsetup(8))" 802The 803.Fa /var/db/zoneinfo 804file does not exist, 805so 806.Nm 807was not able to refresh 808.Fa /etc/localtime 809from its source file in 810.Fa /usr/share/zoneinfo . 811Running 812.Xr tzsetup 8 813will both refresh 814.Fa /etc/localtime 815and generate 816.Fa /var/db/zoneinfo 817permitting future updates to refresh 818.Fa /etc/localtime 819automatically. 820.It "Needs update: /etc/mail/aliases.db (required manual update via newaliases(1))" 821The file 822.Pa /etc/mail/aliases 823was updated during a merge with a non-empty destination directory. 824Due to a limitation of the 825.Xr newaliases 1 826command, 827.Nm 828was not able to automatically update the corresponding aliases database. 829.It "New file mismatch: <file> (<new> vs <dest>)" 830A new file named 831.Pa file 832of type 833.Dq new 834has been added to the 835.Dq current 836tree. 837A file of that name already exists in the destination directory, 838but it is of a different type 839.Dq dest . 840.It "New link conflict: <file> (<new> vs <dest>)" 841A symbolic link named 842.Pa file 843has been added to the 844.Dq current 845tree that links to 846.Dq new . 847A symbolic link of the same name already exists in the destination 848directory, 849but it links to a different target 850.Dq dest . 851.It "Non-empty directory remains: <file>" 852The directory 853.Pa file 854was removed from the 855.Dq current 856tree, 857but it contains additional files in the destination directory. 858These additional files as well as the directory remain. 859.It "Remove mismatch: <file> (<old> became <new>)" 860A file named 861.Pa file 862changed from type 863.Dq old 864in the 865.Dq previous 866tree to type 867.Dq new 868in the 869.Dq current 870tree, 871but it has been removed in the destination directory. 872.It "Removed file changed: <file>" 873A file named 874.Pa file 875was modified in the 876.Dq current 877tree, 878but it has been removed in the destination directory. 879.It "Removed link changed: <file> (<old> became <new>)" 880The target of a symbolic link named 881.Pa file 882was changed from 883.Dq old 884to 885.Dq new 886in the 887.Dq current 888tree, 889but it has been removed in the destination directory. 890.El 891.Sh SEE ALSO 892.Xr cap_mkdb 1 , 893.Xr diff 1 , 894.Xr make 1 , 895.Xr newaliases 1 , 896.Xr sh 1 , 897.Xr mergemaster 8 , 898.Xr pwd_mkdb 8 , 899.Xr services_mkdb 8 , 900.Xr tzsetup 8 901.Sh HISTORY 902The 903.Nm 904utility first appeared in 905.Fx 10.0 . 906.Sh AUTHORS 907The 908.Nm 909utility was written by 910.An John Baldwin Aq Mt jhb@FreeBSD.org . 911.Sh BUGS 912Rerunning a merge does not automatically delete conflicts left over from a 913previous merge. 914Any conflicts must be resolved before the merge can be rerun. 915It is not clear if this is a feature or a bug. 916.Pp 917There is no way to easily automate conflict resolution for specific files. 918For example, one can imagine a syntax along the lines of 919.Pp 920.Dl "etcupdate resolve tf /some/file" 921.Pp 922to resolve a specific conflict in an automated fashion. 923.Pp 924Bootstrapping 925.Nm 926often results in gratuitous diffs in 927.Pa /etc/mail/*.cf 928that cause conflicts in the first merge. 929If an object tree that matches the source tree is present when bootstrapping, 930then passing the 931.Fl B 932flag to the 933.Cm extract 934command can work around this. 935