【问题标题】:Version Control System with timestamps comparison带有时间戳比较的版本控制系统
【发布时间】:2015-08-07 15:06:14
【问题描述】:

几个月来我一直在寻找这样的软件,但找不到。 所以,情况如下:

  1. 我有一个包含非常旧的源代码文件的文件夹。 (我的操作系统是 Windows)
  2. 每个文件都有它的创建日期和修改日期(2004-2006 年)。
  3. 此文件夹位于 OneDrive 服务器上。

现在,问题是几个月前,由于一些愚蠢的原因,一些文件的修改日期被更改为最近的(2015 年)。内容保持不变。问题是,目前我不知道这些文件最后一次更改的时间。知道这一点对我很重要。 好吧,那些都没了。问题是 - 我如何确保其余文件不会更改其日期?我正在寻找一种版本/修订控制系统,它不仅会查找文件内容的更改,还会查找文件属性的更改。而当我突然注意到属性的变化时,我会恢复它们。

我知道我可以归档(备份)整个目录。但这不是一个舒适的选择 - 每次我想检查文件时都解包并每次添加一些可能的新文件 - 会很无聊。

我知道每次更改/添加某些内容时,我都可以制作目录快照(使用 ExamDiff Pro)。但这也非常耗时且不方便。它也不允许我查看以前的文件版本。

因此,简而言之:保留所有以前版本的文件的工具(尽可能多地,可能与 cmets 关于谁进行了更改)考虑文件属性:新创建日期 - 表示修改的文件; hidden 属性 - 表示修改过的文件等。

希望看到这篇文章的你能理解我的处境。

最好的问候, 叶凡

【问题讨论】:

  • Git 真正用于您实际处理的代码。推送和拉取到存储库。它不会以您想要的方式存储日期。如果它真的只是您需要的日期和文件名,那么我只会截屏。但也许你的文件结构很大。你总是可以制作一个巨大的 Excel 表
  • @JoeLloyd,感谢您的回复。我需要文件名、文件日期、文件属性和文件内容。就像 ExamDiff 一样,但有一个持续的比较。
  • 只是好奇:如果您可以在文件本身实际更改时访问信息,为什么元日期对您如此重要?
  • @poke,抱歉回复晚了。也不知道会有人回答。我需要日期,因为对我来说,知道我上次处理每个文件的时间很重要。几月几日。例如,一些文件在我的生日时被修复 =)
  • 嗯,因为这在某种程度上是关于归档文件(及其修改日期),您可以做的是创建旧提交(回溯到修改日期),以便跟踪那些旧日期。这不会使文件保持该修改日期,但您将能够使用提交历史来查找修改。对于每个新更改,您只需要记住尽快提交这些更改,以便跟踪新的修改日期。

标签: git date version-control timestamp revision


【解决方案1】:

正如 cmets 中所建议的,由于您最感兴趣的是归档旧文件、保留其修改日期,您可以做的是使用 Git 来跟踪更改,然后为每个文件回溯与其匹配的提交修改日期。这样,即使 Git 既不会跟踪文件修改日期,也不会确保签出时的文件修改日期与提交日期匹配,您也可以保留修改日期并在以后通过检查修订历史来查找它。

所以本质上,您需要做的是找到所有文件,按修改日期对它们进行排序,然后为每个文件创建一个以文件修改日期作为其提交日期的提交。

一旦完成,您只需要对未来的更改进行一些纪律,记住尽快提交新的更改,以便提交时间自动跟踪其“修改日期”。


为了创建回溯存档,您可以使用我快速提出的以下 PowerShell 脚本。它完全按照我上面的解释:它在文件夹中递归查找所有文件,按修改日期对文件进行排序,然后为每个文件创建一个回溯到该文件修改日期的新提交。

Param([string] $Folder)
Write-Host 'Backdating files in folder' $Folder -ForegroundColor Green

Push-Location $Folder
git init
git commit --allow-empty -m 'Initialize repository'

Write-Host 'Looking for files: ' -NoNewLine -ForegroundColor Blue
$files = Get-ChildItem * -Recurse | ? { !$_.PSIsContainer } | sort LastWriteTime
Write-Host $files.Length -NoNewLine -ForegroundColor Yellow
Write-Host ' files found' -ForegroundColor Blue

Write-Host 'Committing files backdated to their last write time' -ForegroundColor Blue
$files | % {
    git add $_.FullName
    $date = $_.LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss')
    $env:GIT_COMMITTER_DATE = $env:GIT_AUTHOR_DATE = $date
    git commit -m ('Backdating: ' + $date)
}

$env:GIT_COMMITTER_DATE = $env:GIT_AUTHOR_DATE = $null
Pop-Location
Write-Host 'Done.' -ForegroundColor Green

只需将该脚本保存到文件git-backdate.ps1(您也可以download it here)并将其放在某个地方。

然后,打开 Windows PowerShell 控制台,然后运行脚本并将您想要转换为存档 Git 目录的目录作为 -Folder 参数传递。

例如,我将脚本放在我的桌面上,并在那里还有一个文件夹gittest。所以我做了以下事情:

cd ~\Desktop
.\git-backdate.ps1 -Folder .\gittest

然后,脚本应该自动从中创建一个存储库,并为每个文件创建提交。您可以cd 进入其中并通过gitk 查看完整的历史记录。

当然,您需要安装 Git for Windows 才能运行它。

【讨论】:

    【解决方案2】:

    你怎么知道那些文件没有被改变然后又被改回来?你没有。你不能。

    不能期望任何文件系统在其中保留原始时间戳。他们无法告诉您现在的内容是否是以前的内容,他们只能告诉您现在的内容是什么以及它可能上次更改的时间。除此之外的任何东西都很少需要并且变得昂贵。这是一个仪式的情况,每个人最终都必须了解文件系统 mtime 是辅助,可能需要检查这个标记,而不是一成不变的事实。

    要查看 GNU/anything 上的当前时间戳和哈希码,

    join -t$'\t' -j2 -o1.1,2.1,2.2 \
            <(find -type f -printf $'%tT\t%P\n'|sort -t$'\t'  -k2) \
            <(find -type f -exec sha256sum {} +|sed $'s,  \./,\t,'|sort -t$'\t' -k2)
    

    然后您可以将其与您的记录进行比较,看看是什么。如果不进行校验和,您将无法确定,这就是为什么仅依赖时间戳会带来痛苦。

    find printf 格式使用%tT,全拼时间戳和%P,没有(此处为常量./)前缀的路径;有一些指定的选项卡作为字段分隔符,因为最方便的选项卡因突发奇想和情况而异,只是没有严格的约定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 2023-03-28
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      相关资源
      最近更新 更多