我有一个正在更改/正在开发的程序,该程序会为我需要保留的论文生成一些结果,这些结果随着程序的变化而不断变化。这些结果可能会很大,并且由于各种原因我不想将其推送到远程设备(不想混入git lfs和文件托管,不想强制合作者在克隆上下载它,可能会发生冲突)与合作者的本地结果一起使用,不想永久膨胀历史记录大小等)。请注意,这些结果是1.不确定的,并且需要花费很长时间才能生成,因此这不仅仅是“您是否可以重新运行代码?”的问题
虽然我显然可以做到
mkdir ../results/
cp -r results ../results/results-some-description
我想让git跟踪这些文件具有一些优点:
git log
的强大功能,可以轻松查看事物的状态。我考虑了几种方法,但由于各种原因将它们丢弃:
每次我生成结果时,这感觉好像步骤太多(尽管可能是一组可编写脚本的步骤),而且如果我忘记了一个步骤,那会有些脆弱。我觉得如果要执行此操作,最好将它们备份在单个文件夹中。
在我真正考虑之前,我认为这是有希望的,并且最容易用以下命令进行说明:
> 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>
有什么办法可以管理这样的事情?
答案 0 :(得分:0)
我能想象到的最佳解决方案与您的本地分支解决方案相似,但有一个很小的变化:每次您要提交结果时,创建一个results.description
或results.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