带有时间戳比较的版本控制系统

时间:2015-08-07 15:06:14

标签: git date version-control timestamp revision

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

  1. 我有一个包含非常旧的源代码文件的文件夹。 (我的操作系统是Windows)
  2. 每个文件都有它的创建日期和修改日期(2004-2006年)。
  3. 此文件夹位于OneDrive服务器上。
  4. 现在,问题是几个月前,由于一些愚蠢的原因,一些文件的修改日期改为最近的(2015年)。内容保持不变。问题是,目前我还不知道这些文件最后一次更改的时间。知道这对我很重要。 好的,那些都没了。问题是 - 如何确保其余文件不会更改日期?我正在寻找一种版本/版本控制系统,它不仅可以查看文件内容的更改,还可以查看其属性的更改。当我突然注意到属性的变化时,我会将它们还原。

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

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

    因此,简而言之:考虑到文件属性,保留所有以前版本的文件的工具(尽可能地评论谁做出更改):新创建日期 - 表示修改后的文件;隐藏属性 - 表示修改后的文件等。

    我希望你读过这篇文章,了解我的情况。

    祝你好运, 耶夫亨

2 个答案:

答案 0 :(得分:0)

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

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

完成后,您只需要对将来的更改进行一些约束,以便您尽快提交新的更改,以便在提交时自动跟踪其“修改日期”。 / p>

为了创建一个回溯存档,您可以使用我快速提出的以下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才能运行它。

答案 1 :(得分:0)

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

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

要查看 GNU/任何事物的当前时间戳和哈希码,

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,没有(此处为常量 ./)前缀的路径;有一些指定的制表符作为字段分隔符,因为最方便的制表符因突发事件和情况而异,只是没有严格的约定。