【问题标题】:is there a way in git to have a folder in the main branch which has all previous versions of a folder?git中有没有办法在主分支中有一个文件夹,其中包含所有以前版本的文件夹?
【发布时间】:2021-08-17 01:09:57
【问题描述】:

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

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

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

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

Diagram of what I want vs traditional linear workflow

【问题讨论】:

  • 根据您的图表,您应该在每次更改代码时更改输出位置。例如,在第一次提交中,输出到OriginalOutput,在第二次提交中,您将输出到Change1Output,在这种情况下,OriginalOutput 完全保持不变,仍将驻留在您的存储库中。这将使您的存储库变得不必要地大,因为每次更改都会有一个新文件夹,但这正是您所要求的。
  • 感谢您的回复!这是有道理的,但是有没有一种好方法来组织如何获取特定输出的代码?我想我可以在每次提交时为输出文件和标签制定一个命名约定以添加到自述文件中,但这最终会成为很多标签。我认为大小不会有太大问题,输出文件不应该很大。

标签: git github version-control modeling


【解决方案1】:

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

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

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

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

这些是独一无二的,因此支持并行运行,并追溯使用了哪个构建。


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

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

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

不要压缩数据。 Git 会为你做这件事。提交压缩数据会妨碍 Git 有效存储数据的能力。

【讨论】:

  • 谢谢! lfs 似乎是一个不错的方法,但事实证明我的数据比我最初预期的要大得多,而且似乎 github 上的 lfs 带宽非常有限。我的大学提供无限的谷歌驱动器存储,所以我想写一个脚本,从谷歌驱动器链接下载数据。
【解决方案2】:

如果您的代码在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++))

【讨论】:

    【解决方案3】:

    我认为您提出的线性流程没有任何问题,因为在 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 的输出文件夹。

    【讨论】:

      猜你喜欢
      • 2019-07-14
      • 2021-01-25
      • 2013-11-22
      • 1970-01-01
      • 2022-01-06
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多