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

worktree的路径的文件夹自己重命名后发现没有git的更多相关文章

  1. 【Java】对文件或文件夹进行重命名

    在Java中,对文件或文件夹进行重命名是很简单的,因为Java的File类已经封装好renameTo的方法. 修改文件或者文件夹的名字都使用这个方法.例如如下的程序: import java.io.* ...

  2. mac文件夹怎么重命名?苹果电脑文件夹重命名快捷键

    windows系统下给文件夹重命名相信很多朋友都很熟悉,那么Mac OS系统怎么给文件重命名呢,相信很多刚刚入手Mac OS系统的亲们都会有次疑问,下面小编告诉你Mac OS系统的文件夹到底要怎样才能 ...

  3. linux复制文件夹、重命名文件夹、删除文件夹

    linux中复制命令为cp(即copy缩写),重命名使用mv命令(即move缩写)来实现,删除命令为rm(即remove缩写). 如果操作对象是单个文件,复制和删除以及重命名很简单,如下: cp a. ...

  4. linux 文件、文件夹的重命名命令

    linux中没有重命名命令,一般用mv替代.如将test更名为testsmv test tests隐藏是mv test .test 说到文件的隐藏,linux下文件如果想隐藏起来只要重命名这个文件就可 ...

  5. python listdir() 中文路径 中文文件夹 乱码 解决方法

    python listdir() 中文路径 中文文件夹 乱码 解决方法 listdir(path)返回的结果的编码似乎和我们提供的 path 参数的编码有关: path = 'd:/test' try ...

  6. 利用Python对文件进行批量重命名

    最近几天工作的内容是对40个项目进行考核,每个项目都需要一个考核评分表,已经有了项目的列表. 如果用常规的方法,需要复制40个文件,并逐个修改,不光工作量大,也容易出错,后期修改也不方便. 于是想到了 ...

  7. 使用bat文件实现批量重命名功能

    在生活中我们总会碰到对大量文件进行重命名操作,这时如果一个一个的,选取文件→右键→重命名→选取文件,这样操作势必会浪费大量时间. 现在小编就告诉大家一个使用bat文件(命令行)的方法,快速对文件进行重 ...

  8. linux下的文件操作——批量重命名

    概述:在日常工作中,我们经常需要对一批文件进行重命名操作,例如将所有的jpg文件改成bnp,将名字中的1改成one,等等.文本主要为你讲解如何实现这些操作 1.删除所有的 .bak 后缀: renam ...

  9. 文件名命工具类(将指定目录下的文件的type类型的文件,进行重命名,命名后的文件将去掉type)

    import java.io.File; /** * <b>function:</b> 文件命名工具类 * @author hoojo * @createDate 2012-5 ...

  10. [转帖]Linux下inotify监控文件夹状态,发生变化后触发rsync同步

    Linux下inotify监控文件夹状态,发生变化后触发rsync同步 https://www.cnblogs.com/fjping0606/p/6114123.html 1.安装工具--inotif ...

随机推荐

  1. Controller-runtime模块

    Controller-runtime框架 Controller-runtime是社区提供的用于开发Controller的框架,包含了各种已封装的代码库.Kubebuilder与Operator SDK ...

  2. WPS中导入endnote插件

    WPS中导入endnote插件 1. 找到 Endnote 插件的目录: D:\Program Files (x86)\EndNote 20\Product-Support\CWYW   2. 把Cw ...

  3. 一款开源、免费、现代化风格的WPF UI控件库 - ModernWpf

    前言 今天大姚给大家分享一款开源(MIT License).免费.现代化风格的WPF UI控件库:ModernWpf. 项目介绍 ModernWpf是一个开源项目,它为 WPF 提供了一组现代化的控件 ...

  4. Android Verified Boot介绍与有关使用

    Android Verified Boot介绍与有关使用 背景 在搞安卓驱动调试的时候,由于不熟悉,导致系统没有按照我预期启动完毕:因此需要注意这一块的东西. 简介 Verified Boot 是 A ...

  5. 【Python】python笔记:时间模块/时间函数

    1.Python时间模块 import time import datetime # 一: time模块 ############## # 1.时间戳 print (time.time()) # 16 ...

  6. html2canvas 页面截屏

    $(document).ready(function () { $(".example1").on("click", function (event) { va ...

  7. nodejs-mime类型

    mime是一个互联网标准,通过设定它就可以设定文件在浏览器的打开方式. mime使用方法: 使用mime模块查询文件的MIME类型: mime.getType('/path/to/file.txt') ...

  8. 通过canvas计算任意两个颜色的插值

    通过canvas可以协助我们做很多颜色计算的辅助,比如颜色转换,渐变颜色计算. 对于颜色转换,之前写过一篇文章:<通过canvas转换颜色为RGBA格式及性能问题> , 读者可以查阅该篇文 ...

  9. git 更新某个目录或文件

    不多说直接贴代码 更新文件 $ git fetch remote: Counting objects: 8, done. remote: Compressing objects: 100% (3/3) ...

  10. [oeasy]python0135_变量名与下划线_dunder_声明与赋值

    变量定义 回忆上次内容 变量 就是 能变的量 上次研究了 变量标识符的 规则 第一个字符 应该是 字母或下划线 合法的标识符可以包括 大小写字母 数字 下划线     还研究了字符串(str)的函数 ...