1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2017年6月10日

#300#git-repository

MIT 许可证

34KB
555

git-subset

Build Status Build status

这是一个用于过滤 Git 仓库中白名单文件和目录的工具。它的作用范围比 git filter-branch 更窄,但速度 显著 更快。

为什么?

这个工具是为了限制对一个非常大的专有代码库的访问(出于安全原因)。也就是说,代码库 A 中的 master 分支被过滤到代码库 B 中,而只有访问 B 的人只能看到真实代码库 A 的一小部分。

用法

$ git-subset --help
USAGE:
    git-subset [FLAGS] [OPTIONS] --branch <branch> [--] [revspec]

FLAGS:
    -f, --force      Overwrites the branch name if it exists.
    -h, --help       Prints help information
        --nomap      Does not use the saved map. Useful for profiling purposes.
    -q, --quiet      Don't print as much progress.
    -V, --version    Prints version information

OPTIONS:
    -b, --branch <branch>              Name of the branch to create on the rewritten commits.
        --filter-file <filter-file>    Path to the file containing paths to keep.
    -p, --path <path>...               Path to include. Can be specified multiple times.
    -r, --repo <repo>                  Path to the repository. Defaults to the current directory. [default: .]

ARGS:
    <revspec>    The ref to filter from. [default: HEAD]

假设示例

假设我们想创建 Linux 源树的子集,并有一个我们想要保留的文件和文件夹列表

$ cat linux.filter
README
COPYING
Makefile
include/
fs/btrfs/

现在,克隆 Linux 内核(或另一个不是那么 的代码库)

$ git clone https://github.com/torvalds/linux.git

10 个小时后...

$ cd linux

现在,要过滤掉不在 linux.filter 中列出的所有内容。(准备好享受超快的速度吧!)

$ git-subtree --filter-file ../linux.filter --branch new-master
Getting list of commits...
Rewriting 4327da054142f4dbf74615918b71441d95025bad (678123/678123) - 100%
Branch 'new-master' created.

在我的测试机器上,使用 SSD,这个操作在约 3 分钟 内处理了 678,123 个提交。这比 git filter-branch 快得多。我们只能说,编写这个工具可能比让 git filter-branch 完成运行所需的时间还少。

在拉取最新更改后再次运行它...

$ git pull
$ git-subtree --filter-file ../linux.filter --branch new-master --force

...大约需要 20 秒,因为从之前的运行中缓存的旧提交哈希到新提交哈希的映射已经存在(使用 --nomap 禁用此功能)。

现在,新的提交历史记录在 new-master 分支中,它只包含我们指定的文件和文件夹的历史记录

$ git ls-tree new-master
100644 blob ca442d313d86dc67e0a2e5d584b465bd382cbf5c    COPYING
100644 blob 470bd4d9513ac42eb164cb4513300966a726fa37    Makefile
100644 blob b2ba4aaa3a71046653599aa0b3798b211a2c0d30    README
040000 tree 248cb042ad04f4b6d90a876b7ca35d1617de1e46    fs
040000 tree d3ba01442799c0b5169cc3daeb6ab7da150f47dd    include

new-master 可以然后推送到一个新的仓库,其中只包含我们想要的文件和文件夹的历史记录。

  • BFG Repo Cleaner.

    这个工具类似,但功能不完全相同。BFG 在过滤特定文件方面更有用,而不是在白名单文件路径方面。

  • GitRocketFilter.

    GitRocketFilter 可以做这个工具能做的一切(更多!),但速度较慢。虽然 GitRocketFilter 更通用,但 git-subset 是为非常具体的一个用例设计的:创建代码库的子集。因此,git-subset 可以非常积极地避免工作。

许可证

MIT 许可证

感谢

本工具是在环境系统研究学院(Esri)内部开发的,他们慷慨地允许我保留版权并将其作为开源软件发布。

依赖项

~9.5MB
~242K SLoC