从每个 git 提交中获取文件

Get files from each git commit

我有大约 160k 个提交,每个提交有 3 个文件正在更新(一直使用 github 作为网站),我正在寻找一种获取文件的方法,以便我可以将内容放入一个真正的数据库。

我的问题是如何从每次提交中获取(下载?)更新的文件,将它们保存到名称后附加 timestamp/commitSHA 的文件夹中以避免命名冲突。

git可以吗?我知道我可以使用 github 站点查看文件和更改内容,但问题是有超过 160k 次提交。

一旦您有了存储库的本地工作副本*,您就可以从任何 git 提交中获取文件,只需检出该提交,如:

git checkout 1e6c98511d9154bfdc49a31fd26229953df0bd70

因此,要从项目历史记录中的每个提交中获取文件,您只需要 (a) 为您的项目生成一个提交列表,然后 (b) 遍历该列表,检查每个提交并处理文件。

git rev-list HEAD 命令将生成当前分支上所有提交的列表(从最新到最旧)。如果您想按正向顺序处理这些文件,可以将其通过管道传输到 tac 以反转列表,例如

for rev in $(git rev-list HEAD | tac); do
  git checkout $rev
  ...do something here...
done

* 来自 运行 git clone <repourl>

假设您是 git 的新手,您必须从这里安装 git 工具:

https://git-scm.com/

然后您必须在 git 控制台 运行 中克隆您的存储库:

git clone https://github.com/username/repositoryname.git

完成这些步骤后,您将能够按照@larsks 的说明进行不同的提交。

列出特定文件的每次提交:

List all commits for a specific file

这不是最优雅的解决方案,但应该可行。

首先,您必须使用以下方法获取存储库的本地副本:

git clone <repo-url>

您从项目的 GitHub 页面获取 <repo-url>(选中 "Clone or download" 按钮)。

然后你 cd 进入本地仓库和 运行 一些类似的东西:

for rev in $(git log --format=%H); do
    git checkout $rev -- file1
    cp file1 ../history/file1-$rev
done

确保事先创建 history 目录。为您需要获取的每个文件复制循环内的两行。

运行 git reset --hard 最后让存储库保持原始状态。

如果您还需要文件的时间戳,您可以使用 git log --format=%ct file1 获取它。将 cp 命令替换为:

ts=$(git log --format=%ct $rev file1)
cp file1 ../history/file1-$rev-$ts

检查documentation for other file or commit properties you can get using get log