Klaatu 发布的文章

SoX Sound Exchange 甚至可以为你的音频文件添加特效。

 title=

我工作需要使用音视频媒体,不管你处理哪种媒体,你肯定知道标准化是一种有价值的工具。就像你不会试图把一个分数加到一个小数上而不转换其中一个一样,我已经知道,把不同格式的媒体组合起来并不理想。为了方便用户,大多数爱好者级应用程序使转换过程不可见。然而,对于那些需要控制媒体细节的用户的灵活软件,会通常让你自己提前将媒体转换为所需的格式。我有一些最喜欢的音频转换工具,其中之一就是号称“音频的瑞士军刀” —— SoX

安装

在 Linux 或 BSD 上,可以从软件存储库或 Ports 树中安装 sox 命令(,以及一些有用的符号链接)。

你也可以从 Sourceforge.net 上安装 SoX。它不经常发布,但它的代码库往往是稳定的,所以如果你想要最新的功能(如 Opus 支持),构建它是容易和安全的。

SoX 主要提供了 sox 命令,但是创建了一些有用的符号链接:playrecsoxi

使用 SoX 获取文件信息

SoX 可以读取和重写音频数据。它是否存储重写的音频数据取决于你。在有些情况下,你不需要存储转换后的数据,例如,当你将输出直接发送到扬声器进行回放时。然而,在进行任何转换之前,最好首先确定要处理的是什么。

使用 soxi 命令也可以收集音频文件信息。soxi 会符号链接到 soxi --info

$ soxi countdown.mp3
Input File(输入文件)    : '/home/tux/countdown.mp3'
Channels(通道数)       : 1
Sample Rate(采样率)    : 44100
Precision(数据精度)      : 16-bit(16 比特)
Duration(时长)       : 00:00:11.21 = 494185 samples...(11.21 秒 = 494185 采样点)
File Size(文件大小)      : 179k
Bit Rate(比特率)       : 128k
Sample Encoding(编码格式): MPEG audio (layer I, II or III)

这个输出可以让你很好地了解音频文件的编码方式、文件长度、文件大小、采样率和通道数。其中一些你可能认为你已经知道了,但当客户把媒体带到我面前时,我从不相信这些假设。使用 soxi 验证媒体属性。

转换文件

在本例中,,一个游戏节目倒计时的音频是以MP3文件的形式提供的。虽然几乎所有的编辑应用程序都接受压缩音频,但它们并不是在压缩的数据上进行编辑。转换是在某个地方发生的,可能是一个秘密的后台任务,也可能提示让你保存一份副本。我通常喜欢自己提前完成转换。这样,我可以控制使用的格式。我可以在夜间批量处理大量的媒体,而不是浪费宝贵的制作时间,等待编辑应用程序按需处理它们。

sox 命令用于转换音频文件。在 sox 流程中有几个阶段:

  • 输入
  • 合并
  • 特效
  • 输出

但在命令语法中,特效步骤令人困惑地放到了最后一步。这意味着 sox 流程是这样组成的:

输入 → 合并 → 输出 → 特效

编码

最简单的转换命令只涉及一个输入文件和一个输出文件。下面是转换 MP3 文件为无损 FLAC 文件的命令:

$ sox countdown.mp3 output.flac
$ soxi output.flac

Input File(输入文件)     : 'output.flac'
Channels(通道数)       : 1
Sample Rate(采样率)    : 44100
Precision(数据精度)      : 16-bit(16 比特)
Duration(时长)       : 00:00:11.18 = 493056 samples...(11.18 秒 = 493056 采样点)
File Size(文件大小)      : 545k
Bit Rate(比特率)       : 390k
Sample Encoding(编码格式): 16-bit FLAC
Comment(注释)        : 'Comment=Processed by SoX'

特效

特效可以在命令末尾指定。它可以在将数据发送到最终目的地之前更改音频。例如,有时声音太大会在转换过程中造成问题:

$ sox bad.wav bad.ogg
sox WARN sox: `bad.ogg' output clipped 126 samples; decrease volume?

应用增益gain)效果通常可以解决此问题:

$ sox bad.wav bad.ogg gain -1

淡入淡出

另一个常用的效果是淡入淡出fade)。此效果允许你定义淡入或淡出的类型,以及你希望淡入淡出效果持续的时间。

下面是一个使用倒抛物线的 6 秒淡入示例:

$ sox intro.ogg intro.flac fade p 6

这将对音频的头部应用 3 秒的淡入,并从 8 秒标记开始淡出(这段音乐只有 11 秒,因此在这种情况下淡出也是 3 秒):

$ sox intro.ogg intro.flac fade p 3 8

sox 手册页中列出了不同类型的淡入淡出(正弦、线性、倒抛物线等)以及淡入淡出提供的选项。

特效语法

每个特效插件都有自己的语法,因此请参阅手册页了解如何调用每个特效插件的详细信息。

效果可以在一个命令中以菊花链的方式进行,至少在你想组合它们的范围内是如此。换句话说,没有语法可以只在六秒钟的淡出期间应用一个镶边效果。对于如此精确的东西,你需要一个图形声波编辑器或数字音频工作站,例如 LMMSRosegarden。但是,如果你只想应用一次特效,可以在同一命令中将它们一起列出。

此命令应用了一个 -1 的增益效果、1.35 的节奏拉伸淡出

$ sox intro.ogg output.flac gain -1 stretch 1.35 fade p 0 6
$ soxi output.flac

Input File(输入文件)     : 'output.flac'
Channels(通道数)       : 1
Sample Rate(采样率)    : 44100
Precision(数据精度)      : 16-bit(16 比特)
Duration(时长)        : 00:00:15.10 = 665808 samples...(15.10 秒 = 665808 采样点)
File Size(文件大小)      : 712k
Bit Rate(比特率)       : 377k
Sample Encoding(编码格式): 16-bit FLAC
Comment(注释)        : 'Comment=Processed by SoX'

组合音频

SoX 还可以通过连接或混合音频文件来组合音频文件。

要连接(或者说拼接)文件合并为一个文件,请在命令中提供多个输入文件:

$ sox countdown.mp3 intro.ogg output.flac

在本例中,output.flac 现在包含 countdown.mp3 音频,紧接着是 intro.ogg 音乐。

但是,如果你希望两首曲目同时播放,可以使用 --combine mix 选项:

$ sox --combine mix countdown.mp3 intro.ogg output.flac

然而,想象一下,这两个输入文件的不同之处不仅仅在于它们的编解码器。人声音轨用单声道(一个声道)录制并不少见,但音乐至少要用立体声(至少两个声道)来录制。SoX 不会给出默认的解决方案,因此你必须首先自己标准化这两个文件的格式。

更改音频文件

选项与后面列出文件名有关。例如,此命令中的 --channels 选项将仅仅应用于 input.wav,而不被应用于 example.oggoutput.flac

$ sox --channels 2 input.wav example.ogg output.flac

这意味着在 SoX 中,选项的位置非常重要。如果你在命令开始时指定一个选项,那么实际上只会覆盖 SoX 自己从输入文件中收集的内容。然而,在输出文件名前的选项决定了 SoX 如何写入音频数据。

要解决前面的通道不兼容问题,你可以首先标准化输入,然后混合:

$ sox countdown.mp3 --channels 2 countdown-stereo.flac gain -1
$ soxi countdown-stereo.flac

Input File(输入文件)     : 'countdown-stereo.flac'
Channels(通道数)       : 2
Sample Rate(采样率)    : 44100
Precision(数据精度)      : 16-bit(16 比特)
Duration(时长)       : 00:00:11.18 = 493056 samples...(11.18 秒 = 493056 采样点)
File Size(文件大小)      : 545k
Bit Rate(比特率)       : 390k
Sample Encoding(编码格式): 16-bit FLAC
Comment(注释)        : 'Comment=Processed by SoX'

$ sox --combine mix \
  countdown-stereo.flac \
  intro.ogg \
  output.flac

SoX 绝对需要多个命令来执行复杂的操作,因此根据需要创建几个临时和中间文件是正常的。

多通道音频

当然,并非所有音频都被限制在一个或两个声道。如果你想将多个音频通道组合成一个文件,可以使用 SoX 的 --combine merge 选项:

$ sox --combine merge countdown.mp3 intro.ogg output.flac
$ soxi output.flac

Input File     : 'output.flac'
Channels       : 3
[...]

简单的音频操作

在没有视觉界面的情况下操作音频似乎很奇怪,而且对于某些任务来说,SoX 绝对不是最好的工具。然而,对于许多任务,SoX 提供了一个简单而轻量级的工具包。SoX 是一个具有强大潜力的简单命令。有了它,你可以转换音频,操纵通道和波形,甚至生成自己的声音。本文仅简要概述了其功能,因此请阅读其手册页或 在线文档,然后看看你能创造什么。


via: https://opensource.com/article/20/2/linux-sox

作者:Klaatu 选题:lujun9972 译者:FYJNEVERFOLLOWS 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

2022 年 5 月是 LibreOffice 月。这里有一些简单的方法来完成你的第一个开源贡献。

“参与”开源似乎有点令人困惑。你从哪里开始?如果你不会编程怎么办?你取得谁的同意?别人怎么知道你做出了贡献,会有人关心吗?

这类问题实际上有答案(你自己选择就行;没关系;不用谁的同意;你告诉他们;是的),但在 2022 年 5 月,有一个简单的答案:LibreOffice。5 月是参与 LibreOffice 及其管理机构 文档基金会 The Document Foundation 的月份。他们正在邀请各种各样的贡献者以六种不同的方式提供帮助,其中只有一种与代码有任何关系。无论你的技能如何,你都可以找到一种方法来帮助这个世界上最好的办公套件。

为 LibreOffice 做出贡献的 6 种方式

以下是你可以做的:

  • Handy Helper:在 Ask LibreOffice 上回答其他 LibreOffice 用户的问题。如果你是 LibreOffice 的狂热用户,并且认为你有可以帮助他人的有用提示和技巧,那么这就是你一直在等待的角色。
  • First Responder:当错误报告得到不止一个用户确认时会更好。如果你擅长安装软件(有时错误报告是针对比你通常使用的版本更旧的版本),那么请访问 LibreOffice Bugzilla 并查找尚未确认的新错误。当你找到时,试着复制所报告的内容。假设你可以做到这一点,请添加一条评论,例如 “CONFIRMED on Linux (Fedora 35) and LibreOffice 7.3.2”。
  • Drum Beater:开源项目很少有大公司投入营销资金来推广它们。如果所有声称喜欢开源的公司都能提供帮助,那就太好了,但不是所有的公司都这样做,那么为什么不发出你的声音呢?在社交媒体上告诉你的朋友你为什么喜欢 LibreOffice,或者你用它做什么(当然还要加上#libreoffice 标签。)
  • Globetrotter:LibreOffice 已经支持多种不同的语言,但并不是所有语言。 LibreOffice 正在积极开发中,因此它的界面翻译需要保持最新。在这里参与
  • Docs Doctor:LibreOffice 有在线帮助和用户手册。如果你擅长向其他人解释事情,或者如果你擅长校对其他人的文档,那么你应该联系 文档团队
  • Code Cruncher:你可能不会立即深入了解 LibreOffice 的代码库并进行重大更改,但这通常不是项目所需要的。如果你知道如何编码,那么你可以按照此 wiki 页面上的说明加入开发人员社区

免费贴纸

我不想提前提到这一点,因为很明显你参与 LibreOffice 只是因为你喜欢参与一个优秀的开源项目。但是,你最终会发现,所以我不妨告诉你:通过为 LibreOffice 做出贡献,你可以注册然后从文档基金会获得免费贴纸。你肯定一直想 装饰你的笔记本电脑吧

不过,不要被战利品的承诺分心。如果你对参与开源感到困惑但很兴奋,那么这是一个很好的机会。它代表了你参与开源的一般方式:寻找需要做的事情,去做它,然后你和其他人讨论它,这样你就可以获得下一步可以做什么的想法。经常这样做,你就会找到进入社区的方式。最终,你不会再纠结于如何参与开源,因为你已经忙于贡献!


via: https://opensource.com/article/22/5/first-open-source-contribution-libreoffice

作者:Klaatu 选题:lkxed 译者:lkskjjk 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

开始使用这个功能强大且通用的数据库吧。

 title=

应用程序经常需要保存数据。无论你的用户是创建简单的文本文档、复杂的图形布局、游戏进度还是错综复杂的客户和订单号列表,软件通常都意味着生成数据。有很多方法可以存储数据以供重复使用。你可以将文本转储为 INI、YAML、XML 或 JSON 等配置格式,可以输出原始的二进制数据,也可以将数据存储在结构化数据库中。SQLite 是一个自包含的、轻量级数据库,可轻松创建、解析、查询、修改和传输数据。

SQLite 专用于 公共领域从技术上讲,这意味着它没有版权,因此不需要许可证。如果你需要许可证,则可以 购买所有权担保。SQLite 非常常见,大约有 1 万亿个 SQLite 数据库正在使用中。在每个基于 Webkit 的 Web 浏览器,现代电视机,汽车多媒体系统以及无数其他软件应用程序中,Android 和 iOS 设备, macOS 和 Windows 10 计算机,大多数 Linux 系统上都包含多个这种数据库。

总而言之,它是用于存储和组织数据的一个可靠而简单的系统。

安装

你的系统上可能已经有 SQLite 库,但是你需要安装其命令行工具才能直接使用它。在 Linux上,你可能已经安装了这些工具。该工具提供的命令是 sqlite3 (而不仅仅是 sqlite)。

如果没有在你的 Linux 或 BSD 上安装 SQLite,你则可以从软件仓库中或 ports 树中安装 SQLite,也可以从源代码或已编译的二进制文件进行下载并安装

在 macOS 或 Windows 上,你可以从 sqlite.org 下载并安装 SQLite 工具。

使用 SQLite

通过编程语言与数据库进行交互是很常见的。因此,像 Java、Python、Lua、PHP、Ruby、C++ 以及其他编程语言都提供了 SQLite 的接口(或“绑定”)。但是,在使用这些库之前,了解数据库引擎的实际情况以及为什么你对数据库的选择很重要是有帮助的。本文向你介绍 SQLite 和 sqlite3 命令,以便你熟悉该数据库如何处理数据的基础知识。

与 SQLite 交互

你可以使用 sqlite3 命令与 SQLite 进行交互。 该命令提供了一个交互式的 shell 程序,以便你可以查看和更新数据库。

$ sqlite3
SQLite version 3.34.0 2020-12-01 16:14:00
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>

该命令将你使你处于 SQLite 的子 shell 中,因此现在的提示符是 SQLite 的提示符。你以前使用的 Bash 命令在这里将不再适用。你必须使用 SQLite 命令。要查看 SQLite 命令列表,请输入 .help

sqlite> .help
.archive ...             Manage SQL archives
.auth ON|OFF             SHOW authorizer callbacks
.backup ?DB? FILE        Backup DB (DEFAULT "main") TO FILE
.bail ON|off             Stop after hitting an error.  DEFAULT OFF
.binary ON|off           Turn BINARY output ON OR off.  DEFAULT OFF
.cd DIRECTORY            CHANGE the working directory TO DIRECTORY
[...]

这些命令中的其中一些是二进制的,而其他一些则需要唯一的参数(如文件名、路径等)。这些是 SQLite Shell 的管理命令,不是用于数据库查询。数据库以结构化查询语言(SQL)进行查询,许多 SQLite 查询与你从 MySQLMariaDB 数据库中已经知道的查询相同。但是,数据类型和函数有所不同,因此,如果你熟悉另一个数据库,请特别注意细微的差异。

创建数据库

启动 SQLite 时,可以打开内存数据库,也可以选择要打开的数据库:

$ sqlite3 mydatabase.db

如果还没有数据库,则可以在 SQLite 提示符下创建一个数据库:

sqlite> .open mydatabase.db

现在,你的硬盘驱动器上有一个空文件,可以用作 SQLite 数据库。 文件扩展名 .db 是任意的。你也可以使用 .sqlite 或任何你想要的后缀。

创建一个表

数据库包含一些 table ,可以将其可视化为电子表格。有许多的行(在数据库中称为 记录 record )和列。行和列的交集称为 字段 field

结构化查询语言(SQL)以其提供的内容而命名:一种以可预测且一致的语法查询数据库内容以接收有用的结果的方法。SQL 读起来很像普通的英语句子,即使有点机械化。当前,你的数据库是一个没有任何表的空数据库。

你可以使用 CREATE 来创建一个新表,你可以和 IF NOT EXISTS 结合使用。以便不会破坏现在已有的同名的表。

你无法在 SQLite 中创建一个没有任何字段的空表,因此在尝试 CREATE 语句之前,必须考虑预期表将存储的数据类型。在此示例中,我将使用以下列创建一个名为 member 的表:

  • 唯一标识符
  • 人名
  • 记录创建的时间和日期

唯一标识符

最好用唯一的编号来引用记录,幸运的是,SQLite 认识到这一点,创建一个名叫 rowid 的列来为你自动实现这一点。

无需 SQL 语句即可创建此字段。

数据类型

对于我的示例表中,我正在创建一个 name 列来保存 TEXT 类型的数据。为了防止在没有指定字段数据的情况下创建记录,可以添加 NOT NULL 指令。

name TEXT NOT NULL 语句来创建。

SQLite 中有五种数据类型(实际上是 储存类别):

  • TEXT:文本字符串
  • INTEGER:一个数字
  • REAL:一个浮点数(小数位数无限制)
  • BLOB:二进制数据(例如,.jpeg 或 .webp 图像)
  • NULL:空值

日期和时间戳

SQLite 有一个方便的日期和时间戳功能。它本身不是数据类型,而是 SQLite 中的一个函数,它根据所需的格式生成字符串或整数。 在此示例中,我将其保留为默认值。

创建此字段的 SQL 语句是:datestamp DATETIME DEFAULT CURRENT_TIMESTAMP

创建表的语句

在 SQLite 中创建此示例表的完整 SQL:

sqlite> CREATE TABLE
...> IF NOT EXISTS
...> member (name TEXT NOT NULL,
...> datestamp DATETIME DEFAULT CURRENT_TIMESTAMP);

在此代码示例中,我在语句的分句后按了回车键。以使其更易于阅读。除非以分号(;)终止,否则 SQLite 不会运行你的 SQL 语句。

你可以使用 SQLite 命令 .tables 验证表是否已创建:

sqlite> .tables
member

查看表中的所有列

你可以使用 PRAGMA 语句验证表包含哪些列和行:

sqlite> PRAGMA table_info(member);
0|name|TEXT|1||0
1|datestamp|DATETIME|0|CURRENT_TIMESTAMP|0

数据输入

你可以使用 INSERT 语句将一些示例数据填充到表中:

> INSERT INTO member (name) VALUES ('Alice');
> INSERT INTO member (name) VALUES ('Bob');
> INSERT INTO member (name) VALUES ('Carol');
> INSERT INTO member (name) VALUES ('David');

查看表中的数据:

> SELECT * FROM member;
Alice|2020-12-15 22:39:00
Bob|2020-12-15 22:39:02
Carol|2020-12-15 22:39:05
David|2020-12-15 22:39:07

添加多行数据

现在创建第二个表:

> CREATE TABLE IF NOT EXISTS linux (
...> distro TEXT NOT NULL);

填充一些示例数据,这一次使用小的 VALUES 快捷方式,因此你可以在一个命令中添加多行。关键字 VALUES 期望以括号形式列出列表,而用多个逗号分隔多个列表:

> INSERT INTO linux (distro)
...> VALUES ('Slackware'), ('RHEL'),
...> ('Fedora'),('Debian');

修改表结构

你现在有两个表,但是到目前为止,两者之间没有任何关系。它们每个都包含独立的数据,但是可能你可能需要将第一个表的成员与第二个表中列出的特定项相关联。

为此,你可以为第一个表创建一个新列,该列对应于第二个表。由于两个表都设计有唯一标识符(这要归功于 SQLite 的自动创建),所以连接它们的最简单方法是将其中一个的 rowid 字段用作另一个的选择器。

在第一个表中创建一个新列,以存储第二个表中的值:

> ALTER TABLE member ADD os INT;

使用 linux 表中的唯一标识符作为 member 表中每一条记录中 os 字段的值。因为记录已经存在。因此你可以使用 UPDATE 语句而不是使用 INSERT 语句来更新数据。需要特别注意的是,你首先需要选中特定的一行来然后才能更新其中的某个字段。从句法上讲,这有点相反,更新首先发生,选择匹配最后发生:

> UPDATE member SET os=1 WHERE name='Alice';

member 表中的其他行重复相同的过程。更新 os 字段,为了数据多样性,在四行记录上分配三种不同的发行版(其中一种加倍)。

联接表

现在,这两个表相互关联,你可以使用 SQL 显示关联的数据。数据库中有多种 联接方式,但是一旦掌握了基础知识,就可以尝试所有的联接形式。这是一个基本联接,用于将 member 表的 os 字段中的值与 linux 表的 rowid 字段相关联:

> SELECT * FROM member INNER JOIN linux ON member.os=linux.rowid;
Alice|2020-12-15 22:39:00|1|Slackware
Bob|2020-12-15 22:39:02|3|Fedora
Carol|2020-12-15 22:39:05|3|Fedora
David|2020-12-15 22:39:07|4|Debian

osrowid 字段形成了关联。

在一个图形应用程序中,你可以想象 os 字段是一个下拉选项菜单,其中的值是 linux 表中 distro 字段中的数据。将相关的数据集通过唯一的字段相关联,可以确保数据的一致性和有效性,并且借助 SQL,你可以在以后动态地关联它们。

了解更多

SQLite 是一个非常有用的自包含的、可移植的开源数据库。学习以交互方式使用它是迈向针对 Web 应用程序进行管理或通过编程语言库使用它的重要的第一步。

如果你喜欢 SQLite,也可以尝试由同一位作者 Richard Hipp 博士的 Fossil

在学习和使用 SQLite 时,有一些常用命令可能会有所帮助,所以请立即下载我们的 SQLite3 备忘单


via: https://opensource.com/article/21/2/sqlite3-cheat-sheet

作者:Klaatu 选题:lujun9972 译者:amwps290 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Fossil 是一个集版本控制系统、bug 追踪、维基、论坛以及文档解决方案于一体的系统。

每个开发者都知道,追踪代码的修改是至关重要的。有时候你会处于好奇或者教育的目的需要展示你的项目开始和进化的历史。有时候你想让其他的开发者参与到你的项目中,因此你需要一种值得信赖的能合并不同代码分支的方法。更极端一点,有时候你为了解决一个问题而修改的代码导致已有的功能不能正常使用。

Fossil 源码管理系统是由著名的 SQLite 数据库的作者开发的一个集版本控制系统、bug 追踪、维基、论坛以及文档解决方案于一体的系统。

安装 Fossil

Fossil 是一个独立的 C 程序,因此你可以从它的网站上下载后放在环境变量 PATH 中的任意位置。例如,假定 /usr/local/bin 已经在你的环境变量中(默认情况下是在的):

$ wget https://fossil-scm.org/home/uv/fossil-linux-x64-X.Y.tar.gz
$ sudo tar xvf fossil-linux-x64-X.Y.tar.gz --directory /usr/local/bin

你也可以通过包管理器从软件仓库中找到 Fossil,或者直接从源码编译。

创建一个 Fossil 仓库

如果你已经有一个代码项目,想用 Fossil 来追踪,那么第一步就是创建一个 Fossil 仓库:

$ fossil init myproject.fossil
project-id: 010836ac6112fefb0b015702152d447c8c1d8604
server-id:  54d837e9dc938ba1caa56d31b99c35a4c9627f44
admin-user: klaatu (initial password is "14b605")

创建 Fossil 仓库的过程中会返回三行信息:一个唯一的项目 ID、一个唯一的服务器 ID 以及管理员 ID 和密码。项目 ID 和服务器 ID 是版本数字。管理员凭证表明你对这个仓库的所有权,当你把 Fossil 作为服务器让其他用户来访问时可以使用管理员权限。

Fossil 仓库工作流

在你使用 Fossil 仓库之前,你需要先为它的数据创建一个工作路径。你可以把这个过程类比为使用 Python 时创建一个虚拟环境或者解压一个只用来备份的 ZIP 文件。

创建一个工作目录并进入:

$ mkdir myprojectdir
$ cd myprojectdir

把你的 Fossil 打开到刚刚创建的目录:

$ fossil open ../myproject
project-name: <unnamed>
repository:   /home/klaatu/myprojectdir/../myproject
local-root:   /home/klaatu/myprojectdir/
config-db:    /home/klaatu/.fossil
project-code: 010836ac6112fefb0b015702152d447c8c1d8604
checkout:     9e6cd96dd675544c58a246520ad58cdd460d1559 2020-11-09 04:09:35 UTC
tags:         trunk
comment:      initial empty check-in (user: klaatu)
check-ins:    1

你可能注意到了,Fossil 在你的家目录下创建了一个名为 .fossil 的隐藏文件,用来追踪你的全局 Fossil 配置。这个配置不是只适用于你的一个项目的;这个文件只会在你第一次使用 Fossil 时生成。

添加文件

使用 addcommit 子命令来向你的仓库添加文件。例如,创建一个简单的 README 文件,把它添加到仓库:

$ echo "My first Fossil project" > README
$ fossil add README
ADDED  README
$ fossil commit -m 'My first commit'
New_Version: 2472a43acd11c93d08314e852dedfc6a476403695e44f47061607e4e90ad01aa

使用分支

Fossil 仓库开始时默认使用的主分支名为 trunk。当你想修改代码而又不影响主干代码时,你可以从 trunk 分支切走。创建新分支需要使用 branch 子命令,这个命令需要两个参数:一个新分支的名字,一个新分支的基分支名字。在本例中,只有一个分支 trunk,因此尝试创建一个名为 dev 的新分支:

$ fossil branch --help
Usage: fossil branch new BRANCH-NAME BASIS ?OPTIONS?
$ fossil branch new dev trunk
New branch: cb90e9c6f23a9c98e0c3656d7e18d320fa52e666700b12b5ebbc4674a0703695

你已经创建了一个新分支,但是你当前所在的分支仍然是 trunk

$ fossil branch current
trunk

使用 checkout 命令切换到你的新分支 dev

$ fossil checkout dev
dev

合并修改

假设你在 dev 分支中添加了一个新文件,完成了测试,现在想把它合并到 trunk。这个过程叫做合并

首先,切回目标分支(本例中目标分支为 trunk):

$ fossil checkout trunk
trunk
$ ls
README

这个分支中没有你的新文件(或者你对其他文件的修改),而那些内容是合并的过程需要的信息:

$ fossil merge dev
 "fossil undo" is available to undo changes to the working checkout.
$ ls
myfile.lua  README

查看 Fossil 时间线

使用 timeline 选项来查看仓库的历史。这个命令列出了你的仓库的所有活动的详细信息,包括用来表示每次修改的哈希值、每次提交时填写的信息以及提交者:

$ fossil timeline
=== 2020-11-09 ===
06:24:16 [5ef06e668b] added exciting new file (user: klaatu tags: dev)
06:11:19 [cb90e9c6f2] Create new branch named "dev" (user: klaatu tags: dev)
06:08:09 [a2bb73e4a3] *CURRENT* some additions were made (user: klaatu tags: trunk)
06:00:47 [2472a43acd] This is my first commit. (user: klaatu tags: trunk)
04:09:35 [9e6cd96dd6] initial empty check-in (user: klaatu tags: trunk)
+++ no more data (5) +++

 title=

公开你的 Fossil 仓库

因为 Fossil 有个内置的 web 界面,所以 Fossil 不像 GitLab 和 Gitea 那样需要主机服务。Fossil 就是它自己的主机服务,只要你把它放在一台机器上就行了。在你公开你的 Fossil 仓库之前,你还需要通过 web 用户界面(UI)来配置一些信息:

使用 ui 子命令启动一个本地的实例:

$ pwd
/home/klaatu/myprojectdir/
$ fossil ui

“Users” 和 “Settings” 是安全相关的,“Configuration” 是项目属性相关的(包括一个合适的标题)。web 界面不仅仅是一个方便的功能。 它是能在生产环境中使用并作为 Fossil 项目的宿主机来使用的。它还有一些其他的高级选项,比如用户管理(或者叫自我管理)、在同一个服务器上与其他的 Fossil 仓库进行单点登录(SSO)。

当配置完成后,关掉 web 界面并按下 Ctrl+C 来停止 UI 引擎。像提交代码一样提交你的 web 修改。

$ fossil commit -m 'web ui updates'
New_Version: 11fe7f2855a3246c303df00ec725d0fca526fa0b83fa67c95db92283e8273c60

现在你可以配置你的 Fossil 服务器了。

  1. 把你的 Fossil 仓库(本例中是 myproject.fossil)复制到服务器,你只需要这一个文件。
  2. 如果你的服务器没有安装 Fossil,就在你的服务器上安装 Fossil。在服务器上安装的过程跟在本地一样。
  3. 在你的 cgi-bin 目录下(或它对应的目录,这取决于你的 HTTP 守护进程)创建一个名为 repo_myproject.cgi 的文件:
#!/usr/local/bin/fossil
repository: /home/klaatu/public_html/myproject.fossil

添加可执行权限:

$ chmod +x repo_myproject.cgi

你需要做的都已经做完了。现在可以通过互联网访问你的项目了。

你可以通过 CGI 脚本来访问 web UI,例如 https://example.com/cgi-bin/repo_myproject.cgi

你也可以通过命令行来进行交互:

$ fossil clone https://[email protected]/cgi-bin/repo_myproject.cgi

在本地的克隆仓库中工作时,你需要使用 push 子命令把本地的修改推送到远程的仓库,使用 pull 子命令把远程的修改拉取到本地仓库:

$ fossil push https://[email protected]/cgi-bin/repo_myproject.cgi

使用 Fossil 作为独立的托管

Fossil 将大量的权力交到了你的手中(以及你的合作者的手中),让你不再依赖托管服务。本文只是简单的介绍了基本概念。你的代码项目还会用到很多有用的 Fossil 功能。尝试一下 Fossil。它不仅会改变你对版本控制的理解;它会让你不再考虑其他的版本控制系统。


via: https://opensource.com/article/20/11/fossil

作者:Klaatu 选题:lujun9972 译者:lxbwolf 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出