4 个版本

0.1.3 2021 年 11 月 24 日
0.1.2 2020 年 5 月 13 日
0.1.1 2020 年 4 月 19 日
0.1.0 2020 年 4 月 18 日

#485 in 配置

48 每月下载量

Apache-2.0

175KB
4.5K SLoC

Rust 3.5K SLoC // 0.0% comments Zsh 458 SLoC BASH 307 SLoC // 0.0% comments

Repo

Continuous Integration Dependabot Crates.io Apachie 2.0

Repo 是一个用 Rust 编写的命令行仓库管理工具。使用 repo 跟踪您的远程仓库并管理您的开发空间。

demo

目录

点击此处显示

安装

使用 cargo 从 crates.io 安装 repo 的最新版本。如果您还没有设置 Rust 环境,请查看 Rust 书籍 的设置章节。

cargo install repo-cli

这将安装 repo 到您的默认 cargo 路径 $CARGO_HOME/bin/repo。一旦 repo 在您的路径中,需要引入 work 辅助函数和完成功能,以便让 repo 更改您的 shell 的当前工作目录。work 命令具有 fzf 集成。如果您已安装 fzf,则将 --fzf 选项添加到 init

Bash

# ~/.bashrc
[ -x "$(command -v repo)" ] && eval "$(repo init bash)"

# With `fzf` integration
[ -x "$(command -v repo)" ] && {
    [ -x "$(command -v fzf)" ] && eval "$(repo init bash --fzf)" || eval "$(repo init bash)"
}

Zsh

# ~/.zshrc
[ -x "$(command -v repo)" ] && eval "$(repo init zsh)"

# With `fzf` integration
[ -x "$(command -v repo)" ] && {
    [ -x "$(command -v fzf)" ] && eval "$(repo init zsh --fzf)" || eval "$(repo init zsh)"
}

Fish

# ~/.config/fish/config.conf
test -x $(command -v repo) && repo init fish | source

# With `fzf` integration
test -x $(command -v repo) && {
    test -x $(command -v fzf) && repo init fish --fzf | source || repo init fish | source
}

快速开始

# Track a new remote repository with repo
repo add edeneast/repo

# Create a tag that will repositories into a folk folder
repo tag add fork --path fork --tag fork

# Add your fork of a project
repo add edeneast/cargo --remote 'upstream,rust-lang/cargo' --path 'forks'

# Update workspace by pulling from remote
repo update

# Execute command on all repos. This gets the behind/ahead of a branch relative to its origin
repo foreach 'b=$(git rev-parse --abbrev-ref HEAD) ; git rev-list --left-right --count origin/$b...$b'

# Check if all forks can be fast-forward merged with upstream
repo foreach -t fork 'git merge-base --is-ancestor upstream/master master ; echo $?'

# Run the work command to cd into the repository folder in the workspace
work repo

# Not sure about something... Check the help
repo help

用法

配置文件

Repo 将其信息存储在配置文件夹中。Repo 称这些位置为缓存。Repo 使用两种不同的缓存,全局和本地。

位置类型 默认路径 环境覆盖
全局 $XDG_CONFIG_HOME/repo $REPO_CONFIG_PATH
本地 $XDG_DATA_HOME/repo $REPO_LOCAL_PATH

根据您的操作系统,XDG_CONFIG_HOMEXDG_DATA_HOME 的定义可能不同。查看链接以查看您 os 的默认值。

与 git 允许您具有全局和本地配置一样,repo 允许相同的灵活性。这意味着您可以将全局配置提交到您的版本化配置文件中,并保存任何仅在本地机器上更改的内容。本地缓存将覆盖全局缓存中的任何内容。这意味着您可以在本地配置中定义诸如 root 工作区路径之类的项,并将全局设置的覆盖。

在本地配置中使用配置的包含和排除标签过滤器,您可以确保可以对具有标签的某个仓库进行操作,或者反之,您可以排除包含标签的任何仓库。当您在工作机器上使用个人dotfiles时,这非常有用。也许您想使用仓库来管理您内部工作的仓库,并希望过滤掉您的个人仓库,以便它们在工作机器上不可访问。您可以在所有个人仓库上添加一个personal标签,并在本地工作配置缓存中排除该标签。这将过滤掉您在工作机器上的所有个人仓库,确保您不能在工作机器上拉取任何内容。

示例

# personal computer
repo tag add personal # Add a marker tag to denote that this is a personal repo
repo add my-github/project --tag personal # Defaults to the global config cache
dotfiles add $REPO_CONFIG_PATH # Commit global config to dotfiles
dotfiles commit -m "Add global repo config cachce"

# work machine
repo add https://internal-host.com/org/work --local # Save work to local machine config cache
repo config exclude personal --local # Set repo to exclude repos with personal tag on work machine
repo list # Will only contain the work repo as our personal project is excluded

组件

仓库

一个仓库代表一个托管在某个远程的工程项目。仓库包含一些可以设置的可选值。

名称 类型 描述
路径 路径 相对于工作空间根目录的路径,工作空间中的仓库位置
克隆 字符串 在克隆钩子之后执行命令
工作 字符串 在工作钩子之后执行的命令
命令行界面 布尔值 标志,用于确定仓库是否应该从命令行或libgit2执行git
标签 TagList 与仓库关联的标签名称列表
远程 RemoteList 此仓库的远程列表。注意,origin位于列表的第一位

示例配置文件

# ~/.config/repo/repository/repo.toml
name = 'repo'
path = 'app'
work = 'echo after work hook'
clone = 'echo after clone hook'
tags = [
  'personal',
  'rust',
]

[[remotes]]
name = 'origin'
url = 'https://github.com/edeneast/repo'

[[remotes]]
name = 'upstream'
url = 'https://github.com/upstream-fork/repo'

标签

标签代表可以应用于多个仓库的值。如果您想在多个仓库上重复使用配置值,则创建一个标签。标签也可以仅用于标记一个项目。例如,如果项目是一个个人项目,您可以创建一个空标签并将其与所有个人项目关联起来。然后您可以在您希望有个人项目的工作机器上的配置文件中过滤掉个人标签。

名称 类型 描述
路径 路径 相对于工作空间根目录的路径,工作空间中的仓库位置
克隆 字符串 在克隆钩子之后执行命令
工作 字符串 在工作钩子之后执行的命令
命令行界面 布尔值 标志,用于确定仓库是否应该从命令行或libgit2执行git
优先级 数字 应用标签的顺序。数字越低,优先级越高

示例

# ~/.config/repo/tag/rust.toml
name = 'rust'
path = 'rust'
clone = 'cargo fetch'
work = 'cargo check'
priority = 20

配置

如“dotfiles”部分所述,repo将其配置存储在两个主要配置缓存位置。有全局和本地配置缓存。在这些缓存文件夹位置中有一个config.toml文件。

名称 默认 描述
root $HOME/repo 相对于工作空间根目录的路径,工作空间中的仓库位置。
命令行界面 false 标志,用于确定repo是否应该从命令行或libgit2执行git。
default_host github.com 如果查询仅为'user/repo',则使用默认主机
default_scheme https 生成的url的方案类型:[http, https, git, ssh]
default_ssh_user git 使用ssh方案生成url时的默认ssh用户
shell bash-c 所有外部命令行调用将使用的shell。
include empty 标签列表。具有这些标签的仓库将被显示并操作
exclude empty 标签列表。具有这些标签的仓库将被排除在操作之外

示例

# ~/.config/repo/config.toml
root = '~/dev/workspace'
cli = false
default_host = 'github.com'
default_scheme = 'ssh'
default_ssh_user = 'git'
shell = [
    'bash',
    '-c',
]
include = ['personal']
exclude = ['work']

开发

repo目前正在开发中,并在v1.0版本发布之前可能会更改。您对repo有什么想法?请提交问题或分叉项目并创建一个pull request。

许可

Repo遵循Apache许可证(版本2.0)

有关详细信息,请参阅LICENSE文件。

依赖项

~18–31MB
~564K SLoC