Git克隆-创建一个裸克隆,但带有远程跟踪分支(用于工作树';主';repo)

Git克隆-创建一个裸克隆,但带有远程跟踪分支(用于工作树';主';repo),git,git-worktree,Git,Git Worktree,为了与worktrees一起使用,我尝试创建一个裸克隆,但远程分支映射到远程跟踪分支 我正在尝试设置一个通用的工作树工作流。我的回购协议真的很大,所以很昂贵。即使使用硬链接,当repo得到gced时,它们也会随着时间的推移而发散,并占用额外的空间,并且在一个repo中提取对另一个repo没有帮助,因此在工作树中工作似乎是显而易见的事情。(在这件事上你得相信我。) 工作树需要一个实际保存对象的“主”repo。显然,这个克隆不能被删除,所以我想把它放在类似/var/cache/git/reponam

为了与worktrees一起使用,我尝试创建一个裸克隆,但远程分支映射到远程跟踪分支

我正在尝试设置一个通用的工作树工作流。我的回购协议真的很大,所以很昂贵。即使使用硬链接,当repo得到
gc
ed时,它们也会随着时间的推移而发散,并占用额外的空间,并且在一个repo中提取对另一个repo没有帮助,因此在工作树中工作似乎是显而易见的事情。(在这件事上你得相信我。)

工作树需要一个实际保存对象的“主”repo。显然,这个克隆不能被删除,所以我想把它放在类似
/var/cache/git/reponame.wt.git
的地方。(我正在为我和我的同事制定一个通用的解决方案,所以我必须让它相当简单。)

我可以让它成为一个普通的克隆,但它必须签出一个分支,然后该分支不能被任何其他工作树签出,因此我必须创建一个可能会让人困惑的伪分支(例如,
wt\u dummy
)。我真正想做的是将主回购协议变成一个裸回购协议

问题在于,
git clone--bare
不能创建远程跟踪分支。因此,为了实现“裸回购,但有远程跟踪分支”,我开始走这条路

git clone --bare <remote> repo.tmp
mv repo.tmp.git reponame.wt.git
cd reponame.wt.git
git config core.bare true
git config --remove-section branch.master
... and I'm not quite there yet ...
git克隆--bare repo.tmp
mv repo.tmp.git reponame.wt.git
cd reponame.wt.git
git config core.bare true
git config--删除branch.master节
... 而我还没有完全做到。。。
但是a)它看起来太长太复杂,b)git存储库仍然认为它已经签出了
master

有没有更好的方法来制作这个“带遥控器的裸克隆”


(一般来说,也许有更好的方法来设置工作树,但我知道这是在堆栈溢出的“特定编程解决方案”范围的边缘。)

您可以将裸存储库配置为具有以下远程跟踪分支:

git config --local --add remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
运行
git-fetch
,您应该可以通过
git-branch-a
看到它们

我认为不可能在存储库中签出
master
(或另一个分支),但对于裸存储库,无论如何都可以为其创建链接的工作树,例如:

git worktree add --force <path> master
git工作树添加--force master

即使
master
是在裸存储库中签出的,但如果存储库是裸存储库,则没有主工作树,因此不会出现两个不同步的工作树

“我可以让它成为一个普通的克隆,但是它必须签出一个分支,然后该分支不能被任何其他工作树签出,所以我必须创建一个虚拟分支(例如WTU虚拟分支),这可能会让人困惑,”为什么不创建一个空的提交并签出它(作为分离的头)在您的非裸存储库中?这是一个合理的想法。您甚至可以执行
git clone--no checkout--branch v1.0 reponame.wt
,为您提供一个未签出但头部指向
v1.0
标记的repo。通过@msleigh使用git config命令添加refpsec非常有魅力。我还建议在克隆裸repo时,使用使用“--single branch”选项。就远程分支而言,结果看起来非常像一个非裸存储库克隆。