当前位置: 首页 > 后端技术 > Java

接上一篇:GitWorktree的高级使用,爽多了

时间:2023-04-01 20:17:15 Java

前言上一篇GitWorktree大法真香,给大家展示gitworktree如何帮我同时在多个分支上工作,不影响每个其他。但是创建worktree的目录位置不在当前项目下。总感觉创建的worktree不属于当前项目。这对于有磁盘管理强迫症的我来说是非常难受的。今天给大家介绍一个高级用法来解决这个痛点准备知识在使用高级用法之前,你需要了解一点裸repo知识,下面就从你熟悉的命令开始gitinitgitclonehttps://github.com/FraserYu/amend-crash-demo.git这两个命令会生成一个non-barerepo。我们通常在这样的回购协议中进行日常工作。您可以在此处添加/提交/拉取/推送。生成barerepo也很简单,只需要使用上面两条命令在gitinit的基础上加上--bare参数--baregitclone--barehttps://github.com/FraserYu/amend-crash-demo.git执行这两个clone命令,查看文件内容。你会看到不同之处。barerepo只包含Git相关的信息,不包含我们实际的项目文件(.java/.js/.py),而non-barerepo包含我们所有的信息。barerepo名称默认包含一个.git后缀,正好证明了第一点barerepo中不存在.git文件夹,导致无法像non-bare一样add/commit/pull/push回购。看到这里,你可能会觉得barerepo只是一个Gitshell文件夹,没什么用。事实上,并非如此。由于barerepo的这些特性(不可更改),可以避免repo的内容被搞乱,所以可以作为私有的中心化repo。一张图解释一下,其实是这样的注:有兴趣的可以按照下面的命令在本地试验整个过程:user@server:$~gitinit--barename_to_repo.gituser@machine1:$~gitcloneuser@server:/path/to/repo/name_to_repo.git.user@machine1:$~cdname_to_repouser@machine1:$~touchREADMEuser@machine1:$~echo"Helloworld">>READMEuser@machine1:$~gitaddREADMEuser@machine1:$~gitcommit-m"AddingaREADME"user@machine1:$~gitpushoriginmasteruser@server:$~ls/path/to/repo/name_to_repo.git/branches/config描述HEADhooks/info/objects/refs/user@machine2:$~gitcloneuser@server:/path/to/repo/name_to_repo.git.user@machine2:$~lsname_to_repo.git/READMEuser@machine2:$~catREADMEHelloworld实验结果是:machine1下无论怎么push文件,barerepo中都没有你push的文件,只有Git相关信息。但是当machine2克隆最新的repo时,你可以看到machine1推送的文件。这就是Git的魔力所在。Barerepo将在此处进行解释。接下来继续上一篇关于GitWorktree大法真香的文章,利用barerepo的特性来优化同时在多个分支上工作的做法。calledamend-crash-demo)创建一个单独的文件夹,cd进去mkdiramend-crash-democdamend-crash-demo接下来,以bare的形式克隆项目代码,并将内容克隆到.bare文件夹中:gitclone--baregit@github.com:FraserYu/amend-crash-demo.git.bare我们还需要在当前目录下创建一个.git文件,文件内容以形式指向我们的.bare文件夹gitdir的(如果不懂gitdir的意思,请回头看Git工作树大法真祥)echo"gitdir:./.bare">.git然后我们需要编辑.bare/config文件,修改[的内容remote"origin"]和下面的内容保持一致(即增加第6行),这样可以保证我们创建的是worktreeswitchbranch,可以显示正确的分支名vim.bare/config#----------------------------------------------[远程“来源”]url=git@github.com:FraserYu/amend-crash-demo.gitfetch=+refs/heads/*:refs/remotes/origin/*接下来我们可以创建一个工作树,首先我们需要为主分支创建一个工作树,因为主分支HEAD指向的commit-ish是您创建的其他工作树commit-ishgitworktreeaddmain#------------------------------Preparingworktree(checkingout'main')HEAD现在位于82b8711addmainfile通常我们不会直接在主分支上工作,而是创建其他类型的分支并继续创建一个名为feature/JIRA234-feature3的worktreegitworktreeadd-b"feature/JIRA234-feature3"feature3#-------------------------------------------------准备工作树(新分支'feature/JIRA234-feature3')HEADisnowat82b8711addmainfile查看当前文件夹的内容,你会发现只有main和feature3两个文件夹(因为.bare和.git是隐藏文件夹/文件),这样对吗?很清爽?ls-l#------------------------------------------总计0drwxr-xr-x10rgyb员工320Nov2321:44feature3drwxr-xr-x10rgyb员工320Nov2321:36mainls-al#--------------------------------------------总计8drwxr-xr-x6rgyb员工19211月23日21:44.drwxr-xr-x3rgyb员工9611月23日21:14..drwxr-xr-x12rgyb员工384Nov2321:36.bare-rw-r--r--1rgyb员工11Nov2321:29.gitdrwxr-xr-x10rgyb员工320Nov2321:44feature3drwxr-xr-x10rgybstaff320Nov2321:36main然后就可以在我们的各个分支上自由add/commit/pull/push,互不影响,运行echo"feature3development">feature3.yamlgitaddfeature3.yamlgitcommit-m"feat:[JIRA234-feature3]feature3development"#----------------------------------------------------------------[feature/JIRA234-feature3aeaac94]壮举:[JIRA234-feature3]feature3development1filechanged,1insertion(+)createmode100644feature3.yamlgitpush--set-upstreamoriginfeature/JIRA234-feature3通过上一篇worktree的四个命令,多分支协同开发不再是问题了:gitworktreeaddgitworktreelist#------------------------------------------------------------------------------------------/Users/rgyb/Documents/projects/amend-crash-demo/.bare(裸)/Users/rgyb/Documents/projects/amend-crash-demo/feature3aeaac94[feature/JIRA234-feature3]/Users/rgyb/Documents/projects/amend-crash-demo/main82b8711[main]gitworktreeremovegitworktreeprune总结利用barerepo的特性,我们可以非常整齐的管理所有只在当前项目目录下的worktrees,Multi-分支协同开发,像这样:.└──amend-crash-demo├──feature3│├──README.md│├──config.yaml│├──feat1.txt│├──feature3.yaml│├──file1.yaml│├──hotfix.yaml│├──main.properties│└──main.yaml└──main├──README.md├──config.yaml├──feat1.txt├──file1.yaml├──hotfix.yaml├──main.properties└──main.yaml3个目录,15个文件如果你有磁盘管理强迫症,这个绝对是个好办法。如果想更好的理解整个过程,需要在操作本文命令的同时查看Git相关的文件信息。如有问题,请参考留言区https://www.blopig.com/blog/2...https://lists.mcs.anl.gov/pip...https://www.saintsjd.com/2011...https://infrequently.org/2021...https://morgan.cugerone.com/b...日工一兵|原创