避免使用git和make重新编译

owa*_*agh 22 c c++ git makefile git-pull

我在git中有两个开发分支,我经常需要在两者之间进行更改.然而,真正令人沮丧的是,每次我在git中更改分支时,整个项目都会重建,因为某些文件的文件系统时间戳会发生变化.

Ofc,makefile被配置为将项目构建到两个不同的构建目录中.

有没有办法解决?编译是一个非常漫长而耗时的过程......

编辑: - 这是一个稍微更详细的问题解释...说我有一个头文件Basic.h,它包含在许多其他文件中.分支1和分支2之间的Basic.h不同.

现在假设我已将分支1编译为build_branch1,将分支2编译为build_branch2.说我目前检查了分支2.现在我签出分支1并更改File1.cpp并重新编译.理想情况下,因为自上次编译它以来只有File1.cpp发生了变化,所以这是唯一应该重新编译的文件.

但是,由于Basic.h由于结帐而更改了时间戳,因此将重新编译包含Basic.h的所有文件.我想避免这种情况.

Ser*_* K. 15

Git只更改分支之间更新的文件.但是,如果您的编译器执行完全重建,即使任何单个文件已更改,您也可以始终克隆并将不同的分支签出到不同的目录中.这就像:

/your-repo-name.branch1
/your-repo-name.branch2
Run Code Online (Sandbox Code Playgroud)

这需要额外的磁盘空间,但比在庞大的仓库中切换发散分支要方便得多.

  • 您还可以使用`--shared`来保存大部分磁盘空间:选择其中一个克隆作为"主"存储,然后使用`git clone --shared`返回主存储克隆.只是不要删除"主"仓库中的任何分支(或只删除未共享的分支),那样你就会安全. (7认同)
  • 此外,您可以使用 `git worktree` 代替完整的克隆。这样你至少会共享 .git。 (2认同)

Kaz*_*Kaz 10

另一个部分答案:编译器缓存.

当您切换回原始分支并重建时,尽管依赖项表示Basic.h必须重建大量依赖的文件,但可以从编译器缓存中提取目标文件.

ccache(http://ccache.samba.org/)仍然需要做一些相当昂贵的工作(处理预处理的翻译单元,因为整个翻译单元使用了散列键),但它比编译便宜很多.

在某些情况下,ccache可以在面对不影响它的更改时消除编译,就像一些空白更改一样.例如,如果更改依赖文件(标头或源)中的注释,则不会使缓存的对象文件失效.

所以即使你做了一个git pull并且接受了一个Basic.h你以前从未见过的新变化,它也会有所帮助.