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
posted @ 2022-08-20 14:05  QIYUEXIN  阅读(163)  评论(0编辑  收藏  举报