27

我在一个大型 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
4

4 回答 4

6

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

git clone my-repo my-repo2

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

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

于 2011-05-19T13:41:45.930 回答
6

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

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

于 2011-05-20T06:36:45.770 回答
4

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

于 2011-05-19T14:10:59.183 回答
2

您可以通过使用 [sbt][1] 或“快速 scala 编译器”显着提高 scala 编译时间。两者都允许将编译器保留在内存中,这极大地缩短了编译时间。

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

于 2011-05-19T13:40:38.120 回答