worktree的路径的文件夹自己重命名后发现没有git
1. worktree
title: worktree的路径的文件夹自己重命名(修改名称)后发现没有git了
keyword: git worktree repair prune
快速方法
问题:父级文件夹 KBV3NC
改为 kbscan
导致的worktree失败,可以修改worktree路径下的.git
文件,立马就好了:
gitdir: H:/XXX/project/keyboard/kbscan/main/.git/worktrees/KBNC-A02
但是这样以来,主git会找不到原来的worktree,还以为是删除了:
$ git worktree list
H:/XXX/project/keyboard/kbscan/main 407c6f9 [main]
H:/XXX/project/keyboard/KBV3NC/KBNC-A02 407c6f9 [dev] prunable
这时,只要对应的worktree的路径下repair下就可以了:
$ git worktree repair
repair: gitdir incorrect: H:/XXX/project/keyboard/kbscan/main/.git/worktrees/KBNC-A02/gitdir
$ git worktree list
H:/XXX/project/keyboard/kbscan/main 407c6f9 [main]
H:/XXX/project/keyboard/kbscan/KBNC-A02 407c6f9 [dev]
why worktree?
假如你当前有个正在开发的feature,而现在反馈有个hoxfix需要紧急处理,但是我当前的feature也没有写完,并且也不想提交,那么你可以:
- git statsh: 将当前工作区的文件保持下来,等完成后再git stash pop即可;
- 但是git stash有个问题,你stash之后为了恢复到hoxfix的版本需要一顿操作,完了之后你还得再回来,很不方便;并且,如果你想双开两个路径的话这个是实现不了的。
多开工作区,但是git记录只有一份。这时可以使用git worktree
来实现,简单说就是你可以指定commit记录的任意一个版本复制到一个新的文件夹里,然后你可以在这个文件夹完成你需要的操作;但是由于多开的路径和原路径下的.git实际上是一个,所以你做的修改很方便就能同步,剩下的问题就只有merge的事情了。
在worktree的路径下是有个.git
的文件的,而非文件夹,里面记录这自己的来自哪里和是谁
$ cat .git
gitdir: H:/XXX/project/keyboard/KBV3NC/main/.git/worktrees/KBNC-A02
worktree应用场景:
- 我有一个dev分支,平时就是升级下业务逻辑代码,作为我的主路径使用。
- 我还有一个feature分支,但是这里我想修改底层的驱动文件,这里并不是业务逻辑的feature,在完全测试之前我不想发布;这个就可以分离出去。
- 我有一个专机版本的软件,由于配置环境很麻烦或是时间很长,我不想每次都花这个时间;这个可以分离出去。
有了worktree我就可以省去git之间各种切换的问题,牺牲了硬盘空间(其实和你copy一份出来是一样的)得到了便捷。
1.1. worktree prune
这个会删除已经失效的worktree,比如你自己手动把一个worktree的工程文件给删了,在list时就会提示prunable。意思是说当前.git记录里有main这个worktree,但是实际上找不到这个文件夹了,提示你可以清除。
$ git worktree list
H:/XXX/project/keyboard/KBV3NC/XXX-EVAL-V1.1 5ab1178 [feat/f330]
H:/XXX/project/keyboard/KBV7NC/main 407c6f9 [main] prunable
$ git worktree prune
$ git worktree list
H:/XXX/project/keyboard/KBV3NC/XXX-EVAL-V1.1 5ab1178 [feat/f330]
.git\worktrees\main\gitdir
1.2. worktree repair
自己手贱了点,把.git的父级目录名由原来的KBV7的文件夹改成了KBV3,结果进入KBNC-A02路径下发现没有.git提示了:
$ git worktree list
H:/XXX/project/keyboard/KBV3NC/XXX-EVAL-V1.1 5ab1178 [feat/f330]
H:/XXX/project/keyboard/KBV7NC/KBNC-A02 407c6f9 [dev] prunable
H:/XXX/project/keyboard/KBV7NC/main 407c6f9 [main] prunable
$ cd ../KBNC-A02
$ git status
fatal: not a git repository: H:/XXX/project/keyboard/KBV7NC/XXX-EVAL-V1.1/.git/worktrees/KBNC-A02
我一看就知道了,路径不对嘛,改了不就行了。然后我就很聪明地,修改了文件.git\worktrees\main\gitdir
内的路径,觉得这下稳了,毕竟list的信息都对了。
$ git worktree list
H:/XXX/project/keyboard/KBV3NC/XXX-EVAL-V1.1 5ab1178 [feat/f330]
H:/XXX/project/keyboard/KBV3NC/KBNC-A02 407c6f9 [dev]
H:/XXX/project/keyboard/KBV3NC/main 407c6f9 [main]
结果,还是不行;实际上,只要再加上一句既可以:
$ git worktree repair
repair: .git file broken: H:/XXX/project/keyboard/KBV3NC/KBNC-A02
$ cd ../KBNC-A02
$ git status
On branch dev
nothing to commit, working tree clean