首页 > 解决方案 > 跟踪 git 中的一些文件,但只在一个本地副本中

问题描述

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

虽然我显然可以做

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

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

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

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 兼容的)钩子,它基本上说“完全忽略这个目录子树,就好像它根本不在历史中一样,而只是在向/从远程推/拉时。” 老实说,当唯一触及的文件是该集中的文件时,如果它推动幽灵般的幻影空提交,或者如果协作者提交冲突的文件,它甚至会滑稽地爆炸,这甚至都不是什么大问题。不过,如果我真的想要(例如,快照代码+结果和标签的窗口以在将来共享),我能够在该树中推送文件,那将是理想的。

有没有办法管理这样的事情?

标签: git

解决方案


我能想象到的最佳解决方案类似于您的本地分支解决方案,但有一个小的变化:每次您想要提交结果时,创建一个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

推荐阅读