我正在做一个本地测试,我有:
回购1- 裸回购
- work-tree文件夹
我将一些更改推到裸repo。现在我想手动地将它部署到工作树中。
我进入裸repo,其中master被签出,我尝试签出master并将工作树设置为工作树文件夹:
set WT=../myworktree //<-- create env variable on windows
git --work-tree=%WT% checkout -f master
但是结果是:'Already on 'master'
,并且没有对工作树文件进行任何更改。
我从你推送到一个远程裸repo的时候认出来了,你有一个post-receive钩子,它也说"Already on master";但它确实将文件部署到工作树(由于-f
(force)标志,我认为)
那么我怎样才能再次签出相同的分支到工作树,使它被"刷新"?新内容?
顺便说一下,如果我在裸回购中做git worktree list
,它指向裸回购并显示(bare)
,我想应该是这样的。
编辑
工作树文件夹最初有一个。git目录,但我删除了它-这是问题吗?我在想,我只需要裸露的repo和工作树内没有repo ?
编辑-问题消失了,一定是什么错误(?)
这可能不是一个问题,因为它现在开始工作了,所以可能是我犯了什么错误。
我新建了一个"工作树"文件夹(从裸repo克隆,删除了远程和.git文件夹)。然后再次尝试该命令,但首先添加一个指向"工作树"的远程url,然后从"repo 1"推送一个更改。到裸回购。现在在裸repo中,当我执行git --work-tree=%WT% checkout -f master
时,它显示为'Already on 'master'
,但文件在工作树文件夹中更新了。所以我认为这是因为远程url,但在删除(git remote remove origin
)后,checkout命令仍然有效。
所以我最初一定是犯了什么错误(不确定是什么)。
(如何创建工作树也无关紧要,因为我再次创建了一个新的工作树文件夹,并手动添加了一些随机文件,命令仍然有效,更新文件)
使用git worktree add
如果你想创建附属于裸repo的工作树,你需要使用git worktree add
命令,就像你在一个普通的沙箱中一样。
git worktree add <pathtoworktree> master
那么你可以在工作树或裸repo中进行Git操作。
例如:
cd bare-repo
git --work-tree=<pathtoworktree> status
等价于:
cd <pathtoworktree>
git status
和所有其他Git操作,如签出,提交和诸如此类的相同。
然后git worktree list
将显示(bare)
的裸repo路径和当前签出提交和分支的工作树路径。
可选-直接克隆
您也可以将裸repo视为位于远程服务器上:
cd sandboxes
git clone <path-to-bare-repo>
,这将创建一个新的沙盒,你可以以正常的方式使用,它将从你的裸repo中推送和拉取。
个人观点
当这个工作树工作时,我实际上只是将本地裸repo视为远程并克隆它。
使用工作树更有效,因为它们共享Git文件夹的内容,但我个人发现,当我看到我的沙箱集合时,如果一些沙箱连接到其他沙箱,它会更令人困惑。我喜欢能够在不影响任何其他沙盒的情况下清除任何沙盒,而工作树意味着当我这样做时,我必须注意潜在的连接。
我宁愿只有副本,除非repo非常大,我需要工作树提供的优化。(例如,如果我在Linux内核上工作,是的,我会使用工作树!)