Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用git签出和make/ninja-like工具有效地结合使用_Git_Makefile_Ninja - Fatal编程技术网

使用git签出和make/ninja-like工具有效地结合使用

使用git签出和make/ninja-like工具有效地结合使用,git,makefile,ninja,Git,Makefile,Ninja,当我使用git reposin C/C++时,我会定期切换分支,有时还想使用make构建特定的分支或标记。当我切换回当前主要关注的分支时,运行make将导致非常长的构建时间。就构建系统而言,是否有一些方法可以配置git,或者使用一些git签出特定的参数来恢复存储库的状态?建造系统忍者在这方面更好吗 如果没有办法,为什么?如果有一种方法可以做到这一点,为什么默认情况下不实现它?主要问题是为什么构建工具需要更长的时间。如果是因为分支之间不同的文件需要重建,那么构建工具或Git应该如何防止这种情况?如

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


如果没有办法,为什么?如果有一种方法可以做到这一点,为什么默认情况下不实现它?

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

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

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


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

将查看工作树,从未听说过它们。乍一看,我怀疑它们是解决方案,因为它们似乎更接近git隐藏。我想我的问题可能更基本,因为我在这方面还是个新手,它与藏匿毫无共同之处。它只允许您为不同的分支拥有多个工作树。工作树是您实际签出的工作文件,所以要切换分支,您只需转到另一个文件系统位置,在那里您构建的文件应该仍然是最新的。在我做出任何不明智的评论之前,您将签出它。。。比如说这听起来像克隆:暗示你想说这听起来像克隆,这听起来更像克隆而不是隐藏,但不是真的。克隆将克隆具有完整历史记录的完整存储库。git worktree只是创建了一个新目录,其中包含来自不同分支的签出文件,在同一个本地存储库上工作。因此,如果操作正确:一个裸repo有0个工作树,由clone生成的香草味repo有1个工作树,并且您可以添加任意数量的工作树,只要您的硬盘和/或sanity允许您使用git-worktree即可,根据回购协议的状态,就构建系统而言。。。我猜这将是所有源文件、完成的二进制文件和中间对象文件的时间戳。我特意把那些文件放到.gitignore中编辑:二进制文件和对象文件。。。这是可行的吗:将git跟踪放在那些文件上?正如你可能猜到的那样,我对使用git还很陌生。@MarkAdelsberger这是不可能的,因为想象一下你构建了一个新的分支,然后切换到某个旧的分支。如果保留时间戳,则所有输入文件都将比输出文件旧,因此不可能进行基于时间戳的最新检查。因此,实际文件中的更改需要将时间戳更新到现在。如果情况如您所述,那么切换到更好的构建工具(如Gradle)将是一个不依赖时间戳,而是依赖于输入和输出文件校验和的解决方案;如果git跟踪这些,它将导致问题。无论如何,它并不能真正解决这个问题,因为时间戳仍然不能显示源文件和二进制文件之间的关系。问题是,一个新签出的工作树应该重新构建。所以我要重申,IMO最好的解决方案是有一个单独的工作树来浏览其他分支。@StefanKarlsson不,那不会起作用,而且你永远不应该把内置的工件放进VCS,因为时间戳没有被保留,也不能被保留。看起来git工作树真的值得一看。看来这可能是正确的答案。我们会得到通知,然后回去接受这个答案@吸血鬼的回答是几分钟前。。。