#git-repository #git #gitlab #github #provider #workspace #directory

应用程序 git-workspace

管理和更新来自多个提供者的个人和工作Git仓库

35个版本 (10个稳定版本)

1.5.0 2024年8月5日
1.4.0 2023年11月7日
1.3.0 2023年9月7日
1.2.1 2023年3月5日
0.4.1 2019年11月24日

#25 in 开发工具

Download history 1/week @ 2024-06-29 70/week @ 2024-07-06 62/week @ 2024-07-27 125/week @ 2024-08-03 12/week @ 2024-08-10

每月 199 次下载

MITCC-PDDC 许可证

1MB
48K SLoC

GraphQL 47K SLoC Rust 1K SLoC // 0.1% comments Shell 3 SLoC // 0.4% comments

git-workspace 🚀

Crates.io Actions Status

如果你的公司有很多仓库,而且你的工作需要在这些仓库之间跳转,那么 git-workspace 可以通过以下方式节省你一些时间

  • 轻松地将你的项目目录与 GithubGitlab.comGitlab自托管 同步 🔧
  • 保持项目名称一致,并位于正确的路径下 📁
  • 自动设置分叉的上游 ⚡
  • 将删除的仓库移动到存档目录 💾
  • 让你能够立即访问任何仓库 :shipit
  • 并行地对所有项目执行 git fetch :godmode

这可能听起来没什么用,但“登录到你的Git提供程序,浏览到项目,复制克隆URL,设计一个合适的路径来克隆它”的舞蹈可能是一个很大的减速。这里唯一的明显解决方案是花比你在一生中花在做这件事上更多的时间,用Rust编写一个工具来为你做这件事。

目录

安装 💿

Homebrew (MacOS + Linux)

brewinstall git-workspace

Nix (MacOS + Linux)

nix-shell

nix-shell -p git-workspace

nix shell (Flakes)

nix shell nixpkgs#git-workspace

home-manager (home.nix)

{
  home.packages = with pkgs; [
    git-workspace
  ];
}

NixOS (configuration.nix)

{
  environment.systemPackages = with pkgs; [
    git-workspace
  ];
}

AUR (ArchLinux)

paru-S git-workspace

二进制文件 (Windows)

GitHub发行页面下载最新版本。解压并将其移动到你的 PATH 目录。

Cargo

不要这样做,这非常慢:cargo install git-workspace

用法 🎷

Git真的很烦人,并且篡改了子命令的--help标志。因此,要获取帮助,请使用git-workspace --help,而不是git workspace --help

$ git-workspace --help
git-workspace 1.1.0
Tom Forbes <[email protected]>
Manage and update personal and work git repos from multiple providers

USAGE:
    git-workspace --workspace <workspace> <SUBCOMMAND>

FLAGS:
    -h, --help
            Prints help information

    -V, --version
            Prints version information


OPTIONS:
    -w, --workspace <workspace>
             [env: GIT_WORKSPACE=/Users/tom/PycharmProjects/]


SUBCOMMANDS:
    add                Add a provider to the configuration
    archive            Archive repositories that don't exist in the workspace anymore
    fetch              Fetch new commits for all repositories in the workspace
    help               Prints this message or the help of the given subcommand(s)
    list               List all repositories in the workspace
    lock               Fetch all repositories from configured providers and write the lockfile
    run                Run a git command in all repositories
    switch-and-pull    Pull new commits on the primary branch for all repositories in the workspace
    update             Update the workspace, removing and adding any repositories as needed

定义你的工作空间

工作空间是git-workspace将为您管理的目录,用您提供者的项目填充它。要配置此设置,只需设置一个指向空目录的GIT_WORKSPACE环境变量。例如

export GIT_WORKSPACE=~/projects

提供者凭证

GitHub和Gitlab都需要个人访问令牌才能访问其GraphQL端点。在此处创建访问令牌

将这些令牌作为GITHUB_TOKENGITLAB_TOKEN导出到您的shell中。

添加提供者

您可以使用git workspace add快速将条目添加到您的workspace.toml

  • 克隆用户或组织的所有GitHub仓库

    • gitworkspace add github[USER OR ORG NAME]
  • 排除特定仓库

    • gitworkspace add github[USER OR ORG NAME] --exclude="foo.*bar$" --exclude="(abc|def)"
  • 从Gitlab克隆命名空间或用户

    • gitworkspace add gitlab gitlab-ce/gitlab-services
  • 从自托管gitlab/github实例克隆

    • gitworkspace add gitlab my-company-group --url=https://internal-gitlab.company.com
    • gitworkspace add github user-or-org-name --url=https://internal-github.company.com/api/graphql

多个配置

Git工作空间将读取您$GIT_WORKSPACE目录下的任何workspace*.toml文件。

更新你的工作空间

运行git workspace update

  1. 从您的提供者获取所有仓库
  2. 克隆任何本地不存在的新仓库
  3. 将任何已删除的仓库移动到$GIT_WORKSPACE/.archived/以供将来参考

获取所有更改

git workspace fetch将在所有项目上运行git fetch

切换项目 🔁

git workspace list将输出您所有项目的名称。您可以将其与任何您希望的工具集成,以便快速搜索和选择仓库。

Fish,与fzf

以下 Fish Shell 段落提供了一个 open-project [search-string] 命令,您可以使用它来搜索和打开项目。它将 git workspace list 命令与 fzf 结合起来,并使用您的 $EDITOR

# ~/.config/fish/functions/open-project.fish
function open-project -d "Open a project"
  set filter "$argv"
  set chosen_project (git workspace list | fzf -q "$filter")
  if string length -q -- $chosen_project
     $EDITOR $GIT_WORKSPACE/$chosen_project
     pushd $GIT_WORKSPACE/$chosen_project
  end
end

Zsh,搭配 fzf

function project {
	local filter="$@"
	local chosen_project=$(git workspace list | fzf -q "$filter")
	if [[ -n $chosen_project ]]; then
		pushd "$GIT_WORKSPACE/$chosen_project"
	fi
}

Bash,搭配 fzf

由用户 (@kreyren:github.com) 贡献

#!/bin/sh
# shellcheck shell=sh # Written to comply with IEEE Std 1003.1-2017 for standard POSIX environment

###! # WorkSPace (wsp)
###! Switches to specified git-workspace project directory
###! - Requires git and fzf
wsp() {
    # Check for required non-standard commands
    for command in ${FZF:-"fzf"} ${GIT:-"git"}; do
        ${COMMAND:-"command"} -v "$command" || { ${PRINTF:-"printf"} "FATAL: %s\\n" "Command '$command' is not executable"; ${EXIT:-"exit"} 127 ;}
    done
    
    # shellcheck disable=SC2086 # Harmless warning about missing double-quotes that are not expected to allow parsing multiple arguments
    wsp_path="${1:-"${GTT_WORKSPACE:-"$PWD"}/$(${GIT:-"git"} workspace list | ${FZF:-"fzf"} ${fzf_arg:-"-q"} "$@")"}" # Path to the git workspace directory
    
    # Change directory
    ${CD:-"cd"} "$wsp_path" || { printf "FATAL: %s\\n" "Unable to change directory to '$wsp_path'";}
}

请考虑使用 shfmt 来优化文件大小。

贡献 🐛

这是我第一个“真正的”Rust项目。如果您对Rust有经验,可能会对代码感到不适,但任何有助于我改进的反馈都将非常受感激!

如果您想贡献,那就去吧。cargo install 应该能让您准备就绪。请注意:目前没有测试 💣。我用 Github Actions 运行集成测试,但这就足够了。它在我的待办事项列表上,我保证 ™️。

依赖项

~20–31MB
~530K SLoC