跟踪git中的某些文件,但只能跟踪一个本地副本

时间:2019-02-23 13:04:11

标签: git

我有一个正在更改/正在开发的程序,该程序会为我需要保留的论文生成一些结果,这些结果随着程序的变化而不断变化。这些结果可能会很大,并且由于各种原因我不想将其推送到远程设备(不想混入git lfs和文件托管,不想强制合作者在克隆上下载它,可能会发生冲突)与合作者的本地结果一起使用,不想永久膨胀历史记录大小等)。请注意,这些结果是1.不确定的,并且需要花费很长时间才能生成,因此这不仅仅是“您是否可以重新运行代码?”的问题

虽然我显然可以做到

mkdir ../results/
cp -r results ../results/results-some-description

我想让git跟踪这些文件具有一些优点:

  • 它将我提交的结果与生成它们的特定代码窗口联系起来。我可以通过放入提交(例如自述文件或其他元数据)来手动跟踪此信息,但是将其签入要容易得多。
  • 当我生成结果的某些版本时,它赋予了git log的强大功能,可以轻松查看事物的状态。
  • 我只需要保留一个可见的副本,就不必拥有一个包含十几个目录的巨大文件夹,我需要grep来查找需要的状态(更不用说交叉引用提交等了)。 / li>

我考虑了几种方法,但由于各种原因将它们丢弃:

1。创建一个纯本地存储库,在适当的提交处添加远程作为某种子模块或子树

每次我生成结果时,这感觉好像步骤太多(尽管可能是一组可编写脚本的步骤),而且如果我忘记了一个步骤,那会有些脆弱。我觉得如果要执行此操作,最好将它们备份在单个文件夹中。

2。创建一个我从不推送包含结果文件的本地分支;准备提交新结果时合并工作分支

在我真正考虑之前,我认为这是有希望的,并且最容易用以下命令进行说明:

> mkdir tmp && cd tmp
> git init
> touch foo
> git add foo
> git commit -m "Add foo"
> touch result
> git checkout -b results
> git add result
> git commit -m "Add results"
> git checkout foo
> echo "new stuff" >> results
> git checkout results
error: The following untracked working tree files would be overwritten by checkout:
        results
Please move or remove them before you switch branches.
Aborting

哦,嗯,嗯...是的,哎呀。他们甚至都无法藏起来,因为它们没有在工作分支中被追踪。


我真正想要的是某种(兼容Github的)钩子,它基本上说:“完全忽略此目录子树,就好像它根本不在历史中,而只是在向/从远程推/拉时。 ”坦白说,当它仅触碰到该文件集中的文件时,它会推送诡异的幻像空提交,或者如果协作者提交有冲突的文件,则可笑地炸毁,这甚至没有什么大不了的。但是,如果我真的想要(例如,快照一个代码+结果窗口并在将来共享)的标签,那么如果我能够将文件推送到该树中,那将是理想的选择。 / p>

有什么办法可以管理这样的事情?

1 个答案:

答案 0 :(得分:0)

我能想象到的最佳解决方案与您的本地分支解决方案相似,但有一个很小的变化:每次您要提交结果时,创建一个results.descriptionresults.serial-number分支,在其中提交您的提交结果。如您所述,这些分支永远不会推送到服务器。

这解决了与未跟踪文件的冲突:您无需检出results.1来创建results.2,因此Git不会意识到它或标记任何冲突。

#update and commit software 
run-experiment > results
git checkout -b results.1
git add results
git commit -m "results and maybe comments about it"
git checkout master
# update and commit software
run-experiment > results
git checkout -b results.2
git add results
git commit -m "results and maybe comments about it"
git checkout master

要枚举沙箱中的所有结果,请执行以下操作:

git branch | grep results

要查看一些旧结果:

git checkout results.1

要查看一些旧结果而不检查分支:

git show results.1:results

现在,我在您的问题中注意到您正在做echo "new stuff" >> results,建议您希望结果文件是累积的。我的解决方案没有做到这一点,但是这是一种检查所有结果的方式,就像文件是累积的一样:

for branch in `git branch | grep results`; do
   echo ======================== $branch
   git show $branch:results
done | less