|  | = Working between Multiple Major versions | 
|  | // Licensed to the Apache Software Foundation (ASF) under one | 
|  | // or more contributor license agreements.  See the NOTICE file | 
|  | // distributed with this work for additional information | 
|  | // regarding copyright ownership.  The ASF licenses this file | 
|  | // to you under the Apache License, Version 2.0 (the | 
|  | // "License"); you may not use this file except in compliance | 
|  | // with the License.  You may obtain a copy of the License at | 
|  | // | 
|  | //   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, | 
|  | // software distributed under the License is distributed on an | 
|  | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | // KIND, either express or implied.  See the License for the | 
|  | // specific language governing permissions and limitations | 
|  | // under the License. | 
|  |  | 
|  | Working between multiple major versions of `solr` is often a necessary part of committing code, due to backports and testing. | 
|  | For some versions, this is an even bigger issue because `8.x` and `9.x` use different build systems, ant and gradle, and different repository locations. | 
|  | Switching between these branches will result in many files left around that are not tracked by the other branch. | 
|  | Even when the build system between branches is the same, major refactoring can produce the same issues. | 
|  | These orphaned files can impact the use of `precommit`, IntelliJ, and other tools. | 
|  |  | 
|  | == Git Worktree | 
|  |  | 
|  | https://git-scm.com/docs/git-worktree[Git worktree] is a feature of git that allows you to have different directories store separate checkouts of the same repository, at the same time. | 
|  | The git metadata is shared between the different directories, so any remotes added or local commits made from one worktree are available to all other worktrees as well. | 
|  |  | 
|  | For Solr, this allows us to have separate directories (worktrees) that manage the checkouts of `main` and stable or release branches, if those e.g. require different Java versions or build setup. | 
|  | One can make a commit on `main`, then easily switch directories and cherry-pick the commit onto the stable branch without having to worry about compatibility. | 
|  | This setup also allows the commit to be tested on `main` and release branch simultaneously. | 
|  |  | 
|  | === Setup | 
|  |  | 
|  | Wherever you store your source code, create a root folder for solr. | 
|  |  | 
|  | ``` | 
|  | mkdir solr | 
|  | ``` | 
|  |  | 
|  | This folder is not a git folder however. Instead, it will hold all of our solr git checkouts. | 
|  |  | 
|  | ```bash | 
|  | cd solr | 
|  | # "Main" will be the main solr checkout, that all worktrees stem from. | 
|  | git clone git@github.com:apache/solr.git main | 
|  | cd main | 
|  | # For each branch that you want a separate directory created for, add a worktree | 
|  | git worktree add ../9x branch_9x | 
|  | # For making bugfixes to the 8.11.x line, we need to add the older lucene-solr repository as a remote | 
|  | git remote add -f lucene-solr git@github.com:apache/lucene-solr.git | 
|  | git worktree add ../8_11 lucene-solr/branch_8_11 | 
|  | ``` | 
|  |  | 
|  | === Using the Worktrees | 
|  |  | 
|  | It's not necessary to create a worktree for every branch you are working on. | 
|  | Creating repositories for each relevant major version is likely sufficient, because the differences between minor versions is likely not great enough to require a whole new folder. | 
|  | Therefore most developers will only need 2, main and the lastest major version. | 
|  | Whenever working on a minor release branch, you can easily use the worktree that corresponds to the same major version. | 
|  |  | 
|  | If you are using IntelliJ, you will likely want to load each of the worktrees as a separate project. | 
|  | That way when you switch between them, IntelliJ will not have to re-build the project fully. |