git:如何检索特定日期的所有文件

15

我相信这是可以做到的(在ClearCase中会非常简单)。


3
注意:在分布式系统(如Git)中,记录的日期和时间可能不是100%可靠或准确的,因为它们可能记录在许多机器上。希望大多数机器与“真实时间”相差不大,但网络贡献者中可能存在奇怪的异常值。 - Chris Johnsen
3个回答

15

使用git log来确定适合切换的版本,例如:

git log --since='2010-04-01' --until='2010-04-02'
这将显示2010年4月1日的所有提交记录,因此只需要选择对应您想要文件的时间点的提交记录,并注意其提交 ID。然后只需使用 git checkout COMMIT-ID 切换工作区到该提交记录。这将使您的工作区(HEAD)与当前分支分离,使用 git checkout master 返回原来的分支。

我目前遇到的问题是 git checkout master@{<date>} 无法工作(因为所选日期不在 reflog 中)。您提供的解决方案可以解决这个问题,但这是唯一的解决方案吗?使用两个命令之间需要进行一些解析似乎有点笨拙。 - exhuma
我猜,类似这样的东西可以工作:git checkout $(git log -n 1 --until='2017-04-02:00:00:00' --pretty='%H'),但看起来仍然有点hacky。 - exhuma

7

在像Git这样的分布式版本控制系统中,不要忘记文件时间戳没有被记录
只有提交时间戳存在,您可以轻松地从特定日期检出提交。

git checkout master@{1 month 2 weeks 3 days 1 hour 1 second ago}

(注:这样的检出会给你一个分离的HEAD
在ClearCase中,如果您将“保留文件时间”选项设置为true,则很容易做到这一点。(如果没有,您实际上记录了每个文件的检入时间,这有点像Git提交时间戳,除了每个文件)。

好的,但是还有一个额外的复杂情况。我的代码库是远程代码库的克隆。当我给出一个日期时,它会显示日志仅限于我的代码库克隆时的日期。我该如何利用远程代码库的历史记录? - c-urchin
@steve:使用远程refspec而不是本地refspec。请参见http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html#_specifying_revisions:`git checkout /refs/remotes/master@{...}`。 - VonC
致命错误:'/refs/remote/master@{2010-06-04}'在存储库之外。 - c-urchin
@steve:是的,我还没有正确的语法。仍在寻找。 - VonC
ref@{time} 语法使用引用日志。 引用日志是本地的。 这就是为什么 Steve 的日志仅追溯到克隆它的日期。 - Chris Johnsen

3
首先,您需要获取标识提交的字符串:
git rev-list -n 1 --before="2009-07-27 13:37" origin/master

它会打印字符串(例如“XXXX”),将其复制并执行此命令:

git checkout XXXX

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