哪种版本控制系统能够保留文件时间戳?

9
我有一组文件,代表一个“项目”(txt、cfg、手动编辑的二进制文件、脚本等),我想在仓库中管理它们。我想将仓库和服务器(如果需要)放在我的家用Windows机器上,并能够远程和本地访问。
我已经设置了VisualSVN服务器和TortiseSVN客户端,一切都工作得很完美,除了一个主要问题:文件时间戳。当我将文件添加到仓库时,SVN会抹掉最后修改日期,并将其更改为提交日期。
我有一些文件的日期跨越了过去4年,保留这些时间戳对我很重要。我已经搜索过了,但没有找到解决这个问题的方法(即使似乎有很多其他人也要求同样的行为)。
所以我的问题是,是否有一个免费的版本控制系统可以捕捉原始文件时间戳并满足我的其他一般使用条件?我浏览了GIT,但似乎它不支持,而且我不确定CVS。谢谢任何和所有的帮助,
罗布

我不知道有没有,但如果这个信息很重要的话,你能否捕捉它并将该信息记录在源代码控制下的单独文件中? - Preet Sangha
你想在再次检出代码库时重新创建文件的时间戳吗? - Emil Sit
“swiping” 的意思是在 SVN 中,“真正”的最后修改日期被删除,而使用添加到仓库时由 SVN 确定的日期。 - Jared Farrish
如果您考虑为一组现有文件创建新的存储库,那么这将更有意义。如果您有来自2006年的文件,并且今天创建了一个SVN存储库,一旦将它们添加到存储库中,实际修改日期就会丢失。在检出时,它们将具有今天的时间戳。现在,如果我先创建了我的存储库,并在创建文件时添加了文件,那么就不会有问题。 - Rob
1
这真的不应该是必要的。您可以随时查看版本控制系统中文件的版本历史记录,以查看上次更改的时间。 - Marnen Laibow-Koser
8个回答

4

有一个扩展程序可用于Mercurial,可以自动保存文件时间戳。我已经试用过它,并且似乎运作良好。为了让它正常工作,你必须按照以下步骤进行:

  1. Download and install the extension.

  2. Initialize the repository where you want to preserve timestamps, add the files, but don't commit yet.

  3. Generate the timestamps file. I think you have to do this before you commit the file, but I haven't tried it both ways to be sure.

    hg timestamp_mod -s
    
  4. Do the initial commit to store the files in the repository with their proper timestamps.


3
真正保留每个文件的时间戳并不是一种可扩展的方法。我应该知道,唯一做到这一点的中央版本控制系统(CVCS)是...ClearCase!(请参见checkin -ptime选项)。而且它非常慢 :) 此外,正如manojlds 提到的那样,有一个反对Git这个想法的讨论线程
仍然有一项研究,针对SVN,用于保留时间戳:
使用版本控制审计跟踪构建,作者为Alec Clews,在github/svnbuilding中提供了示例。
还有一项类似的研究,位于github/gitbuilding
在这两种情况下,都是关于记录信息到单独的文件中,即使那也不是用来恢复日期和时间...

因此,如果您需要这些信息:

a/ 最好应用于您正在放入VCS(特别是免费的或任何DVCS)的所有文件
b/ 您可以使用Git:

  • 提交你的代码
  • 然后,对于相关的文件,使用 git notes 添加时间戳信息(它能够在任何提交之上添加任何类型的元数据,而不会改变 SHA1 值)

3

这可能不是很有用,但RCS可以做到这一点。

在检入文件时,ci -d将检入日期和时间设置为工作文件上次修改的时间。

在检出文件时,co -M将新的工作文件的修改时间设置为检索修订版的日期。注意:co(1)手册中说:

谨慎使用此选项;它可能会使make(1)混乱。

当然,RCS可能缺少您需要的许多其他功能,例如远程访问。


谢谢您。RCS 对我来说仍然解决了很多用例。它仍然是一个优秀的工具,在某些情况下,没有分布式版本控制系统可以替代它。 - gsl

2

对于版本控制系统来说,这是一个不好的想法,虽然可能有一些有效的用例 - 但它们将非常模糊且与软件无关。 所有版本控制系统都会跟踪此元数据,您的构建脚本可以查询它,然后返回文件的早期日期。

出于好奇,您为什么要这样做? 我认为阐述您面临的问题并寻求解决方案将为您带来更好的结果,而不是询问如何实现您所掌握的唯一解决方案。


3
文件的修改日期通常是非常有用的信息。当浏览一个目录时,尤其是查看最近被访问的文件,可以帮助我们快速获取所需信息。如果版本控制系统删除了这些信息,很多文件系统工具就会变得不太实用。 - radven
1
但是版本控制系统并不会清除这个上下文:它存储在版本控制系统存储的文件历史记录中。只需查看文件的版本日志即可。 - Marnen Laibow-Koser

1
CVS可以做到这一点。您需要使用cvs import -d ...将文件初始添加。之后,初始检出将创建具有原始时间戳的文件。任何类型的后续更新都会更改工作副本中的时间戳,使其与make或类似工具不混淆。只有初始检出才能获得原始时间。我非常喜欢这种行为,因为它允许您准确记录历史记录。
我目前正在寻找如何在git中实现这一点,但似乎无法做到。

1

我不确定这是否是您想要的,但以下内容使用提交时间。如果您希望在首次提交时保留时间戳,除了可能将其添加到svn属性之外,我看不到其他方法。

您可以将此添加到svn配置中,它应该使用提交时间:

[miscellany]
use-commit-times = yes

当时间戳改为早期日期时,可能会导致一些问题/混淆,因此在使用时要知道后果。

DVCS(分布式版本控制系统)如Git中的情况更糟。 Linus在有关时间戳的线程中回复:

抱歉。如果您不明白将日期戳设置回会使简单的“make”错误编译您的源代码树是错误的,我不知道您谈论的“错误”的定义是什么。它是错误的。这很愚蠢。而且实现起来完全不可行。

http://kerneltrap.org/mailarchive/git/2007/3/1/240167


1
是的,我之前看过这个答案。不幸的是,它并不是我要找的。我需要一种方法来保留文件最初检入时的时间戳。也就是说,如果我想将一个在2006年最后修改的文件添加到存储库中,我希望在检出它时(通常作为整个子目录),它仍然显示为2006年。我可以理解这会给使用Make的软件项目带来问题的观点,但我认为单个可执行软件项目并不是VCS的唯一用例。 - Rob

0

我找到了一个解决方法

感谢大家的建议。我已经找到了一个解决方法,可以让我继续使用当前的SVN设置。我只需归档我想要保留原始日期的现有文件和文件夹。存档本身在第一次提交时日期会更改为当前日期,但是当扩展存档中的文件时,它们保留其原始日期。然后,如果需要更新它们,我会从存档中删除它们,并直接将它们添加到仓库中。

这有点不正规,但对我来说有效。我认为如果SVN能够自动捕获时间戳并在客户端中提供选项以获取并修改检出时的时间戳,那就太好了。显然,这不会是默认行为,但我认为拥有该选项没有任何害处。


-1

在TortoiseSVN中,这可以保留原始时间戳。 创建新项目并首次检出后: a)使用像TotalCommander这样的工具手动设置/校正时间戳,或者更好地 b)将所有带有原始时间戳的文件从原来的位置复制/替换到TortoiseSVN检出的工作副本中。替换所有文件。现在它们再次具有原始时间戳。TortoiseSVN检测到文件没有更改并将其保持不变。

注意: 仅适用于个人/单用户用例。 如果您检出文件,则TortoiseSVN将再次使用提交或当前时间戳。 但只要在单用户用例中使用SVN进行签入,就没问题了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接