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)
这需要额外的磁盘空间,但比在庞大的仓库中切换发散分支要方便得多.
Kaz*_*Kaz 10
另一个部分答案:编译器缓存.
当您切换回原始分支并重建时,尽管依赖项表示Basic.h必须重建大量依赖的文件,但可以从编译器缓存中提取目标文件.
ccache(http://ccache.samba.org/)仍然需要做一些相当昂贵的工作(处理预处理的翻译单元,因为整个翻译单元使用了散列键),但它比编译便宜很多.
在某些情况下,ccache可以在面对不影响它的更改时消除编译,就像一些空白更改一样.例如,如果更改依赖文件(标头或源)中的注释,则不会使缓存的对象文件失效.
所以即使你做了一个git pull并且接受了一个Basic.h你以前从未见过的新变化,它也会有所帮助.