Support long or ever standing, all time being on top, downstream patchsets in a Git repository. This tool is intended to be lightweight and support only long or ever standing downstream patches. For the rest of use cases, look for the alternatives.
Clone Gatch repository:
git clone git://git.sugarlabs.org/sdk/gatch.git <INSTALL-PATH>
gatch command to the
PATH environment variable, e.g., in
~/.bashrc file (you need to relogin):
echo PATH=<INSTALL-PATH>:$PATH >> ~/.bashrc
This section operates with the following terms:
- upstream remote
The name (from
git remotecommand output) of repository that contain upstream branch;
- upstream branch
Git branch in upstream remote repository that is beeing used as a basis for downstream branch;
- downstream remote
The name (from
git remotecommand output) of repository that contains downstream branch, might be the same as upstream remote;
- downstream branch
Git branch in downstream remote that is based on upstream branch and contains downstream commits all time on top of ones from upstream branch.
Initiate downstream branch
Add upstream remote (if it is not the same as the current remote,
origin) for repository downstream branch will be based on:
git remote add <UPSTREAM-REMOTE> <UPSTREAM-URL>
Create downstream branch:
git fetch <UPSTREAM-REMOTE> --no-tags git checkout <UPSTREAM-REMOTE>/<UPSTREAM-BRANCH> -b <DOWNSTREAM-BRANCH>
Register downstream branch as a Gatch branch:
gatch init <UPSTREAM-REMOTE> <UPSTREAM-BRANCH>
This command will create watershed commit with comment
[gatch-<DOWNSTREAM-BRANCH>] Initiate downstream branch. Since this time, all downstream commits will be after watershed one, even after re-basing to the recent upstream branch.
Populate downstream commits
Use downstream branch as a regular Git branch, i.e., create new commits.
Merge upstream updates
Being in downstream branch, type:
This command will:
- fetch recent upstream branch commits;
- rollback downstream commits to the currently local upstream HEAD;
- pull upstream commits on top on currently local upstream HEAD;
- re-apply all downstream commits on top on new upstream HEAD.
The whole process does not break Git's consistent history, i.e., while pushing new downstream branch to the server, there is no need in
The one obvious cave is that on the 4th step, git might complain about not possible merging. These conflict need to be solved as regular Git's merge conflicts.
Upstream merge right after clone
initcommand keeps all information regarding upstream repository and branch in
.sweets/gatch*files controlled by git. So, it is possible to clone downstream branch and run
mergecommand, gatch will add upstream remote if it absent in local repository.
Avoid upstream merge history
- Gatch does not break Git history, thus, it is possible to see downstream commits that existed before every upstream merge. It is useful to
git --hard resetsometimes, but might be annoying to see all of them in
git logoutput. To suppress showing these commits, use
git log --first-parentcommand.
A series of bash scripts which add a quilt-like interface to git.
Manage a stack of patches using GIT as a backend.
A different patch queue manager.