【问题标题】:Using git checkout with make/ninja-like tools efficiently有效地使用带有 make/ninja 类工具的 git checkout
【发布时间】:2017-01-25 13:28:07
【问题描述】:

当我使用我的 git-repos(在 C/C++ 中)时,我会定期切换分支,有时想要构建一个特定的分支或标签(使用 make)。当我切换回当前主要关注的分支时,运行 make 将导致构建时间非常长。就构建系统(例如 make)而言,是否有某种方法可以配置 git,或者使用一些 git-checkout 特定参数来恢复存储库的状态?构建系统忍者在这方面做得更好吗?

如果没有办法做到这一点,那为什么?如果有办法,为什么不默认实现呢?

【问题讨论】:

    标签: git makefile ninja


    【解决方案1】:

    主要问题是为什么您的构建工具需要更长的时间。如果是因为分支之间不同的文件需要重新构建,构建工具或者Git应该如何防止呢?如果这是您的问题,您可以使用 git worktree 为不同的分支添加多个工作树。

    【讨论】:

    • 将检查工作树,但从未听说过。乍一看怀疑它们是解决方案,因为它们似乎更接近 git stash。我认为我的问题可能更基本,因为我对此还是很陌生
    • 它与 stash 没有一点共同点。它只是允许您为不同的分支拥有多个工作树。 (工作树是您实际签出的工作文件)所以要切换分支,您只需转到另一个文件系统位置,您的构建文件应该仍然是最新的
    • 会在我做更多不明智的 cmets 之前先检查一下......例如说“这听起来像克隆”:)
    • 暗示你想说“这听起来像克隆”,这听起来更像是克隆而不是存储,但不是真的。克隆克隆具有完整历史记录的完整存储库。 git worktree 只是创建一个新目录,其中包含来自不同分支的签出文件,在同一个本地存储库上工作。
    • 所以,如果做对了:一个裸仓库有 0 个工作树,一个香草味的仓库(由克隆产生)有 1 个工作树,你可以添加任意数量的工作树(尽可能多硬盘驱动器和/或理智允许您)使用 git-worktree。
    【解决方案2】:

    我不完全确定您所说的“就构建系统而言,存储库的状态”是什么意思;我假设您要说的是您更改为另一个分支,然后无需构建切换回 - 但这样做会更改源文件上的时间戳,因此 make 认为它必须重建所有内容...

    IMO 最简单的解决方案是使用两棵工作树——一棵保留在“通常处于焦点的分支”上,另一棵用于浏览其他分支。这可以通过克隆 repo 两次或使用git worktree 命令来完成。

    我不知道 git 有什么方法可以将源时间戳设置为切换分支之前的状态。为什么不?因为以一种通常有用而又不会引起问题的方式实现它可能是不可能的。

    【讨论】:

    • 嗯,关于 repo 的状态,就构建系统而言……我想这将是所有源文件、完成的二进制文件和中间目标文件的时间戳。我有目的地将这些文件(编辑:二进制文件和目标文件)放在 .gitignore 中......这是否可行:对这些文件进行 git 跟踪?正如你可能猜到的,我对使用 git 很陌生。
    • @MarkAdelsberger 这不可能的,因为想象你建立一个新的分支,然后切换到一些旧的分支。如果保留时间戳,则所有输入文件都将比输出文件旧,因此基于时间戳的最新检查将是不可能的。为此,实际文件的更改需要将时间戳更新为now。如果情况像您描述的那样,切换到像 Gradle 这样更好的构建工具将是一个不依赖于时间戳,而是依赖于输入和输出文件的校验和的解决方案。
    • 将完成的二进制文件和中间文件放在 .gitignore 中是正确的;如果 git 跟踪那些它会导致问题。无论如何,它并不能真正解决问题,因为时间戳仍然不会显示源文件和二进制文件之间的关系。问题是,一个新签出的工作树真的应该重新重建。所以我要重申,最好的解决方案 IMO 是有一个单独的工作树来浏览其他分支。
    • @StefanKarlsson 不,这行不通,除了您应该永远将构建的工件放入 VCS 中,它无论如何都不会起作用,因为时间戳不会保留并且无法保留。
    • 似乎 git 工作树真的值得一试。似乎这可能是正确的答案。将得到通知并返回(可能)接受该答案。 @Vampire 的回答是几分钟前...
    猜你喜欢
    • 2022-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2016-09-04
    • 2018-04-22
    • 1970-01-01
    • 2015-05-14
    相关资源
    最近更新 更多