Created
October 22, 2025 03:27
-
-
Save nicolemon/811b3def5107ed018e7a778eaa93ee3d to your computer and use it in GitHub Desktop.
for my git worktree workflow
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/zsh | |
| # Set up a new workspace with links to shared resources | |
| project_dir=$(pwd) | |
| shared=${project_dir}/.SHARED | |
| worktree=${project_dir}/$1 | |
| # files under .SHARED you want hardlinked | |
| hardlink_assets=( | |
| "gitignore.Makefile" | |
| "CLAUDE.local.md" | |
| ".claude/settings.local.json" | |
| ) | |
| # directories under .SHARED you want softlinked | |
| softlink_assets=( | |
| ".claude/commands" | |
| ".claude/agents" | |
| ) | |
| createHardlink() { | |
| filename="$1" | |
| ln -h ${shared}/${filename} ${worktree}/${filename} | |
| } | |
| createSoftlink() { | |
| filename="$1" | |
| ln -s ${shared}/${filename} ${worktree}/${filename} | |
| } | |
| _verifyExists() { | |
| filename="$1" | |
| test -e "${worktree}/${filename}" | |
| } | |
| verifyExists() { | |
| filename="$1" | |
| _verifyExists ${filename} && (echo "✅ FOUND: ${worktree}/${filename}") || (echo "❌ MISSING: ${worktree}/${filename}") | |
| } | |
| verifySoftlink() { | |
| filename="$1" | |
| test -L "${worktree}/${filename}" && (echo " ✓ softlinked: ${worktree}/${filename}") || (echo " ✘ not softlinked: ${worktree}/${filename}") | |
| } | |
| verifyHardlink() { | |
| filename="$1" | |
| # link_count=$(stat -c %h "${worktree}/${filename}" 2>/dev/null) | |
| link_count=$(stat -f %l "${worktree}/${filename}" 2>/dev/null) | |
| [ "${link_count}" -gt 1 ] && (echo " ✓ hardlinked: ${worktree}/${filename}") || (echo " ✘ not hardlinked: ${worktree}/${filename}") | |
| } | |
| check() { | |
| echo "\nChecking for shared local resources in 📁 ${worktree}...\n" | |
| _check | |
| } | |
| _check() { | |
| for asset in ${hardlink_assets}; do | |
| verifyExists ${asset} && verifyHardlink ${asset} | |
| echo | |
| done | |
| for asset in ${softlink_assets}; do | |
| verifyExists ${asset} && verifySoftlink ${asset} | |
| echo | |
| done | |
| } | |
| link() { | |
| mkdir -p ${worktree}/.claude | |
| for asset in ${hardlink_assets}; do | |
| _verifyExists ${asset} || createHardlink ${asset} | |
| done | |
| for asset in ${softlink_assets}; do | |
| _verifyExists ${asset} || createSoftlink ${asset} | |
| done | |
| echo "\nShared local resources linked in 📁 ${worktree}\n" | |
| _check | |
| } | |
| cleanup() { | |
| for asset in ${hardlink_assets}; do | |
| _verifyExists ${asset} && unlink ${worktree}/${asset} | |
| done | |
| for asset in ${softlink_assets}; do | |
| _verifyExists ${asset} && unlink ${worktree}/${asset} | |
| done | |
| echo "\nShared local resources unlinked in 📁 ${worktree}\n" | |
| _check | |
| } | |
| _exit() { | |
| unset project_dir | |
| unset shared | |
| unset worktree | |
| unset hardlink_assets | |
| unset softlink_assets | |
| exit "$1" | |
| } | |
| if test -d ${worktree}; then | |
| command -v "$2" &>/dev/null && "$2" || check | |
| else | |
| echo "❗ worktree at ${worktree} does not exist" && _exit 1 | |
| fi | |
| # vim: set et sts=4 ts=4 sw=4: |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment