1 个不稳定版本
0.1.0 | 2019年2月21日 |
---|
#1950 在 开发工具
265KB
4.5K SLoC
quilt
是一个基于与 pijul
相同理念的极简版本控制系统(VCS),如在此系列博客文章中所述 此处。这不是一个真正的VCS,您不应将其用于任何重要的事情。(首先,它只能跟踪单个文件。)我编写了 quilt
来帮助我理解博客文章中讨论的想法,并公开希望它能帮助到其他人。
安装
quilt
是一个命令行程序。它只在Linux上进行了测试,尽管它可能也在类似的操作系统上工作。quilt
用 rust 编写;要安装它,您需要安装rust工具链。完成这些后,克隆此存储库并使用 cargo
构建
$ git clone https://github.com/jneem/quilt.git
$ cd quilt
$ cargo build --release
然后您可以在 target/release/
目录中找到 ql
二进制文件。
使用方法
创建存储库
要开始您的 quilt
之旅,在当前目录中初始化一个存储库
$ ql init
Created empty quilt repository.
这将在当前目录中创建一个 .quilt
目录,其中包含文件 db
。此 db
文件包含所有 quilt
的内部数据。它是纯文本(YAML格式),所以如果您好奇的话可以查看。
创建和应用补丁
每个 quilt
存储库只能跟踪一个文件,文件名默认为 quilt_file.txt
。要创建一个补丁,请使用命令 ql patch create
。例如,假设您刚刚创建了一个存储库,然后编辑了文件 quilt_file.txt
。要创建反映您新更改的补丁:执行
$ ql patch create --author "My Name" --description "Something something"
Created patch rLbZ6RjMol8_wV0tW2dnMapcaNVJB25A9uWFXixDU6c=
输出中的那个长字符串是您刚才创建的补丁的唯一标识符。它是通过哈希补丁的内容(包括时间戳,因此即使您有完全相同的内容,也不太可能看到相同的哈希两次)获得的。
Quilt的一个特性是它(默认情况下)不会立即应用补丁,与(例如)git commit
不同,后者创建补丁并将其应用到当前分支。如果您想同时创建和应用补丁,请向ql patch create
提供参数--then-apply
$ ql patch create --author "My Name" --description "Something something" --then-apply
Created and applied patch rLbZ6RjMol8_wV0tW2dnMapcaNVJB25A9uWFXixDU6c=
或者,您可以先创建补丁,然后使用ql patch apply
命令应用它
$ ql patch create --author "My Name" --description "Something something"
Created patch rLbZ6RjMol8_wV0tW2dnMapcaNVJB25A9uWFXixDU6c=
$ ql patch apply rLbZ6RjMol8_wV0tW2dnMapcaNVJB25A9uWFXixDU6c=
Applied:
vDLmQ2m8JnblI0wPq2bTSYusqNtHOLNo1iRt4nWdyLY=
如果您想取消应用补丁,请使用ql patch apply --revert
$ ql patch apply -R rLbZ6RjMol8_wV0tW2dnMapcaNVJB25A9uWFXixDU6c=
Unapplied:
vDLmQ2m8JnblI0wPq2bTSYusqNtHOLNo1iRt4nWdyLY=
输出文件
Quilt的另一个特性是它不会自动更新您的文件的副本以匹配内部仓库中的更改。要输出包含仓库当前内容的文件,请使用ql render
命令。默认情况下,仓库的内容将被输出到quilt_file.txt
文件,但您可以更改这一点。
$ ql render # outputs the repository contents to quilt_file.txt
$ ql render --path other_file.txt # specify another output path
整合
$ ql init
Created empty quilt repository.
$ echo "First line" > quilt_file.txt
$ ql patch create --author Me --description "I wuz here" --then-apply
Created and applied patch rLbZ6RjMol8_wV0tW2dnMapcaNVJB25A9uWFXixDU6c=
# Now the file stored in the repository consists of the single line
# "First line". The file quilt_file.txt also consists of the single line
# "First line", but that's because we put it there ourselves; quilt hasn't
# touched it.
$ echo "Second line" >> quilt_file.txt
$ ql patch create --author Me --description "Me again" --then-apply
Created and applied patch xGRnP1j1o9FdJPPJoD6OM4Pxj3qgyN2hKG_0qg54t38=
# Now the file stored in the repository has two lines, and so does the
# file quilt_file.txt.
$ ql patch apply --reverse
Unapplied:
xGRnP1j1o9FdJPPJoD6OM4Pxj3qgyN2hKG_0qg54t38=
# The file stored in the repository has just one line. To reflect that change
# in the filesystem, we need to render:
$ ql render
Successfully wrote file 'quilt_file.txt'
$ cat quilt_file.txt
First line
冲突和解决
Quilt处理冲突的基本理论在这里的一系列博客文章中有描述。主要思想是,Quilt不是存储文件,而是存储“graggles”,即行导向的有向图。文件是graggle的特殊情况,其中行的有向图强制执行唯一排序。(更确切地说,如果一个graggle有一个唯一的拓扑排序,则它就是一个文件。)大多数时候,您希望您的仓库表示一个文件;如果它表示的不是文件格式的graggle,我们称之为冲突。
这是一个获取冲突的方法
$ ql init
Created empty quilt repository.
$ echo "First line" > quilt_file.txt
$ ql patch create --author Me --description "Starting out" --then-apply
Created and applied patch rLbZ6RjMol8_wV0tW2dnMapcaNVJB25A9uWFXixDU6c=
$ echo "Second line" >> quilt_file.txt
$ ql patch create --author Me --description "Working hard"
Created patch xGRnP1j1o9FdJPPJoD6OM4Pxj3qgyN2hKG_0qg54t38=
# Notice that we haven't applied the second patch, so the file in the repository
# only has the first patch applied. Now let's edit the file on disk so that
# it consists of "First line" followed by "Alternate second line":
$ echo "First line" > quilt_file.txt
$ echo "Alternate second line" >> quilt_file.txt
$ ql patch create --author Me --description "Working differently" --then-apply
Created and applied patch y-lgpjY30n5STzqtrMOEkvBM_WUWy0Yji91y9KTzptc=
# And finally, we apply the patch that added "Second line"
$ ql patch apply xGRnP1j1o9FdJPPJoD6OM4Pxj3qgyN2hKG_0qg54t38=
Applied:
xGRnP1j1o9FdJPPJoD6OM4Pxj3qgyN2hKG_0qg54t38=
现在,那个长命令列表的效果是创建了一个包含“第一行”后跟“第二行”或“替代第二行”,但两个可能的第二行之间没有指定顺序的graggle。特别是,结果不是一个文件,因为它包含的行不是线性排序的。如果您尝试渲染文件,它将不会工作
$ ql render
Error: Couldn't render a file, because the data isn't ordered
有两个重要的命令可以帮助您解决冲突。第一个是检查它,通过渲染一个图
$ ql graph
这将创建一个“dot”文件,可以使用graphviz渲染
$ dot -o out.pdf -Tpdf out.dot
现在您可以通过查看out.pdf
来看到您的非文件格式的graggle的可视化。
一旦您了解了情况,您就可以使用Quilt的内置交互式graggle解决器来解决您的冲突
$ ql resolve --author Me
这个交互式实用工具将引导您通过将无序的graggle转换为完全排序的文件的过程。在上述示例中,这意味着决定“第二行”应该在“替代第二行”之前还是之后。 (在某个时候,可能是在遥远的未来,我希望创建一个关于ql resolve
用户界面的全面文档。但现在,希望它是可探索的。无论如何,您可以在右上角看到所有当前活动的键绑定。)
ql resolve
完成后,将生成一个补丁,然后您可以应用该补丁来解决冲突
$ ql resolve --author Me
# do the interactive thing...
Created patch SfxSwnA2POPHzL4eNNHku7t4Lyl5xW7Ge9pRXr5hV60=
$ ql patch apply SfxSwnA2POPHzL4eNNHku7t4Lyl5xW7Ge9pRXr5hV60=
Applied:
SfxSwnA2POPHzL4eNNHku7t4Lyl5xW7Ge9pRXr5hV60=
$ ql render
Successfully wrote file 'quilt_file.txt'
依赖项
~7–16MB
~200K SLoC