reStructuredText的日期问题

使用 sphinx+reStructuredText 创建 html 时,可以在rst文件末尾添加自动时间记录,格式是这样:

.. |date| date::
.. |time| date:: %H:%M

*最近一次更新:* |date| |time|

然后执行命令make html后,在从rst文件生成的html页面的末尾就会显示下面的内容:

最近一次更新: 2022-12-26 10:46

上面的日期其实是html文件的创建日期。

我的问题是,如果我把项目整体移动到其它位置(任意位置),然后在新位置执行命令 make html 后,即使rst文件没有修改,make html命令执行后也会重新创建新的html文件,且文件中末尾的日期也会更新到当前日期,而不是保留之前的日期。(我希望保留,因为rst没有修改或更新)

默认情况下,如果项目整体没有被移动过位置,且rst文件没有被修改或更新,则重复执行命令 make html 时,不会更新html文件。这保证了时间记录的真实性。

我需要的效果是,只要rst文件没有修改,再执行make html命令就不要更新html文件,这样能保证创建日期是真实的。即使我把项目整体移动到了其它目录。

我的推测是,因为项目整体移动到了新的目录,rst文件就有了新的“修改”时间,这个时间被makt html命令认为是rst文件被修改,所以,makt html命令更新了html文件。

不知道这个推测是不是正确。

我应该如何解决这个问题?是不是在移动项目时,需要添加一些与时间有关的参数什么的?

不应该。移动文件变更的是 ctime 而非 mtime。如果你的文件 mtime 也变了,说明移动的过程中出现了问题。

我查了下移动前和移动后的文件属性,果然如你所说,移动文件修改的不是mtime,另外,birth time也被修改,应该是创建时间。

我试了把移动后的文件的时间改成和移动前的文件一致,还是不行。然后我测试了一下,发现在项目文件夹中有一个_build/doctree目录,这个目录中的文件如果时间发生变化,make html命令也会重新更新html文件。也就是说,make html命令是否更新html,除了与rst文件的时间有关,还与doctree目录中文件的时间有关。

看来还是比较复杂。

要是有办法在让移动后的文件的时间参数与移动前一致就好了。

同一设备(同设备号)上移动,应该只有被移动的目录的时间戳发生变化。不同的话,目前只有 atime 和 mtime 能被重置。

1 个赞

看来我的这个想法行不通。
我研究下sphinx看有没有方法。

今天想到,我可以把rst文件放到sphinxdoc/sphinx的docker image中,这样以后跨设备移动rst文件时就变成了移动docker image文件,而移动docker image文件理论上不会导致docker内部的rst文件的时间属性发生变化。

上面的想法暂时推测可行,这样比搞一个虚拟机在尺寸上要小很多,才320MB。不过需要解决的一个问题是,后续编写/创建rst文件是在docker image外部进行的,需要把新的rst文件从docker image外部拷贝到内部。这个拷贝过程,只是用cp命令应该不行,需要使用rsync之类的工具,以保证只更新rst文件变化的部分(这是关键点)。所以,现在要解决后续经常性地用rsync向docker image内部拷贝rst文件的问题。

不清楚这个docker image由外向内的rsync文件问题有没有什么简单的办法。

如果用git clone的话,能够解决不同磁盘/设备间拷贝时产生的时间(atime ctime mtime)问题么?

如果用git clone能做到文件在不同设备间移动而atime ctime mtime不变化,那就简单了。