从每个git提交中获取文件

时间:2016-08-29 19:05:22

标签: git github commit

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

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

这可以用git吗?我知道我可以使用github网站查看文件以及发生了哪些变化,但问题是有超过160k的提交。

3 个答案:

答案 0 :(得分:1)

获得存储库*的本地工作副本后,您可以通过签出该提交从任何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>

答案 1 :(得分:1)

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

https://git-scm.com/

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

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

完成这些步骤之后,您就可以在@larsks解释的不同提交中移动。

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

List all commits for a specific file

答案 2 :(得分:1)

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

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

git clone <repo-url>

您从项目的GitHub页面获得<repo-url>(选中“克隆或下载”按钮)。

然后你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检查get log以查找可以获得的其他文件或提交属性。