今天想到用gi让我们追踪我们机器上的文件系统,
可以做很多事。比如,极致到极点,基于它实现一个
自定制的软件包管理器。。。
大概想法,希望大家来头脑风暴。拍砖,吐槽,也欢迎。
********************* 分隔线 ***************************
在根目录下初始化一个版本库,追踪整个文件目录树
$ git init
然后,添加想跟踪的目录到版本库中。
$git add XXX
(注意,由于使用很久的系统可能很大了,这一步操作第一次
会非常久!不过使用git的目录文件忽略功能,可以减少
一些不必要的追踪,如/tmp , /var/log, /var/spool , 等等,
如果是定位于软件安装追踪的目的,/etc,
/usr{,/local}/{include,share,lib}等,必须追踪。这一步需要
一定的实践探索后总结出来。
然后,就是git 大显神通的时候了.
1. 每安装一个软件,相关被动过的,新增的,删除的目录或
文件可以形成一次提交。提交信息可以由我们自定制,弹
性很大。想要删除时,git 可以轻松删除一个提交。这样,
被删除的文件在你的文件系统就不见了,不过它们在版本
库里还以对象的形式存在着。如果没有引用它们,git的垃圾
处理机制会在3个月后把它们删除掉,那时就真什么也不见了。
还有,当软件经历多次更新后上述操作只是删除一次提交,
并无法删除整个软件包。所以看第2点。
2. 形成各个软件包的更新时间历史。方法就是:然后,想要独立
追踪的软件可以各自成立一个特性分支。约定一个最初提交
作为起点,比如开始追踪时的在master分支上的提交(v1.0),
当然最好是系统初装完后便开始追踪。然后利用cherry-pick把
历次跟同一个软件包相关的更新操作拣选出来,用rebase变基
操作变基到v1.0上,这样就成立了一个以此软件包命名的topic
分支。此后,关于此软件包的操作都可以在这个topic分支上进行。
那master分支呢?可以拣选topic分支上的提交,在master上也生
成一次提交,这样master分支扮演记录整个系统演变历史的角色;
也可不动,那理想状态下就是master一直处于v1.0的状态。然后
呢,如果某次系统出问题,可以以一条命令:
git reset --hard v1.0^{}
把系统变为初装时的状态。相当于重装系统了?!!这也是推荐
系统初装后就启动版本追踪机制的原因。
3. 第2步还有个作用,我们似乎是可以在这个分支上针对v1.0
用diff生成一个差异文件(这个差异文件其实包罗万有,有配置纯文本
文件,有可执行代码,有库文件。。。)。然后,我们把这个差异文件
打包存起来。在你上一步重置(不是重装!)系统到初始版本后,
应用上去,这样,你相当于恢复了你的软件,包括配置。
4.且慢,第3步有问题,那就是依赖的问题。比如对软件包P.
当第一次安装时生成提交Cp1, 然后又历经多次别的软件提交...blah...
然后到第二次更新时生成提交Cp2.并且,Cp2这次更新增加了许多特性,
可能依赖了某个第一次提交不需要的包Q,它提交于Cq. 如图:
master分支历史:
Cp1 -> ...-> ... -> Cq-> ... -> Cp2
P分支历史:
Cp1 -> Cp2
问题出在,Cq引入的变更跟Cp*无关,也就是当我们拣选Cp1, Cp2到
p分支时,git 并无法知道它们会依赖于Cq这次提交(它只检查"语法"上
的依赖,却无法检查"语义"上的依赖)。这样,当你如第3步在重置
系统后应用p分支历史时,会出现依赖缺失问题。
我想到的解决方法是生成graphviz(制图软件)可接受的 dot 文件(graphviz
的输入文件)的模式,来记录依赖。然后,我们拣选Cq提交,把它与
Cq2全并为一个提交,这样,Cp2'是一个语法与语义上都完整的提交。
5. 如4各软件都有一张依赖图,这样整个系统合起来,就是一棵依赖树了。
每次我们变更其中的节点,graphviz都可以自动生成一张(可视的)依赖图。
这样我们是否可利用它来做软件包管理?!
初略想法:
A.每个特性分支包含自己完全的依赖信息(依赖的软件包集成在自己的提交
中了)。这样,当某个软件包删除掉,它删除的只是自己的依赖副本,不会
影响哵的软件。(有人会问是否会造成大量磁盘浪费?不会的,提交实质上
只是类似帐面上的记录,实际的东西存在objects对象库中。所以只有对某
个软件包的对象的最后一个引用也删除了,那些对象才会在默认的3个月后
被git当垃圾处理掉)
B. 上述graphviz依赖树大家可以共享,这样,在初装的时候,只要下载这些依赖
树文件,利用现有的工具如makedepend, 我们可以搞定依赖解决的问题。
6.我们可以在诸如github这种托管网站上设一个我们自己系统的远程版本库,然后,让在单位或家里的电脑与其同步,这样我们理论上可以复制两个完全一样的系统。。这对于很多有特定的系统,软件使用习惯的人来说,是个福音。
以上是突然的YY,,,大家请尽情找bug, 提建议,吐槽,拍砖。
--
Regards,
Zhan Jianyu
--
ubuntu-zh mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-zh