今天想到用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 ubuntu-zh@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-zh