今天想到用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

回复