console-helpers / svn-buddy
从命令行控制Subversion仓库工作的简单方法
Requires
- php: ^5.6|>=7.0.8
- ext-json: *
- ext-pdo: *
- ext-simplexml: *
- ext-zlib: *
- aura/sql: ^3.0 || ^4.0 || ^5.0
- console-helpers/console-kit: ^0.3@dev
- console-helpers/db-migration: ^0.1.0
- fiasco/symfony-console-style-markdown: ^1.2
- padraic/humbug_get_contents: ^1.0
- padraic/phar-updater: dev-use-curl
- symfony/process: ^3.4 || ^4.0 || ^5.0
Requires (Dev)
- aik099/coding-standard: dev-master
- console-helpers/prophecy-phpunit: ^2.0@dev
- phpspec/prophecy: ^1.10
- yoast/phpunit-polyfills: ^2.0
README
SVN-Buddy 是一个命令行工具,旨在极大地简化从命令行执行日常Subversion相关开发任务。
Git 用户也会感到宾至如归,因为使用的术语(命令/选项/参数)受到了Git的启发。
用法
以下描述的几乎每个命令都接受 path
参数来指定工作副本路径。这允许在不使用 cd
切换到每个工作副本的情况下,处理多个工作副本。
“config”(别名“cfg”)命令
此命令允许更改其他命令使用的配置设置。
一些命令(如 merge
、log
、conflicts
和 aggregate
)还使用中心数据存储(位于 ~/.svn-buddy/config.json
文件中)来存储有关工作副本的信息。
- 如果对于给定的工作副本没有存储任何内容,则将使用全局默认设置。
- 如果全局默认设置不存在,则将使用内置默认设置。
- 工作副本和全局设置都是可配置的。
使用工作副本URL来关联设置值和工作副本。这种方法允许在将工作副本移动到磁盘上的不同位置时保留设置值。
参数
path
- 工作副本路径 [默认: “.
”]
选项
-s
,--show=SETTING
- 仅显示给定的(而不是所有)设置值-e
,--edit=SETTING
- 使用交互式编辑器更改设置值-d
,--delete=SETTING
- 删除设置-g
,--global
- 在全局设置上操作而不是在工作副本特定设置上操作
示例
您可以将 --global
选项添加到以下示例中的任何示例中,以在全局设置上操作而不是在工作副本设置上操作。
svn-buddy.phar config
按命令分组显示当前工作副本中所有设置的值
svn-buddy.phar config --show merge.source-url
显示 merge.source-url
设置的值
svn-buddy.phar config --edit merge.source-url
使用交互式编辑器更改 merge.source-url
设置的值。
svn-buddy.phar config --delete merge.source-url
删除 merge.source-url
设置。
“log”命令
此命令显示一组修订版本的日志消息。
与 svn log
命令相比,此命令真正闪亮的是:
- 速度 - 存储在本地仓库的修订信息被缓存,因此访问速度非常快
- 修订版本搜索 - 修订版本不仅可以通过路径和编号查找,还可以使用引用(例如
trunk
或tags/stable
)和错误编号查找 - 修订版本过滤 - 当找到修订版本时,可以根据其合并状态(已合并、未合并、本身是合并修订版本)进一步过滤修订版本
- 详细的修订版本信息 - 可用不同的信息关于修订版本,可以使用一组内置视图显示:紧凑视图、摘要视图、详细视图、合并冲突预测视图、合并状态视图
只有当可以找到关联的合并修订版本时,才会认为修订版本是已合并的。不幸的是,Subversion 不会在直接路径操作(例如将 tags/stable
替换为 trunk
)上创建合并修订版本,因此使用此命令时受影响的修订版本不会被视为已合并。
每个修订版关联的bug通过解析项目最后更改引用根目录下的bugtraq:logregex Subversion属性来确定。假设Subversion项目不会移动到不同的issue tracker,因此bugtraq:logregex
Subversion属性的值将永远缓存。
在修订版列表中,工作副本的修订版行以粗体显示,以方便识别过时的工作副本。
参数
path
- 工作副本路径或URL [默认: ".
"]
选项
-r
,--revisions=REVISIONS
- 修订版(-s)和/或修订版范围(-s)的列表,例如53324
,1224-4433
-b
,--bugs=BUGS
- bug(-s)的列表,例如JRA-1234
,43644
--refs=REFS
- refs的列表,例如trunk
,branches/branch-name
,tags/tag-name
或all
表示所有refs--merges
- 仅显示合并修订版--no-merges
- 隐藏合并修订版--merged
- 仅显示至少合并过一次的修订版--not-merged
- 仅显示未合并的修订版--merged-by=MERGED-BY
- 显示由列表中的修订版(-s)和/或修订版范围(-s)合并的修订版--action=ACTION
- 显示其路径受到指定操作影响的修订版,例如A
,M
,R
,D
--kind=KIND
- 显示其路径与指定类型匹配的修订版,例如dir
或file
--author=AUTHOR
- 显示由指定作者制作的修订版-f
,--with-full-message
- 显示非截断的提交消息-d
,--with-details
- 显示详细的修订版信息,例如受影响的路径-s
,--with-summary
- 显示修订版中添加/更改/删除的路径数量--with-refs
- 显示修订版refs--with-merge-oracle
- 显示修订版中可以导致合并冲突的路径数量--with-merge-status
- 显示影响此修订版的合并修订版--max-count=MAX-COUNT
- 限制输出的修订版数量-a
,--aggregate
- 按bug聚合显示的修订版
配置设置
log.limit
- 可显示的修订版最大数量(默认为10
)log.message-limit
- “日志消息”列的最大宽度(以符号为单位)(默认为68
)log.merge-conflict-regexps
- 用于修订版内路径匹配的正则表达式列表(当使用--with-merge-oracle
选项时用于预测合并冲突)
示例
默认情况下,要显示修订版的引用(例如 trunk
)是从当前工作副本检测到的。为了避免需要保留不同的工作副本,请添加--refs X
(例如 --refs branches/branch-name
)来显示项目指定refs(修订版)的修订版。
可以将所有--with-...
选项组合起来以创建更复杂的视图。
svn-buddy.phar log
显示所有修订版而不进行筛选
- 显示的修订版数量始终限制为
log.limit
配置设置值 - 还显示修订版的总数(当相关时),以指示还有多少修订版没有显示
svn-buddy.phar log --max-count 5
显示所有修订版而不进行筛选,但限制为--max-count
选项值。
svn-buddy.phar log --revisions 10,7,34-36,3
显示3
,7
,10
,34
,35
和36
修订版。可以使用任何修订版(-s)/修订版范围(-s)的组合。
svn-buddy.phar log --bugs JRA-10,6443
显示与JRA-10
和6443
bug相关的修订版。
svn-buddy.phar log --refs branches/5.2.x,releases/5.2.1
显示从branches/5.2.x
和releases/5.2.1
refs检索到的修订版。有效的refs格式为
trunk
branches/branch-name
tags/tag-name
releases/release-name
svn-buddy.phar log --refs all
显示从项目中的所有refs检索到的修订版。
svn-buddy.phar log --action D
显示至少有一个路径(目录或文件)被删除的修订版。
svn-buddy.phar log --kind dir
显示至少有一个受影响的路径是目录的修订版。
svn-buddy.phar log --action D --kind dir
显示修订版本,其中至少有一个受影响的路径是目录,至少有一个路径(目录或文件)已被删除,但这并不保证是同一个路径。
svn-buddy.phar log --merges
仅显示合并修订版本。
svn-buddy.phar log --no-merges
显示所有修订版本,但不是合并修订版本。
svn-buddy.phar log --merged
仅显示合并修订版本。
svn-buddy.phar log --not-merged
显示所有修订版本,但不是合并修订版本。
svn-buddy.phar log --merged-by 12,15-17
- 显示由12、15、16和17修订版本合并的修订版本。
svn-buddy.phar log --with-full-message
在显示的修订版本列表中不会截断日志消息。
svn-buddy.phar log --with-details
显示有关修订版本详细信息。
svn-buddy.phar log --with-summary
--with-details
选项的紧凑替代方案,其中仅显示修订版本中更改的总数,并在单独的列中显示
svn-buddy.phar log --with-refs
显示受每个修订版本影响的引用。
svn-buddy.phar log --with-merge-oracle
显示每个修订版本中的路径在合并时可能会(但不一定)引起冲突的量。
在可以使用合并智星之前,需要指定log.merge-conflict-regexps
配置设置。可以使用以下命令完成此操作
- 全局:
svn-buddy.phar config --edit log.merge-conflict-regexps --global
- 在工作副本中:
svn-buddy.phar config --edit log.merge-conflict-regexps
一旦交互式编辑器打开,请输入用于匹配路径的正则表达式(每行一个),例如#/composer\\.lock$#
与任何子文件夹中的composer.lock
文件匹配。
在上面的图像中有2个修订版本,每个修订版本都包含1个路径(使用上面定义的配置设置检测),可能引起冲突。
svn-buddy.phar log --with-merge-oracle --with-details
显示每个修订版本中更改的路径,同时用红色突出显示可能发生冲突的路径(来自合并智星)。
svn-buddy.phar log --with-merge-status
对于每个显示的修订版本,还显示负责合并它的修订版本(带有合并修订版本引用)。
"合并"命令
此命令将来自另一个项目或同一项目内的引用中的更改合并到工作副本中。
在SVN-Buddy外部执行的合并将自动检测(多亏了内部使用svn mergeinfo
)。
参数
path
- 工作副本路径 [默认: “.
”]
选项
--source-url=SOURCE-URL
- 合并源URL(绝对或相对)或引用名称,例如branches/branch-name
-r
,--revisions=REVISIONS
- 要合并的修订版本(-s)和/或修订版本范围(-s)列表,例如53324
,1224-4433
或all
--exclude-revisions=EXCLUDE-REVISIONS
- 不合并的修订版本(-s)和/或修订版本范围(-s)列表,例如53324
,1224-4433
-b
,--bugs=BUGS
- 要合并的bug(-s)列表,例如JRA-1234
,43644
--exclude-bugs=EXCLUDE-BUGS
- 不合并的bug(-s)列表,例如JRA-1234
,43644
--merges
- 仅显示合并修订版--no-merges
- 隐藏合并修订版-f
,--with-full-message
- 显示非截断的提交消息-d
,--with-details
- 显示详细的修订版信息,例如受影响的路径-s
,--with-summary
- 显示修订版中添加/更改/删除的路径数量--update-revision=UPDATE-REVISION
- 在执行合并之前将工作副本更新到指定的修订版本--auto-commit=AUTO-COMMIT
- 在合并成功后自动执行提交,例如yes
或no
--auto-deploy=AUTO-DEPLOY
- 在合并提交成功后自动执行远程部署,例如yes
或no
--record-only
- 将修订版本标记为已合并,但实际上不合并它们--reverse
- 回滚先前合并的修订版本-a
,--aggregate
- 按bug聚合显示的修订版-p
,--preview
- 预览要合并的修订版本
配置设置
merge.source-url
- 默认的URL用于从该URL合并更改merge.auto-commit
- 在未指定--auto-commit
选项时自动执行合并提交
示例
可以使用以下任一示例与--source-url
选项一起使用,以从该URL合并而不是猜测它。可以使用以下方式指定源URL
- 绝对URL:
svn://domain.com/path/to/project/branches/branch-name
- 相对URL:
^/path/to/project/branches/branch-name
- 引用:
branches/branch-name
或tags/tag-name
或trunk
svn-buddy.phar merge
上述命令执行以下操作
- 仅在未使用
--source-url
选项时
- 检测合并源URL
- 未检测到时,请使用
--source-url
选项手动指定。 - 检测到时,将其存储到
merge.source-url
配置设置中。
- 确定工作副本与检测到的合并源URL之间的未合并修订版本。
- 显示结果(不执行合并)。
- 未合并修订版本/错误数量。
- 前一次合并操作的状态。
- 未合并修订版本列表。
svn-buddy.phar merge --revisions 5,3,77-79
执行上述所有操作,并尝试将指定的修订版本合并到工作副本中。随着合并的进行,svn merge
命令的输出会实时显示给用户(无缓冲)。
逐个合并修订版本,因为
- 结果显示得更快,因为一次合并多个修订版本
- 冲突解决更容易,因为已知道导致冲突的确切修订版本
要合并的指定修订版本将自动按时间顺序排序。
上述命令执行可能有两种结果
- 合并成功 - 没有额外内容,除了显示
svn merge
命令输出 - 合并过程中发生冲突或合并前存在冲突路径 - 显示上述错误屏幕,并将冲突路径存储在
conflicts.recorded-conflicts
配置设置中
错误屏幕显示
svn merge
命令输出(如果已执行)- 冲突路径列表
- 对于每个路径,显示在合并之前影响该冲突路径的未合并修订版本列表
最后一点非常有用,例如,合并更改文件的修订版本,但未合并创建此文件的较早修订版本。
解决合并冲突后,可以重新运行相同的合并命令,无需从 --revisions
选项值中删除已合并的修订版本。
不能与 --bugs
选项一起使用。
svn-buddy.phar merge --revisions all
将合并所有未合并的修订版本。
svn-buddy.phar merge --bugs JRA-4343,3453
将合并与 JRA-4343
和 3453
错误关联的所有修订版本。这在只知道错误编号、错误由多个在不同日期创建的修订版本组成的情况下,将节省大量时间。
- 只知道错误编号的情况下
- 错误由多个在不同日期创建的修订版本组成
不能与 --revisions
选项一起使用。
svn-buddy.phar merge --auto-commit yes
在成功合并后自动运行 svn-buddy.phar commit
命令。覆盖 merge.auto-commit
配置设置值。
svn-buddy.phar merge --auto-commit no
在合并成功后不自动运行 svn-buddy.phar commit
命令。覆盖 merge.auto-commit
配置设置值。
svn-buddy.phar merge --with-full-message
由于在后台使用 log
命令显示未合并修订版本,因此可以将 --with-full-message
选项传递给它,以查看每个修订版本的完整日志消息。
svn-buddy.phar merge --with-details
由于在后台使用 log
命令显示未合并修订版本,因此可以将 --with-details
选项传递给它,以查看受每个未合并修订版本影响的路径。
svn-buddy.phar merge --with-summary
由于在后台使用 log
命令显示未合并修订版本,因此可以将 --with-summary
选项传递给它,以查看受每个未合并修订版本影响的路径的汇总。
svn-buddy.phar merge --update-revision 55
在开始合并之前将工作副本更新到第55个修订版本。可用于分析目的重新播放较旧的合并。
svn-buddy.phar merge --bugs JRA-123 --record-only
将与 JRA-123
错误关联的修订版本标记为已合并(不会更改任何文件)。
svn-buddy.phar merge --revisions 55 --record-only
将第55个修订版本标记为已合并(不会更改任何文件)。
“提交”(别名为“ci”)命令
该命令将您的工作副本中的更改发送到存储库。
参数
path
- 工作副本路径 [默认: “.
”]
选项
--cl
- 仅在所选更改列表的成员上操作--merge-template=MERGE-TEMPLATE
使用此提交的替代合并模板--auto-deploy=AUTO-DEPLOY
- 在成功提交后自动执行远程部署,例如yes
或no
配置设置
commit.merge-template
- 合并提交的日志消息模板(默认为group_by_revision
)
示例
svn-buddy.phar commit
命令工作流程如下
- 在以下情况下自动中止
- 存在未解决的冲突
- 没有路径更改
- 打开交互式编辑器输入提交消息
- 提交消息将自动生成,来源为
- 选定的更改列表名称(当使用
--cl
选项时) - 使用选定的合并模板的合并版本信息(当这是一个合并提交时)
- 冲突路径列表(如果存在冲突,但后来已解决)
- 用户完成修改提交消息后,将显示确认对话框以确保用户确实要执行提交
- 当用户之前同意时,执行提交
自动生成的提交消息如下所示(使用 group_by_revision
合并模板)
Changelist Name
Merging from Trunk to Stable
* r22758: message line 1
message line 2
message line 3
message line 4
* r22796: message line 1
message line 2
message line 3
Conflicts:
* path/to/conflicted-file
描述
Trunk
是合并源 URL 的文件夹名称Stable
是合并目标的文件夹名称(工作副本)22758
和22796
是合并版本message line ...
是合并版本提交消息中的行
svn-buddy.phar commit --cl
与上述相同,但还将
- 询问用户选择更改列表
- 将更改列表名称放入提交消息中
svn-buddy.phar commit --merge-template summary
与上述相同,但将使用 summary
合并模板而不是为此工作副本配置的合并模板。
svn-buddy.phar commit --deploy
在提交执行后或在没有要提交的内容后执行远程部署。
"cleanup" 命令
递归地清理工作副本,删除锁定、恢复未完成操作等。
参数
path
- 工作副本路径 [默认: “.
”]
示例
svn-buddy.phar cleanup
"revert" 命令
恢复原始工作副本文件(撤销大多数本地编辑)。
参数
path
- 工作副本路径 [默认: “.
”]
示例
svn-buddy.phar revert
"update"(别名 "up")命令
将存储库中的更改引入工作副本。
参数
path
- 工作副本路径 [默认: “.
”]
选项
-r
,--revision=REVISION
- 将工作副本更新到指定的修订版本,例如NUMBER
、{DATE}
、HEAD
、BASE
、COMMITTED
、PREV
--ignore-externals
- 忽略外部定义--auto-deploy=AUTO-DEPLOY
- 在成功更新后自动执行本地部署,例如yes
或no
示例
svn-buddy.phar update
更新工作副本。
svn-buddy.phar update --revision 55
将工作副本更新到第 55 个修订版本。
svn-buddy.phar update --ignore-externals
更新工作副本,但不检出外部内容。
svn-buddy.phar update --deploy
在更新执行后或在没有要更新的内容后执行本地部署。
"conflicts"(别名 "cf")命令
管理工作副本中记录的冲突。
参数
path
- 工作副本路径 [默认: “.
”]
选项
-m
,--mode=MODE
- 操作模式,例如show
、add
、replace
、erase
[默认: "show
"]
配置设置
conflicts.recorded-conflicts
- 冲突路径列表(自动维护)
示例
svn-buddy.phar conflicts
显示如下记录冲突的列表
Conflicts:
* conflicted/path/one
* conflicted/path/tow
svn-buddy.phar conflicts --mode show
显示如下记录冲突的列表
Conflicts:
* conflicted/path/one
* conflicted/path/tow
svn-buddy.phar conflicts --mode add
将当前冲突路径(例如在合并或更新后)添加到记录路径列表中。
svn-buddy.phar conflicts --mode replace
将记录路径列表替换为当前冲突路径(例如在合并或更新后)。
svn-buddy.phar conflicts --mode erase
忘记所有记录的冲突路径。
"search" 命令
搜索添加文本到文件或从其中删除文本的版本。
参数
path
- 文件路径keywords
- 搜索关键字
选项
-t
,--match-type=MATCH-TYPE
- 匹配类型,例如first
或last
[默认: "last
"]
示例
svn-buddy.phar search folder/path.php "on testMethod("
查找在 folder/path.php
文件的工作副本中最后一次看到 testMethod
方法的地方。
svn-buddy.phar search folder/path.php "on testMethod(" --match-type last
查找在 folder/path.php
文件的工作副本中最后一次看到 testMethod
方法的地方。
svn-buddy.phar search folder/path.php "on testMethod(" --match-type first
查找在 folder/path.php
文件的工作副本中第一次添加 testMethod
方法的地方。
"aggregate" 命令
在路径上的每个工作副本上顺序运行其他命令。几乎可以以这种方式使用所有其他命令。
参数
sub-command
- 在每个找到的工作副本上执行命令path
- 包含工作副本的文件夹路径 [默认: ".
"]
自己的选项
--ignore-add=IGNORE-ADD
- 将路径添加到忽略目录列表--ignore-remove=IGNORE-REMOVE
- 从忽略目录列表中移除路径--ignore-show
- 显示忽略目录列表
聚合命令选项
-d
,--with-details
- 显示详细的修订版信息,例如受影响的路径-s
,--with-summary
- 显示修订版中添加/更改/删除的路径数量--merges
- 仅显示合并修订版--no-merges
- 隐藏合并修订版--merged
- 仅显示至少合并过一次的修订版--not-merged
- 仅显示未合并的修订版--action=ACTION
- 显示其路径受到指定操作影响的修订版,例如A
,M
,R
,D
--kind=KIND
- 显示其路径与指定类型匹配的修订版,例如dir
或file
--author=AUTHOR
- 显示由指定作者制作的修订版-f
,--with-full-message
- 显示非截断的提交消息--with-refs
- 显示修订版refs--with-merge-oracle
- 显示修订版中可以导致合并冲突的路径数量--with-merge-status
- 显示影响此修订版的合并修订版--max-count=MAX-COUNT
- 限制输出的修订版数量--ignore-externals
- 忽略外部定义--refresh-bug-tracking
- 刷新项目中 "bugtraq:logregex" SVN 属性的值--show-meta
- 显示项目的元信息
配置设置
aggregate.ignore
-aggregate
命令忽略的路径列表,在搜索工作副本时使用
示例
svn-buddy.phar aggregate --ignore-add some-path
将 some-path
路径(可以是相对路径或绝对路径)添加到忽略路径列表。
svn-buddy.phar aggregate --ignore-remove some-path
从忽略路径列表中移除 some-path
路径(可以是相对路径或绝对路径)。
svn-buddy.phar aggregate --ignore-show
显示忽略路径列表。
“project” 命令
更改并显示项目配置。
参数
path
- 工作副本路径 [默认: “.
”]
选项
--refresh-bug-tracking
- 刷新项目中 "bugtraq:logregex" SVN 属性的值--show-meta
- 显示项目的元信息
示例
svn-buddy.phar project --refresh-bug-tracking
从最近修改的 trunk/branch/tag 中拉取 bugtraq:logregex
SVN 属性并将其存储到项目配置中。
svn-buddy.phar project --show-meta
以下格式显示项目元信息
“reparse” 命令
重新解析指定的修订版。
参数
path
- 工作副本路径 [默认: “.
”]
选项
-r
,--revision=REVISION
- 重新解析指定修订版
示例
svn-buddy.phar reparse --revision 12345
重新读取并解析 12345 修订版信息。
“self-update” 命令
将应用程序更新到最新版本。以下更新通道可用
stable
(默认)- 最终会有新版本可用snapshot
- 新版本每周一(仅在有更改时)可用preview
- 每天更新一次新版本(仅在有更改时)
存在特殊选项(见下面的示例)来在更新通道之间切换。
选项
-r
,--rollback
- 将应用程序回滚到较旧版本--stable
- 强制更新到稳定通道--snapshot
- 强制更新到快照通道--preview
- 强制更新到预览通道
示例
svn-buddy.phar self-update
在当前更新通道上更新到最新版本。默认情况下,更新将来自 stable
通道。
svn-buddy.phar self-update --rollback
如果在之前执行了更新,则允许撤销更新。
svn-buddy.phar self-update --stable
将当前更新通道更改为 stable
并立即执行更新。
svn-buddy.phar self-update --snapshot
将当前更新通道更改为 snapshot
并立即执行更新。
svn-buddy.phar self-update --preview
将当前更新通道更改为 preview
并立即执行更新。
“list” 命令
显示可用的命令。Subversion 二进制文件的版本也显示在应用程序版本旁边。
示例
svn-buddy.phar
svn-buddy.phar list
“changelog” 命令
显示当前 SVN-Buddy 版本中包含的更改。
示例
svn-buddy.phar changelog
“deploy” 命令
此命令将更改部署到远程/本地服务器。
参数
path
- 工作副本路径 [默认: “.
”]
选项
-r
,--remote
- 执行远程部署-l
,--local
- 执行本地部署
配置设置
deploy.remote-commands
- 在远程部署期间执行的命令(每行一个命令)deploy.local-commands
- 在本地部署期间执行的命令(每行一个命令)
示例
svn-buddy.phar deploy --remote
将执行远程部署。
svn-buddy.phar deploy --local
将执行本地部署。
“help” 命令
显示命令的帮助信息。
安装
- 下载 稳定版本(最好下载到 PATH 中的文件夹)
- 通过在
~/.bashrc
中放置eval $(/path/to/svn-buddy.phar _completion --generate-hook -p svn-buddy.phar)
并重新打开终端窗口来设置自动完成 - (可选)切换到
snapshot
版本发布通道,通过运行/path/to/svn-buddy.phar self-update --snapshot
命令获取每周更新 - (可选)切换到
preview
版本发布通道,通过运行/path/to/svn-buddy.phar self-update --preview
命令获取每日更新
如何在 macOS 上升级 Bash: https://www.shell-tips.com/mac/upgrade-bash/。
要求
- 正在工作的 Subversion 命令行客户端(已在 v1.6、v1.7、v1.8 上进行测试)
- 一个 Subversion 工作副本(几乎所有
svn-buddy.phar
命令都在工作副本内部运行)
贡献
请参阅 CONTRIBUTING 文件。
许可证
SVN-Buddy 在 BSD-3-Clause 许可证下发布。有关详细信息,请参阅捆绑的 LICENSE 文件。