I have a master and a setup branch in my repo. I'm keeping the setup branch checked out as a worktree inside the main repo folder via
git worktree add ./local/setup
echo '/local' > .gitignore
So the main repo folder is on master, and the local/setup folder is on setup. Everything is fine and dandy, I can work on my setup files without having to switch branches, I can commit from within local/setup etc.
But if I try to move the entire repo, or access it from a different Linux boot (/home/myrepo becomes /mnt/ubu/home/myrepo), things break. The problem seems to be that git's worktree functionality records absolute paths, in
myrepo/.git/worktrees/setup/gitdir
myrepo/local/setup/.git
Can I convert these to relative paths to make the repo + embedded worktree relocatable? I'm not sure what the paths in those files should be relative to, but I can experiment. Is this setup dangerous?
I make a simple bash script for my personal use here:
https://github.com/Kristian-Tan/git-worktree-relative
Note that this answer is just a copy-paste from my README.md
...
{worktree}/.git file and {repo}/.git/worktrees/{wtname}/gitdir
catechoreadlinkrealpath (GNU utility since 2012, might not be preinstalled in very old linux system like debian wheezy)sedpwd${parameter/pattern/string} and ${parameter%%word} https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion
git worktree remove may refuse on relative path){worktree}/.git file-v = verbose (not implemented yet)-w worktree_target = directory of worktree to be made relative (will default to current directory if not supplied)-r repository_target = directory of repository (including worktree directory inside .git, will be read from {worktree_target}/.git file if not supplied)-h = show help-r repositor_target flag/home/myuser/repo/myproject ; worktree in /home/myuser/www/myproject ; worktree is connected with repository (link is not broken)
cd /home/myuser/www/myproject
git-worktree-relative
# OR
git-worktree-relative -w /home/myuser/www/myproject
/home/myuser/repo/myproject ; worktree in /home/myuser/www/myproject ; worktree is NOT connected with repository (link broken)
cd /home/myuser/www/myproject
git-worktree-relative -r /home/myuser/repo/myproject/.git/worktrees/myproject
# OR
git-worktree-relative -w /home/myuser/www/myproject -r /home/myuser/repo/myproject/.git/worktrees/myproject
git-worktree-relative command with git-worktree-absolute (same command line argument)
git worktree remove requires the path to be absolute: you can use this reverse script to revert it back to absolute path before removinggit clone https://github.com/Kristian-Tan/git-worktree-relative.git
cd git-worktree-relative
sudo bash install.sh
git clone https://github.com/Kristian-Tan/git-worktree-relative.git ; cd git-worktree-relative ; sudo bash install.sh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Kristian-Tan/git-worktree-relative/HEAD/get)"
git-worktree-relative.sh and git-worktree-absolute.sh to /usr/bin or /bin (you can also remove the extension) cp git-worktree-relative.sh /usr/bin/git-worktree-relative
cp git-worktree-absolute.sh /usr/bin/git-worktree-absolute
chown root:root /usr/bin/git-worktree-relative
chown root:root /usr/bin/git-worktree-absolute
chmod 0755 /usr/bin/git-worktree-relative
chmod 0755 /usr/bin/git-worktree-absolute
git clone https://github.com/Kristian-Tan/git-worktree-relative.git ; sudo bash git-worktree-relative/uninstall.sh)/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Kristian-Tan/git-worktree-relative/HEAD/remove)"
...
usretc for advise in git worktree with relative path?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With