git 具有相对路径的工作树?
git worktree with relative path?
我的仓库中有一个 master
和一个 setup
分支。我将 setup
分支作为工作树检出 在 主回购文件夹中
git worktree add ./local/setup
echo '/local' > .gitignore
所以主 repo 文件夹在 master
上,local/setup
文件夹在 setup
上。一切都很好,花花公子,我可以处理我的 setup
文件而无需切换分支,我可以从 local/setup
等
中提交
但是,如果我尝试移动整个存储库,或从不同的 Linux 引导访问它(/home/myrepo
变为 /mnt/ubu/home/myrepo
),事情就会崩溃。问题似乎是 git
的工作树功能记录了绝对路径,在
myrepo/.git/worktrees/setup/gitdir
myrepo/local/setup/.git
我可以将它们转换为相对路径以使存储库 + 嵌入式工作树可重定位吗?我不确定这些文件中的路径应该是 到 的相对路径,但我可以试验一下。这个设置危险吗?
你不是第一个问这个问题的人,请看this feature-request from 2016
相对路径似乎使事情复杂化:
- 移动工作树时(注意工作树可以在父存储库内部或外部)
- 移动父存储库时
所以这似乎从未实施过...
我在这里制作了一个简单的 bash 脚本供我个人使用:
https://github.com/Kristian-Tan/git-worktree-relative
请注意,此答案只是我 README.md
的复制粘贴
...
我的解决方案
- Bash脚本替换
{worktree}/.git file
和{repo}/.git/worktrees/{wtname}/gitdir
的内容
- 为什么 bash:几乎所有使用 git 的人都会在某种类似 bash-shell 的环境中使用它(例如:bash shell linux, git bash windows)
- 要求(应该在每个 bash shell 上可用):
cat
echo
readlink
realpath
(自 2012 年以来的 GNU 实用程序,可能不会预装在非常旧的 linux 系统中,例如 debian wheezy)
sed
pwd
- bash shell 参数扩展
${parameter/pattern/string}
和 ${parameter%%word}
https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion
- 另一个 bash 脚本将其改回绝对路径(因为
git worktree remove
可能拒绝相对路径)
用法
- 在您的工作树中执行脚本(或在 -w 选项中提供工作树目录路径)
- 它将从
{worktree}/.git
文件 中读取存储库路径
- 选项:
-v
= 冗长(尚未实现)
-w worktree_target
= 相对工作树的目录(如果未提供,将默认为当前目录)
-r repository_target
= 存储库目录(包括 .git 中的工作树目录,如果未提供,将从 {worktree_target}/.git 文件中读取)
-h
= 显示帮助
- 此解决方案适用于损坏的 link(例如:工作树目录已移动或父 git 目录已移动):只需在
-r repositor_target
标志 中提供存储库路径
- 此解决方案适用于父存储库中的工作树
- 示例:
/home/myuser/repo/myproject
中的存储库; /home/myuser/www/myproject
中的工作树;工作树与存储库连接(link 未损坏)
cd /home/myuser/www/myproject
git-worktree-relative
# OR
git-worktree-relative -w /home/myuser/www/myproject
/home/myuser/repo/myproject
中的存储库; /home/myuser/www/myproject
中的工作树;工作树未与存储库连接(link 损坏)
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
- 检测link是否损坏,运行在工作树目录
中命令'git status'
- 将相对工作树反转为绝对工作树:只需将
git-worktree-relative
命令更改为 git-worktree-absolute
(相同的命令行参数)
- command
git worktree remove
要求路径为绝对路径:您可以使用此反向脚本将其还原为删除前的绝对路径
安装
自动安装
- 将下面的命令复制粘贴到您的终端中:
git 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
和git-worktree-absolute.sh
复制到/usr/bin
或/bin
(您也可以删除扩展名)
- 授予其他用户执行权限
- 示例:
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
- 一个用户的安装:
- 将其复制到添加到 PATH 变量的任何目录
卸载
- 仅删除复制的文件(或仅使用 uninstall.sh 脚本:
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)"
...
学分
- [已删除] Bash BR0kEN- (https://gist.github.com/BR0kEN-/a84b18717f8c67ece6f7)
实现了 strpos 和 substr
- Whosebug 用户
usretc
在 中寻求建议
我推出了自己的 git-worktree-path。它是最低限度的骇人听闻的(没有弄乱内部 git
路径,几乎所有东西都经过 git rev-parse
)并且最大程度地干燥
我的仓库中有一个 master
和一个 setup
分支。我将 setup
分支作为工作树检出 在 主回购文件夹中
git worktree add ./local/setup
echo '/local' > .gitignore
所以主 repo 文件夹在 master
上,local/setup
文件夹在 setup
上。一切都很好,花花公子,我可以处理我的 setup
文件而无需切换分支,我可以从 local/setup
等
但是,如果我尝试移动整个存储库,或从不同的 Linux 引导访问它(/home/myrepo
变为 /mnt/ubu/home/myrepo
),事情就会崩溃。问题似乎是 git
的工作树功能记录了绝对路径,在
myrepo/.git/worktrees/setup/gitdir
myrepo/local/setup/.git
我可以将它们转换为相对路径以使存储库 + 嵌入式工作树可重定位吗?我不确定这些文件中的路径应该是 到 的相对路径,但我可以试验一下。这个设置危险吗?
你不是第一个问这个问题的人,请看this feature-request from 2016
相对路径似乎使事情复杂化:
- 移动工作树时(注意工作树可以在父存储库内部或外部)
- 移动父存储库时
所以这似乎从未实施过...
我在这里制作了一个简单的 bash 脚本供我个人使用:
https://github.com/Kristian-Tan/git-worktree-relative
请注意,此答案只是我 README.md
的复制粘贴...
我的解决方案
- Bash脚本替换
{worktree}/.git file
和{repo}/.git/worktrees/{wtname}/gitdir
的内容
- 为什么 bash:几乎所有使用 git 的人都会在某种类似 bash-shell 的环境中使用它(例如:bash shell linux, git bash windows)
- 要求(应该在每个 bash shell 上可用):
cat
echo
readlink
realpath
(自 2012 年以来的 GNU 实用程序,可能不会预装在非常旧的 linux 系统中,例如 debian wheezy)sed
pwd
- bash shell 参数扩展
${parameter/pattern/string}
和${parameter%%word}
https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion
- 另一个 bash 脚本将其改回绝对路径(因为
git worktree remove
可能拒绝相对路径)
用法
- 在您的工作树中执行脚本(或在 -w 选项中提供工作树目录路径)
- 它将从
{worktree}/.git
文件 中读取存储库路径
- 选项:
-v
= 冗长(尚未实现)-w worktree_target
= 相对工作树的目录(如果未提供,将默认为当前目录)-r repository_target
= 存储库目录(包括 .git 中的工作树目录,如果未提供,将从 {worktree_target}/.git 文件中读取)-h
= 显示帮助
- 此解决方案适用于损坏的 link(例如:工作树目录已移动或父 git 目录已移动):只需在
-r repositor_target
标志 中提供存储库路径
- 此解决方案适用于父存储库中的工作树
- 示例:
/home/myuser/repo/myproject
中的存储库;/home/myuser/www/myproject
中的工作树;工作树与存储库连接(link 未损坏)cd /home/myuser/www/myproject git-worktree-relative # OR git-worktree-relative -w /home/myuser/www/myproject
/home/myuser/repo/myproject
中的存储库;/home/myuser/www/myproject
中的工作树;工作树未与存储库连接(link 损坏)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
- 检测link是否损坏,运行在工作树目录 中命令'git status'
- 将相对工作树反转为绝对工作树:只需将
git-worktree-relative
命令更改为git-worktree-absolute
(相同的命令行参数)- command
git worktree remove
要求路径为绝对路径:您可以使用此反向脚本将其还原为删除前的绝对路径
- command
安装
自动安装
- 将下面的命令复制粘贴到您的终端中:
git 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
和git-worktree-absolute.sh
复制到/usr/bin
或/bin
(您也可以删除扩展名) - 授予其他用户执行权限
- 示例:
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
- 将
- 一个用户的安装:
- 将其复制到添加到 PATH 变量的任何目录
卸载
- 仅删除复制的文件(或仅使用 uninstall.sh 脚本:
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)"
...
学分
- [已删除] Bash BR0kEN- (https://gist.github.com/BR0kEN-/a84b18717f8c67ece6f7) 实现了 strpos 和 substr
- Whosebug 用户
usretc
在 中寻求建议
我推出了自己的 git-worktree-path。它是最低限度的骇人听闻的(没有弄乱内部 git
路径,几乎所有东西都经过 git rev-parse
)并且最大程度地干燥