在 git 中有没有办法在主分支中有一个文件夹,其中包含一个文件夹的所有以前版本?

is there a way in git to have a folder in the main branch which has all previous versions of a folder?

我正在研究一个计算模型,并 运行使用 ssh 在大学机器上运行它。它将数据输出为文本文件的文件夹,我想将它们与代码一起整齐地存储在 git 上,以避免我自己或其他任何人不得不再次 运行 几个小时才能获得相同的代码一些要处理的数据。

理想情况下,我希望将所有这些输出文件夹链接到生成它们的代码,以便轻松跟踪对每个 运行 所做的更改,但同时将它们全部放入主分支上的一个文件夹。

我能想到的最接近的事情是拥有一个线性工作流,其中在每个提交中都有一个输出数据文件夹和生成它的代码,确保提交中只存在一个测试输出。

所以,我想技术问题可能是,有没有办法在主分支中有一个文件夹,其中包含一个文件夹的所有先前提交?任何意见是极大的赞赏。我附上了一张图表,希望它能帮助澄清我的问题。

Diagram of what I want vs traditional linear workflow

Ideally, I would like to have all these output folders linked to the code that has generated them so it is easy to track the changes made to each run, but at the same time have them all in one folder on the main branch.

将每个 运行 放入以与当前版本相关联的方式命名的子文件夹中。

您可以使用提交 ID,例如 91e645c1a8a2ff1edc788066ef02f349f959da20 就是 output/91e645c1a8a2ff1edc788066ef02f349f959da20/。但是 git checkout 91e645c1a8a2ff1edc788066ef02f349f959da20 将在添加关联数据之前检查提交。用户需要寻找具有关联数据的后续提交。

改为使用发布标签。与版本 v1.2.3 相关的数据进入 output/v1.2.3/。将发布标签放在添加输出的提交上。然后 git checkout v1.2.3 将给出代码及其数据。

这些是唯一的,因此支持并行 运行s,并可追溯到使用了哪个版本。


将其提交到与代码相同的存储库中存在问题。 Git 克隆会下载完整的历史记录,所有这些历史数据 运行 可能会变得相当大并使存储库大小膨胀。

一个选择是拥有一个单独的可选数据存储库,用户可以根据需要下载该存储库。这样也避免了commit后commit的数据来的问题。

另一种是使用Git Large File Storage aka git-lfs。这使您可以将大量数据提交到存储库,同时将其透明地存储在云中。这让用户可以根据需要下载数据,而不是一次性下载所有数据。

不要压缩数据。 Git 会为您做到这一点。提交压缩数据会妨碍 Git 高效存储数据的能力。

如果您的代码在 code 中并且其输出数据在 code/data

中,您可以很容易地提取文件夹的所有历史版本
for commit in `git rev-list @~ -- code`; do
        git read-tree -u --prefix=$commit/code $commit:code
done

如果您不希望此提交中的结果跟进,例如

q8='????????'; git reset -- $q8$q8$q8$q8$q8

让名字更漂亮取决于你,而不是前缀中的 $commit 你可以 $((1000+n++))

我认为您提出的线性流程没有任何问题,因为很容易回顾 Git 中的历史。但是为了得到你想要的,我会在生成输出文件夹的脚本中处理它。只需使用日期时间和生成它的提交 ID(或者可能是每个提交 ID 的前 10 个字符)来命名这些输出文件夹。以下是一些可能的文件夹名称的示例:

Output-2021.05.28.170000-60110b27c8
Output-2021.05.28.180000-4dd529672c 
Output-2021.05.28.190000-1e577efbd1 
Output-2021.05.28.200000-37a048959d 

您可以使用多种不同的方式来获取脚本中的当前提交。一种方式是:

git rev-parse HEAD

使用以这种方式命名的文件夹,您可以轻松直观地看到生成输出的顺序,还可以轻松找到特定提交 ID 的输出文件夹。