Git 工作流 - 更改分支和缓慢的重新编译



我在一个大型的Scala项目上工作,我们使用Git进行版本控制。我的工作流程是在我自己的分支中处理新功能,并在需要时进行切换。代码的各种版本都在各自的分支中。都非常标准。

如果我必须修复某个版本的代码中的错误,我将切换到正确的分支,修复错误,提交然后切换回我原来的位置。

问题是,尽管 git 在我到达那里后立即切换到另一个分支,但我必须重新编译代码。这需要几分钟。然后修复错误,切换回我自己的分支并再次重新编译,这需要几分钟的时间。它似乎违背了 Git 如此之快的目的。

还有其他人遇到过这种情况吗?有没有办法解决它。我敢肯定这不是 Scala 特有的问题(尽管 Scala 在编译方面非常慢)。

更新 3+ 年后

在过去的几年里,我一直在使用@djs答案(git-new-workdir)。这对我来说效果很好。我有一个主目录和其他几个目录(如生产、下一个版本等),当我需要在那里工作时,我会切换到这些目录。开销很小,这意味着您可以快速切换到生产、测试某些内容,然后切换回您正在处理的内容。

更新 7+ 年后

看起来git-worktree是git-new-workdir的替代品。要使用:

cd ~/git/my-repo
git worktree add ~/git/my-linked-repo

假设你不想改变你的构建过程(基于哈希而不是时间戳),你可能想看看 git source 的 contrib 目录中的 git-new-workdir 脚本。与克隆建议一样,您将获得多个工作副本,但您将获得一个包含多个工作副本的存储库,而不是两个独立的存储库。因此,本地存储库之间没有推拉。

它是一个shell脚本,只能在类似Unix的系统上运行,但这个概念可以在现代版本的Windows上复制。

假设您的构建系统对依赖项并不过分热心(也许它认为它需要重建,而实际上并非如此),解决此问题的主要方法是克隆您的存储库:

git clone my-repo my-repo2

然后,您可以在额外的克隆中工作,并从它推送回主克隆。(您应该只推送到未签出的分支,但这就是这里的重点。如果需要,您还可以拉取甚至获取和重置或分支 -f。

这也不会真正占用很多空间;Git 硬链接存储库中的对象以进行本地克隆,因此额外的空间只是额外的签出副本。

您可以尝试通过覆盖 outputDirectoryName 来为不同的分支使用不同的目标目录。也许拿起 git 分支名称并将输出目录设置为 target- <branch> ;尽管这意味着每个新分支都从头开始。

你可以通过使用 [sbt][1] 或"fast scala compiler"来大幅缩短 scala 编译时间。两者都允许将编译器保留在内存中,从而大大缩短了编译时间。

每个分支使用一个目录可以避免如此多的重新编译。但是,Mercurial更好地支持了该工作流程。

最新更新