git - 跟踪 git 中的一些文件,但只在一个本地副本中
问题描述
我有一个更改/开发程序,它会为我需要保留的论文生成一些结果,因为它们会随着程序的变化而变化。这些结果可能相当大,并且由于各种原因我不想推送到远程(不想使用 git lfs 和文件托管,不想强迫合作者在克隆上下载它,可能会发生冲突与合作者的本地结果,不想永久膨胀历史大小等)。请注意,这些结果是 1. 不确定性和 2. 需要很长时间才能生成,所以这不仅仅是“你不能重新运行代码吗?”的问题。
虽然我显然可以做
mkdir ../results/
cp -r results ../results/results-some-description
让 git 跟踪这些文件有一些我想要的优点:
- 它将我提交的结果与生成它们的特定代码窗口联系起来。我可以通过将提交放入例如自述文件或其他元数据中来手动跟踪此信息,但是将其签入要容易得多。
- 当我生成某个版本的结果时,它使我
git log
能够轻松查看事物的状态。 - 我只需要保留一个可见的副本,并且不必有一个包含十几个目录的巨大文件夹,我需要通过 grep 来查找我需要的状态(更不用说交叉引用提交等)。
我考虑了几种方法,但出于各种原因将它们丢弃:
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 兼容的)钩子,它基本上说“完全忽略这个目录子树,就好像它根本不在历史中一样,而只是在向/从远程推/拉时。” 老实说,当唯一触及的文件是该集中的文件时,如果它推动幽灵般的幻影空提交,或者如果协作者提交冲突的文件,它甚至会滑稽地爆炸,这甚至都不是什么大问题。不过,如果我真的想要(例如,快照代码+结果和标签的窗口以在将来共享),我能够在该树中推送文件,那将是理想的。
有没有办法管理这样的事情?
解决方案
我能想象到的最佳解决方案类似于您的本地分支解决方案,但有一个小的变化:每次您想要提交结果时,创建一个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
推荐阅读
- java - Transactional Producer vs Just Idempotent Producer Java (Exception OutOfOrderSequenceException)
- anaconda - Anaconda 返回错误“系统找不到指定的文件”
- r - 如果 ==0,则仅替换指定列中的值
- html - 如何将填充放在图像边框之外?
- react-native - 更改状态以呈现不同的远程图像uri时如何停止图像闪烁?
- reactjs - Vega 图表仅在使用 React 时在悬停时呈现
- windows - DirectML、Windows Insider Preview 和 DX SDK 崩溃
- python - pymysql 警告:1300 无效的 utf8 字符串:'FFD8FF' 将图像上传到数据库时
- java - 使用 Graphics 在 JPanel 上绘制图像网格,然后多次将该 JPanel 添加到 JFrame 而不每次都重新绘制图像?
- c# - VS Code 中的“无法找到或打开 PDB 文件”