1

假设我是在一个庞大的代码项目中使用 git 的众多开发人员之一,该项目的编译时间非常长

现在,我个人的日常更改通常是有限的,并且代码库是相当模块化的,这意味着就我个人的工作而言,从头开始编译是只需支付一次的代价。之后,我只能重新编译我修改过的模块。

另一方面,我经常不得不修复(至少两个)分支中的错误,这些错误反映了与我工作的分支完全不同的代码库状态。这两个分支确实是整个开发团队的工作成果,并且经常重写或添加整个模块。在推送错误修复之前编译所有内容是强制性的

我的第一种方法是每次需要修复错误时从我的开发分支切换,然后清理,修复错误,从头开始重新编译,推送,切换回原始分支,再次清理,重新编译 -这样做的延迟是无法容忍的

然后我开始在我的机器上保留三个单独的代码库签出。这解决了“昂贵的重新编译”问题(我在每个分支中的更改都是增量的),但它提出了一个问题“我现在在开发什么?” 回答起来更复杂(因为它取决于当前目录),并且它使这三个副本的同步变得复杂(它将我必须执行的所有例程 // 命令乘以三pushremote updatepull

一个更简单的解决方案是能够在每次结帐“离开”分支时保存目录的状态(未跟踪,我在其中生成编译文件),并每次调用该目录的状态(如果存在)我“进入”(结帐)一个分支

  • 是否有 git 命令可以帮助我实现这种行为?
  • 如果没有,是否有工具可以让我这样做?
  • 如果没有,git 是否提供结帐钩子可以帮助我编写此行为的脚本?
4

3 回答 3

1

我建议使用 stash,它们非常接近您的需要。

--include-untracked在最新版本的 git 中,您可以使用该选项存储未跟踪的文件。您还可以向您的 stash 发送消息并召回它们,这样您就可以在签出分支后检查必须应用哪个 stash。

#before leaving branch
git stash save --include-untracked "compiled stuff for my_branch"
git checkout another_branch
#what stash contains compiled stuff for another_branch?
git stash list
git stash pop stash@{n}

您可以编写一些脚本以使事情更实用...

于 2012-06-12T10:00:50.127 回答
0

恐怕我没有确切的答案,因为我不必处理像你这样的案例,但无论如何我想提供可能的提示:Git 能够使用几个不同的工作树“连接”到单个存储库(例如在这个答案中阅读更多内容),因此您可以只使用多个工作树和一个存储库,而不是维护多个签出。

我应该补充一点,我更喜欢@CharlesB 的解决方案(在概念上),但另一方面我会衡量:据说git stash会在将文件转换为 blob 以存储在存储中时有效地复制文件,这将 a) 暂时使那些巨大的空间占用的空间增加一倍文件系统上的文件;b) 对 Git 的对象数据库大小有未知的长期影响。

于 2012-06-12T10:09:08.127 回答
0

我的 2 美分:将编译目录作为子模块跟踪- 但由于我尚未使用此 git 功能,我只能将您指向文档页面...

于 2012-06-12T11:47:14.727 回答