2011-05-19 187 views
18

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

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

问题是,虽然git是即时切换到另一个分支一旦我在那里,我必须重新编译代码。这需要几分钟的时间。然后修复该错误,切换回我自己的分支并进行另一次重新编译,这需要几分钟的时间。这似乎打败了Git如此之快的目的。

有没有其他人遇到过这个?有没有办法解决它。我确定它不是一个Scala特定的问题(尽管Scala在编译时的速度很慢)。

更新3年后

我一直在使用@djs在过去的几年回答(GIT-新WORKDIR)。这对我来说非常有用。我有一个主目录和其他几个目录(如生产,下一个版本等),当我需要在那里工作时,我会切换到这个目录。开销很小,这意味着您可以快速转换说,制作,测试某些内容,然后切换回正在进行的工作。

回答

4

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

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

+0

我已经使用了几天,现在它工作得很好。谢谢。 – Dave 2011-05-23 08:13:34

+1

顺便说一句,还有一个git-new-workdir的Windows端口:https://github.com/joero74/git-new-workdir – sleske 2012-04-23 13:39:14

+0

......显然git-new-workdir也可以在Cygwin下运行。 – sleske 2012-05-04 19:43:33

2

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

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

+0

你并不需要每个分支的目录。两个通常就够了;一个是为了你的主要工作,另一个是在各处转换。 – Cascabel 2011-05-19 13:42:26

+0

另外,即使可以加快编译速度,在大型项目中这仍然很容易出现问题,即使用快速机器上的所有CPU进行并行构建仍需要几分钟的时间。 – Cascabel 2011-05-19 13:43:30

+0

@Jefromi:的确,是的。我倾向于在两个和'n'目录之间使用,其中'n'是分支的数量。 – jmg 2011-05-19 13:43:50

6

假设你的编译系统并不过分热心的有关相关性(也许它认为需要时,它实际上并没有重建),解决这方面的主要方式就是克隆你的资料库:

git clone my-repo my-repo2 

然后,你可以在你的额外克隆中工作,并从它推回到你的主克隆。 (你应该只推送到没有检出的分支,但这里就是全部要点,如果你想要的话,你也可以拉,甚至取和重置或分支-f)。

这样做不会真的也增加了很多空间; Git将存储库中的对象硬链接到本地​​克隆,因此额外的空间只是额外的签出副本。

+0

它是否也在Windows上硬链接? – 2011-05-19 16:48:07

+0

@Daniel:我相信他们会这样做,但我从未尝试过。我相信这里有一个关于其他问题的答案或评论,其中提到它... – Cascabel 2011-05-19 17:44:30

3

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

+0

我很喜欢这个想法。我会用sbt和intellij的想法尝试一下,看看它们是否合适。 – Dave 2011-05-19 16:41:23