从每个 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 工具:
然后您必须在 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
。
我有大约 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 工具:
然后您必须在 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
。