2

我使用 DVC(数据版本控制)进行项目。假设我做了很多本地提交。像这样的东西:

# make changes for experiment 1
dvc add my_data_file
git add my_data_file.dvc
git commit -m "Experiment 1"

# make changes for experiment 2
# which change both code and data
dvc add my_data_file
git add my_data_file.dvc
git commit -m "Experiment 2"

# make changes for experiment 3
# which change both code and data
dvc add my_data_file
git add my_data_file.dvc
git commit -m "Experiment 3"

# Finally I'm done
# push changes:
dvc push
git push

但是有一个问题:dvc push只会从实验 3 中推送数据。有没有办法从所有本地提交中推送数据(即从与远程分支分歧的第一个提交开始)?

目前我看到两个选项:

  1. 标记每个提交并使用dvc push -T
  2. 在“经验 3”提交之后git checkout commit-hash && dvc push,对所有尚未推送到远程的本地提交执行。

这两个选项看起来都很麻烦且容易出错。有没有更好的方法呢?

4

2 回答 2

3

为了减少出错的可能性,您可以使用HEAD~1引用之前的提交而不是使用确切的提交哈希。

如果您使用的是 Bash,则可以使用 for 循环来遍历最后 3 次提交和dvc push内容。

for x in {1..3}; do git checkout HEAD~1 && dvc push; done

记得git checkout回到你的工作分支(即git checkout master


在多次本地提交后回答您的评论(“dvc push”):

有没有办法在 dvc install 命令之后禁用挂钩?

运行时dvc install,它会在目录下创建三个文件.git/hooks

.git/hooks
├── post-checkout
├── pre-commit
└── pre-push

要禁用它们,您可以删除这些文件(即rm .git/hooks/post-checkout)。

顺便说一句,我编辑了 DVC 的文档以包含有关此的更多信息

于 2019-06-30T12:59:27.453 回答
2

@NShiny,有一张相关的票:

支持跨不同提交的 push/pull/metrics/gc 等

请给它投票,以便我们知道如何优先考虑它。

作为一种解决方法,我建议运行dvc install. 它安装了一个pre-pushGIt 钩子并dvc push自动运行:

Git pre-push hook executes dvc push before git push to upload files and directories under DVC control to remote.

这意味着,尽管您需要git push在每个git commit:(

于 2019-06-29T21:10:49.417 回答