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
cat
echo
readlink
realpath
(GNU utility since 2012, might not be preinstalled in very old linux system like debian wheezy)sed
pwd
${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