No description
  • TypeScript 64.9%
  • Shell 35.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Julien Terzibaschian e2918c9af6
All checks were successful
Release / build (git-livemerge-macos-arm64, bun-darwin-arm64) (push) Successful in 2m44s
Release / build (git-livemerge-macos-x64, bun-darwin-x64) (push) Successful in 2m47s
Release / build (git-livemerge-linux-x64, bun-linux-x64) (push) Successful in 2m58s
Release / build (git-livemerge-windows-x64.exe, bun-windows-x64) (push) Successful in 1m26s
Release / release (push) Successful in 5m7s
chore: fixed release
2026-09-09 14:04:30 +02:00
.gitea/workflows chore: fixed release 2026-09-09 14:04:30 +02:00
src Initial commit: git-livemerge tool with Gitea release workflow 2026-09-09 12:39:50 +02:00
.gitignore Initial commit: git-livemerge tool with Gitea release workflow 2026-09-09 12:39:50 +02:00
bun.lock Initial commit: git-livemerge tool with Gitea release workflow 2026-09-09 12:39:50 +02:00
git-livemerge.sh Initial commit: git-livemerge tool with Gitea release workflow 2026-09-09 12:39:50 +02:00
install.sh fixed install 2026-09-09 13:48:27 +02:00
package.json Initial commit: git-livemerge tool with Gitea release workflow 2026-09-09 12:39:50 +02:00
README.md chore: updated readme 2026-09-09 13:17:51 +02:00
tsconfig.json Initial commit: git-livemerge tool with Gitea release workflow 2026-09-09 12:39:50 +02:00

git-livemerge

Merges origin/live_stable into every other origin/live_* branch. Same job as the original git-livemerge.sh, as an interactive TUI — but every branch is merged in its own git worktree, so merges run in parallel and a conflict parks one branch instead of blocking the rest.

Install

curl -fsSL https://git.e-confirm.de/settings-master/git-livemerge/raw/branch/main/install.sh | sh

Detects OS/arch, grabs the matching binary from the latest release, and overwrites /usr/local/bin/git-livemerge (chmod +x included). Needs sudo if that folder isn't writable by you.

Windows: under Git Bash/MSYS the same command installs git-livemerge.exe into /usr/bin. Native (no bash) install: download git-livemerge-windows-x64.exe from the releases page and drop it, renamed git-livemerge.exe, into a folder on your PATH.

Use

git-livemerge          # picker
git-livemerge tts      # picker, filter pre-filled (matches live_tts)
git-livemerge all      # every live_* branch, no picker
git-livemerge all -j 8 # 8 at a time (default 4)
git-livemerge --clean  # drop the cached worktrees for this repo

Picker — type to filter (tts finds live_tts, tts also matches text_to_speech), click or space to toggle, ctrl-a selects everything shown, enter starts. With nothing ticked, enter takes the highlighted branch.

Run — one row per branch with live status, a progress bar, and a console tail. ↑↓ picks the branch whose log you're watching, a interleaves all branches, l opens the full console (PgUp/PgDn/wheel to scroll).

Conflicts — a conflicted branch is parked: its worktree is kept, its merge stays in progress, and the other branches carry on merging. Press enter on the red row whenever you want to deal with it:

key action
m git mergetool in that worktree (TUI hands over the terminal, other branches keep going)
c shell in that worktree — fix by hand, exit to come back
v preview the conflict hunks of the selected file
g stage the ✔ files (no markers left, e.g. resolved by git rerere)
f re-check status after editing files elsewhere
r resolved — commit & push · p commit only
a abort this merge · s leave it parked and go back

Files are split into ✔ (no conflict markers left, just needs staging) and ✖ (needs you). Clean merges commit and push unattended.

Worktrees & submodules

Worktrees live in $TMPDIR/git-livemerge-<repo>-<hash>/<branch> and are kept between runs as a cache — creating them is the expensive part. When a branch settles its worktree is only detached (git checkout --detach), which frees the branch for your own checkouts but keeps the tree on disk, so the next run just does a checkout -f instead of a fresh one. A parked branch keeps its worktree attached with the merge still in progress; the path is shown on the summary screen. Re-running on a parked branch discards that half-done merge and starts it again (git rerere, if you have it on, replays what you already resolved).

Submodules are never checked out in these worktrees (submodule.recurse=false on every command there) and the initial fetch skips them too — the merge only moves gitlinks, so cloning submodule contents per branch is pure cost. Your own working copy is untouched by this.

git-livemerge --clean deletes the whole worktree cache for the repo.

The branch checked out in your own working copy is detached for the duration if it's in the merge list, and restored at the end.

Build

bun install
bun run build                 # -> ./git-livemerge (standalone, no runtime needed)
bun run src/filter.test.ts    # picker matcher check