我正在寻找一个解决方案,以避免在 git 中从一个分支移动到另一个分支时进行大量重新编译。 为不同的分支使用不同的文件夹是解决方案,但它只会在我的工作流程中造成困惑。
我能想到的最佳解决方案是将 git 分支作为项目设置中使用的选项 $ 变量传递,这样我就可以将“输出目录”设置为类似
..\bin\$(branch)\$(Configuration)$(Platform)\
类似于中间目录。
是否可以配置这样的东西?
编辑: 问题是,即使每个分支的输出/中间目录不同(或者在更改分支时从存档中移动),预编译的头文件总是会重新编译,因此项目也会重新编译。
最佳答案
方案一
我认为 OP 使用 $(branch)
的方式很酷。但是在 Visual Studio
中无法使用分支名称的动态值创建用户宏。而如果我们在VS启动后的pre-build
事件中加入,Visual Studio
是不可能重新加载环境变量的,除非重启。看起来最直接的方法就是在 @ConfusedSushi
提到的 git
存储库中的 post-checkout
Hook 中执行此操作。
我刚刚测试了该解决方案,它运行良好。详情如下。
创建git hook post-checkout
(即文件名为post-checkout
,并放入GIT_DIR/.git/hooks
. 它会调用一个批处理文件 set-branch.bat
。
#!/bin/bash
if [ "$3" -eq "1" ]; then
cmd.exe /c "`pwd`/.git/hooks/set-branch.bat"
fi
批处理文件set-branch.bat
如下。并将其放入 GIT_DIR/.git/hooks
。
@echo off
for /f %%i in ('git rev-parse --abbrev-ref HEAD') do setx branch %%i
然后像 OP 那样设置输出目录
:
..\bin\$(branch)\$(Configuration)$(Platform)\
现在,每次通过 git check
更改分支时,都会设置一个环境变量 branch
。并且您需要重新启动 Visual Studio
以获取环境变量值。它只是按你的需要工作。
解决方案2
由于 OP 的评论,另一种解决方案是让 visual studio 使用相同的文件夹,但在 post-checkout Hook 中移动 Output/intermediate 目录。
只需使用以下脚本创建一个 git hook post-checkout
。并且将我在Test/Test/Debug
下的测试文件夹替换为您自己的真实文件夹。可以是绝对目录,也可以是与git仓库相关的目录。构建文件夹如果不是当前分支,将添加分支名
作为后缀。
#!/bin/bash
build_folder=Test/Test/Debug
if [ "$3" -eq "1" ]; then
oldref=$(git reflog | awk 'NR==1{ print $6; exit }')
newref=$(git rev-parse --abbrev-ref HEAD)
if [ "$oldref" != "$newref" ]; then
if [ -d "$build_folder-$oldref" ]; then
rm -rf "$build_folder-$oldref"
echo "Deleted $build_folder-$oldref"
fi
if [ -d "$build_folder" ]; then
mv "$build_folder" "$build_folder-$oldref"
echo "Moved $build_folder to $build_folder-$oldref"
fi
if [ -d "$build_folder-$newref" ]; then
mv "$build_folder-$newref" "$build_folder"
echo "Moved $build_folder-$newref to $build_folder"
fi
fi
fi
[更新] 对于已编辑的问题,由于预编译头在切换分支时总是会发生变化,因此项目总是会重新编译。实际上有一个解决方案,但有点危险。
VS
检测源文件的修改时间
来决定是否需要重新编译。所以我们能做的就是改变修改时间
来欺骗VS
。我们可以使用命令 touch
来完成。
但很难决定哪个时间合适。为了实用,我们可以选择一个不会因为切换分支而改变,而且相对稳定的文件,将预编译头的修改时间
设置为与选择的文件相同。我们也可以在 post-checkout
Hook 中完成。
touch -r some_stable_chosen_file precompiled_header
但我们应该记住它是不安全的,因为它也可能会忽略对预编译头文件的真正更改。我们必须手动处理它。
关于git - 如何在 visual studio 中设置输出和中间目录以依赖于当前的 git 分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25834054/