8

我的仓库中有一个master和一个setup分支。我setup通过_ _

git worktree add ./local/setup
echo '/local' > .gitignore

所以主 repo 文件夹是 on master,并且该local/setup文件夹是 on setup。一切都很好,花花公子,我可以处理我的setup文件而不必切换分支,我可以从内部提交local/setup等等。

但是,如果我尝试移动整个 repo,或者从不同的 Linux 引导(/home/myrepo变成/mnt/ubu/home/myrepo)访问它,事情就会中断。问题似乎是git工作树功能记录了绝对路径,在

myrepo/.git/worktrees/setup/gitdir
myrepo/local/setup/.git

我可以将这些转换为相对路径以使 repo + 嵌入式工作树可重定位吗?我不确定这些文件中的路径应该相对于什么,但我可以进行实验。这种设置危险吗?

4

3 回答 3

7

我在这里制作了一个简单的 bash 脚本供我个人使用:

https://github.com/Kristian-Tan/git-worktree-relative

请注意,此答案只是我的 README.md 的复制粘贴

...

我的解决方案

  • 替换内容的 Bash 脚本{worktree}/.git file{repo}/.git/worktrees/{wtname}/gitdir
  • 为什么选择 bash:几乎每个使用 git 的人都会在某种类似 bash-shell 的环境中使用它(例如:linux 中的 bash shell,windows 中的 git bash)
  • 要求(应该在每个 bash shell 上都可用):
  • 另一个 bash 脚本将其更改回绝对路径(因为git worktree remove可能会拒绝相对路径)

用法

  • 在工作树中执行脚本(或在 -w 选项中提供工作树目录路径)
  • 它将从{worktree}/.git文件中读取存储库的路径
  • 选项:
    • -v= 详细(尚未实现)
    • -w worktree_target= 工作树的相对目录(如果未提供,将默认为当前目录)
    • -r repository_target= 存储库目录(包括 .git 中的工作树目录,如果未提供,将从 {worktree_target}/.git 文件中读取)
    • -h= 显示帮助
  • 此解决方案适用于断开的链接(例如:工作树目录已移动或父 git 目录已移动):只需在-r repositor_target标志中提供存储库路径
  • 此解决方案适用于父存储库内的工作树
  • 例子:
    • 存储库/home/myuser/repo/myproject;工作树在/home/myuser/www/myproject;工作树与存储库连接(链接未断开)
      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;工作树未与存储库连接(链接断开)
      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 status”
  • 将相对工作树反转回绝对:只需git-worktree-relative使用git-worktree-absolute(相同的命令行参数) 更改命令
    • 命令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.shgit-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)"

...

学分

于 2021-03-16T12:45:53.190 回答
3

您不是第一个问这个问题的人,请参阅2016 年的此功能请求

相对路径似乎使事情复杂化:

  • 移动工作树时(请注意,工作树可以在父存储库内部或外部)
  • 移动父存储库时

所以这似乎从来没有得到实施......

于 2021-03-15T10:15:13.330 回答
0

我推出了自己的git-worktree-path。它是最低限度的 hackish(没有弄乱内部git路径,几乎所有东西都通过git rev-parse)并且最大限度地 DRY-ish

于 2021-03-23T11:20:43.567 回答