blob: 4c41fb8073a0582c537d2802d06db37b86f1b695 [file] [log] [blame]
= 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.