如何优雅的管理本地代码仓库?

lxf2023-05-13 01:19:41

对于如何管理本地的代码仓库,每个人的习惯和需求不尽相同,因此存在多种管理本地代码仓库的方案。

下面介绍两种比较常见的方案:

  1. 平铺

平铺是指将所有的代码仓库都存放在一个固定的目录下或桌面上,这种方式适合于代码仓库数量较少、项目之间关联性不强的情况。

优点:

  • 管理方便,易于查找和备份;

缺点:

  • 存在同名仓库时,需要做特殊处理
  • 仓库数量过多时,肉眼无法快速查找
  • 时间久远后,不太记得某个仓库的作用
  1. 结构化

结构化是以产品线、公司&个人等维度建立对应的目录来管理代码仓库,这种方式适合于代码仓库数量较多、项目之间关联性较强的情况。

优点:

  • 结构清晰,易于管理和查找;

缺点:

  • 管理成本较高,需要对目录结构进行规划和维护

那么有没有一种通用的解决方案呢?经过调研和实际体验 Projj 是一个不错的方案,能够优雅的管理本地仓库。

Projj 可以把代码管理成一个非常清晰的结构({root}/{domain}/{group}/{repository}),如下图所示:

$BASE
|- github.com
|  `- popomore
|     `- projj
`- gitlab.com
   `- popomore
      `- projj

经过这样的拆分,本地仓库的结构划分非常清晰,在保证本地目录一致性的同时,也很直观地解决了同名仓库的问题。组织名与项目呈父子级的结构也有助于我们记忆某些不常用的包的功能与定位,并顺便解决了项目过多寻找不便的情况。

以下是我选择这个方案的几个理由:

  • 降低增删本地仓库成本(切换目录、仓库命名等),可以在任意目录操作。
  • 保持与远端仓库结构一致
  • 能够使用 Hook 对仓库做一些特定的操作(比如删除所有仓库的 node_modules 目录)

安装

这里选用 pnpm 安装,也可选择 npm、yarn 安装

pnpm i projj projj-hooks -g

配置

  1. 初始化
projj init // 目录 ~/projj 
  1. 修改配置文件

可配置项如下:

{
  // 基本目录
  base: string[] | string;
  // 钩子指令
  hooks: {
    // 在 `projj add` 命令之前运行
    preadd: string;
    // 在 `projj add` 命令之后运行
    postadd: string;
    [key: string]: string;
  };
  change_directory: boolean;
  alias: Record<string, string>;
  // Hook 配置
  [key: string]: any;
}

编辑 ~/projj/config.json,我的配置如下(记得把 name 和 email 改成自己的)。

{
  "base": [
    "/Users/wangxingkang/Documents/Code"
  ],
  "hooks": {
    "postadd": "projj_git_config_user"
  },
  "postadd": {
    "github.com": {
      "name": "wangxingkang",
      "email": "xxxxxx"
    },
    "gitlab.sensoro.com": {
      "name": "wangxingkang",
      "email": "xxxxxx"
    }
  },
  "alias": {
    "github://": "https://github.com/"
  }
}

使用

对于本地已经存在的仓库想要 projj 接管的话,只需要使用如下命令即可。

projj import ~/project

添加仓库

projj add [repo]

删除仓库

projj remove [repo]

查找仓库

projj find [repo]

同步仓库

检查 cache.json 中的仓库是否存在,如果不存在则会从缓存中移除。

projj sync

运行 Hook

运行官方预设 Hook 或自定义 Hook

  • projj run [hook] 在当前目录执行该操作
  • projj runall [hook] 在 cache.json 中记录的所有仓库中都执行该操作

Hook

projj-hooks 提供了如下Hooks

clean

清除 node_modules 和被 Git 忽略的文件

{
  "hooks": {
    "clean": "projj_clean"
  },
  "clean": {
    "node_modules": true,
    "git": true
  }
}

git_config_user

添加 user.name、user.email 和 user.signingkey 用于 Git 配置。

{
  "hooks": {
    "git_config_user": "projj_git_config_user"
  },
  "git_config_user": {
    "github.com": {
      "name": "your name",
      "email": "your email",
      "signingkey": "your signingkey"
    }
  }
}

dirty

检查 Git 仓库是否有未提交的更改。

{
  "hooks": {
    "dirty": "projj_dirty"
  }
}

vscode_project_manager

vscode-project-manager

这将从所有 projj 仓库添加到 projects.json 文件。

{
  "hooks": {
    "vscode_project_manager": "projj_vscode_project_manager"
  },
  "atom_project": {
    "setting": "/path/to/projects.json"
  }
}

自定义 hook

如果官方预设的钩子无法满足需求,projj 也支持自定义 hook 程序。

#!/usr/bin/env node

'use strict';

console.log('自定义 hook');

将此文件添加到 ~/.projj/hooks/custom_hook,并添加执行权限 chmod +x ~/.projj/hooks/custom_hook

{
  "hooks": {
    "custom_hook": "custom_hook"
  }
}

也可使用类似 projj-hooks 的方式发布一个 npm 包,然后全局安装。

本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!